面试心得与总结-——答案整理_4 持续更新

31. 反射的作用与原理。
1:反射的作用:反射可以增加代码的灵活性,通过反射可以使系统和插件解耦,如Spring就是使用反射来实现控制反转的(IOC)。
2:什么是反射: java运行时阶段的程度对自身的一种审查的能力;
3:反射机制的原理:反射就是java语言在运行时可以通过获取类的class对象,并通过class对象获取到当前对象的方法(包括私有方法),属性,以及构造方法,运行时class对象相当于外部程序访问内存中该类的一道门,通过该到门能获取到运行时该类的各种东西。


32. 泛型常用特点,List<String>能否转为List<Object>。
1:泛型的种类:泛型类、泛型接口、泛型方法。Java泛型被引入的好处是安全简单。增加代码的复用性。(泛型解决了方法的重载问题:public void write(Integer i, Integer[] ia);public void write(Double  d, Double[] da); 的范型版本为public <T> void write(T t, T[] ta))
2:为什么要引用泛型:在java1.5之前,如果一个方法的参数中要支持任意类型,则一般用Object类来作为参数的类型,因此在运行的时候就要进行类型转换。这种自动转换类型容易出现当编译的时候不会报错,而运行的时候回报错,这是一个安全隐患(我还没有遇到过,可能是这种情况,就是返回对象是Object,此时要将 Object转换成具体的类型时这是容易出现错误的)。注意:在java中父类是可以转换成子类的而且不报错,调用的时候出错运行时才能检查到(亲测Sunzi sun=(Sunzi)new Child();可以,编译通过)
3:泛型的好处是在编译的时候检查类型安全(类型检查是保证类型转换是可以正确转换的(object编译的时候就没有检查到父类转子类)),并且所有的强制转换都是自动和隐式的,提高代码的重用率。
4:泛型信息在编译的时候会被自动擦除的,也就是在字节码中没有泛型的信息,并使用其限定类型替换(无限定类型用Object),如public T fun(T t)替换成public Object fun(Object t),限定类型只的是T extend Father,则用Father替换T,List<T> 则变成List。
5:泛型主要的体现还是在类型安全的检查与限定,如List<String>,那我们就只能放入String类型的,在这儿就体现了类型检查了。
6:List<String>不能List<Object>,因为泛型并不具有继承性。只是一个限定的作用。


33. 解析XML的几种方式的原理与特点:DOM、SAX、PULL。

1:DOM是基于树的解析,DOM是把XML全部加载到内存中建立一棵树之后再进行处理。所以DOM不适合处理大型的XML【会产生内存的急剧膨胀】。这样可以随时修改xml文件内容。
2:SAX基于事件的解析,sax解析一行一行的读取xml文件开始标记的时候执行startElement方法,然后执行对应解析方法character方法,当遇到结束表示符就调用endElement方法,所以所是基于事件型解析, SAX不必把全部的xml都加载到内存中。但是SAX的缺点也很明显,它只能对文件顺序解析一遍,不支持对文件的随意存取。SAX也仅仅能够读取文件的内容,并不能修改内容。DOM可以随意修改文件树。(主要用于读取xml文件)
3:SAX 和 DOM 不是相互排斥的,记住这点很重要。您可以使用 DOM 来创建 SAX 事件流,也可以使用 SAX 来创建 DOM 树。事实上,用于创建 DOM 树的大多数解析器实际上都使用 SAX 来完成这个任务!


34. Java与C++对比。
(1)Java比C++程序可靠性更高。
(2)Java语言中没有指针的概念,
(3)Java用接口(Interface)技术取代C++程序中的多继承性;
(4)Java语言不需要程序对内存进行分配和回收。Java中自动回收内存,而c++中要调用new和delete来申请和释放内存,如果对内存分配与申请掌握不好就容易报错
(5)异常:JAVA中的异常机制用于捕获例外事件,增强系统容错能力 try{//可能产生例外的代码 }catch(exceptionType name){ //处理 } 其中exceptionType表示异常类型。而C++则没有如此方便的机制
(6)“可怕”的goto语句是c和c++的“遗物”,它是该语言技术上的合法部分,引用goto语句引起了程序结构的混乱,不易理解,goto语句子要用于无条件转移子程序和多结构分支技术。鉴于以广理由,Java不提供goto语句,它虽然指定goto作为关键字,但不支持它的使用,使程序简洁易读。


35. Java1.7与1.8新特性。

1:1.7新特性:
1:switch中可以使用字串了运用
2:List<String> tempList = new ArrayList<>(); 即泛型实例化类型自动推断
3.语法上支持集合,而不一定是数组final List<Integer> piDigits = [ 1,2,3,4,5,8 ];
4:try块可以不用finally手动关闭,直接try块中就可以关闭
5:很长的数字可读性不好,在Java 7中可以使用下划线分隔长int以及long了,如1_1 * 10 = 110,120 – 1_0 = 110
Java1.8新特性
1: Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,default double sqrt(int a) {return Math.sqrt(a);},改方法不用实现,可以自己直接通过子类调用。
2:增加了lamda表达式
3:Java 8 在包java.time下包含了一组全新的时间日期API


36. 设计模式:单例、工厂、适配器、责任链、观察者等等。

37. JNI的使用。
1:jni就是通过java本地方法可以调用其他语言的代码,能与其它语言(如C、C++)的动态库进行交互
2:jni的使用场景
1:java是一门半解释性的语言,代码很容易被别人反编译,因此可以采用jni通过c语言或者c++来实现其核心,这样还能提高一定的性能;
2:一些性能要求特别高时,可以采用汇编语言实现,通过jni调用;
3:别的语言已经实现了的功能,通过jni可以直接调用,而不用重新编写。
3:jni使用步骤:用native关键字定义本地方法,然后编译该类为class文件,用javah工具生成.h的头文件,然后用c/c++语言实现其中的.h头文件中的方法,并生成动态库(以.so结尾的文件,大多数动态库是以.dll文件结尾的)),然后提供给java使用


38:java的动态代理与静态代理
1:静态代理,这比较简单,相当于一个静态代理模式,比如要在一方法前输入一个输出helloworld方法的前面输出一句welcome,则可以用一个代理类,在输出welcome的时候回调输出helloworld的方法。缺点是当一个借口中有很多个方法需前输出welcome,则代理类中就要取实现借口中的每一个方法,然后回调,这样比较麻烦;http://kuangbaoxu.iteye.com/blog/192804
2:动态代理就是将给一个需要代理的对象关联一个调用处理器(InvokeHandler),然后通过Prox.newPoxyInstance对象创建代理对象,通过该代理对象将要代理的真实对象和InvokeHandler的对象关联起来,并将代理对象强制转换成真实对象所对应的类,然后通过该代理对象的的引用去调用方法,则会出现动态代理的情况;真实的原理就是在当通过代理对象的引用都调用的时候,会调用invokehander对象的invoke方法(个人理解:因为通过Proxy类创建代理对象的时候,会传递一个真实代理对象实现的类的接口进去,动态代理通过内部实现了该接口的所有方法,然后在每个方法中回调InvokeHander类对象的invoke方法,并不是在编译的时候采用inline的那种方法直接编译进去,因为要用到反射,所以不可能是采用内联的方法实现的)。http://www.cnblogs.com/xiaoluo501395377/p/3383130.html


Java里有很多很杂的东西,有时候需要你阅读源码,大多数可能书里面讲的不是太清楚,需要你在网上寻找答案。

推荐书籍:《java核心技术卷I》《Thinking in java》《java并发编程》《effictive java》《大话设计模式》

猜你喜欢

转载自fjding.iteye.com/blog/2319522
今日推荐