Java面试(六)

1、说出 ArrayList,Vector, LinkedList 的存储性能和特性。

2、去掉一个 Vector 集合中重复的元素

3、Collection 和 Collections 的区别。

4、Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是 equals()? 它们有何区别?

5、两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?

6、java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

7、字节流与字符流的区别

8、什么是 java 序列化,如何实现 java 序列化?或者请解释 Serializable 接口的作用。

9、描述一下 JVM 加载 class 文件的原理机制?

10、heap 和 stack 有什么区别。


1、说出 ArrayList,Vector, LinkedList 的存储性能和特性。

ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了synchronized 方法(线程安全),通常性能上较 ArrayList 差,而 LinkedList 使用双向链表实现存储, 按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

LinkedList 也是线程不安全的,LinkedList 提供了一些方法,使得 LinkedList 可以被当作堆栈和队列来使用。

2、去掉一个 Vector 集合中重复的元素。

Vector newVector = new Vector();

for(int i=0;i<vector.size();i++){
Object obj = vector.get(i);
if ( !newVector.contains(obj);newVector.add(obj);
}

还有一种简单的方式

HashSet set = new HashSet(vector);

3、Collection 和 Collections 的区别。

Collection 是集合类的上级接口,继承与他的接口主要有 Set 和 List.
Collections 是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

4、Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用还是 equals()? 它们有何区别?

Set 里的元素是不能重复的,元素重复与否是使用 equals()方法进行判断的。 equals()和方法决定引用值是否指向同一对象 equals()在类中被覆盖,为的是当两个分离的对象的内容和类型相配的话,返回真值。

5、两个对象值相同(x.equals(y) == true),但却可有不同的 hash code,这句话对不对?

对。

如果对象要保存在 HashSet 或 HashMap 中,它们的 equals 相等,那么,它们的 hashcode 值就必须相等。 如果不是要保存在 HashSet 或 HashMap,则与 hashcode 没有什么关系了,这时候 hashcode 不等是可以的,例如 arrayList 存储的对象就不用实现 hashcode,当然,我们没有理由不实现,通常都会去实现的。

6、java 中有几种类型的流?JDK 为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

字节流,字符流。字节流继承于 InputStream OutputStream,字符流继承于 InputStreamReader OutputStreamWriter。

java.io 包中还有许多其他的流,主要是为了提高性能和使用方便。

7、字节流与字符流的区别

要把一片二进制数据数据逐一输出到某个设备中,或者从某个设备中逐一读取一片二进制数据,不管输入输出设备是什么,我们要用统一的方式来完成这些操作,用一种抽象的方式进行描述,这个抽象描述方式起名为 IO 流, 对应的抽象类为 OutputStream 和 InputStream ,不同的实现类就代表不同的输入和输出设备,它们都是针对字节进行操作的。

在应用中,经常要完全是字符的一段文本输出去或读进来,用字节流可以吗?计算机中的一切最终都是二进制的字节形式存在。对于“中国”这些字符,首先要得到其对应的字节,然后将字节写入到输出流。读取时,首先读到的是字节,可是我们要把它显示为字符,我们需要将字节转换成字符。由于这样的需求很广泛,人家专门提供了字符流的包装类。 底层设备永远只接受字节数据,有时候要写字符串到底层设备,需要将字符串转成字节再进行写入。字符流是字节流的包装,字符流则是直接接受字符串,它内部将串转成字节,再写入底层设备,这为我们向 IO 设别写入或 读取字符串提供了一点点方便。
字符向字节转换时,要注意编码的问题,因为字符串转成字节数组, 其实是转成该字符的某种编码的字节形式,读取也是反之的道理。

8、什么是 java 序列化,如何实现 java 序列化?或者请解释 Serializable 接口的作用。

我们有时候将一个 java 对象变成字节流的形式传出去或者从一个字节流中恢复成一个 java 对象,例如,要将java对象存储到硬盘或者传送给网络上的其他计算机,这个过程我们可以自己写代码去把一个 java 对象变成某个格式的字节流再传输,但是,jre 本身就提供了这种支持,我们可以调用 OutputStream 的 writeObject 方法来做, 如果要让 java 帮我们做,要被传输的对象必须实现 serializable 接口,这样,javac 编译时就会进行特殊处理, 编译的类才可以被 writeObject方法操作,这就是所谓的序列化。需要被序列化的类必须实现 Serializable 接口, 该接口是一个 mini接口,其中没有需要实现的方法,implements Serializable 只是为了标注该对象是可被序列化的。

例如,在 web 开发中,如果对象被保存在了 Session 中,tomcat 在重启时要把 Session 对象序列化到硬盘,这个对象就必须实现 Serializable 接口。如果对象要经过分布式系统进行网络传输或通过 rmi 等远程调用,这就需要在网络上传输对象,被传输的对象就必须实现 Serializable 接口。

9、描述一下 JVM 加载 class 文件的原理机制?

JVM 中类的装载是由 ClassLoader 和它的子类来实现的,Java ClassLoader 是一个重要的 Java 运行时系统组件。它负责在运行时查找和装入类文件的类。

10、heap 和 stack 有什么区别。

java 的内存分为两类,一类是栈内存,一类是堆内存。

栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放, 这个栈中的变量也将随之释放。

堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用 new 创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用 final 修饰后,放在堆中,而不是栈中。



原文链接:https://zhuanlan.zhihu.com/p/347903391

posted @ 2022-05-11 23:55  独苏  阅读(25)  评论(0编辑  收藏  举报