java面试题总结(1)

1、介绍Collection框架的结构
Collection的两个主要实现类:list 、set 。
list 元素是有序的、可重复。List接口中常用类 :
Vector: 线程安全,但速度慢,已被ArrayList替代。底层数据结构是数组结构
ArrayList:线程不安全,查询速度快。 底层数据结构是数组结构
LinkedList:线程不安全。增删速度快。 底层数据结构是列表结构

set 元素是无序的、不可重复。
HashSet:线程不安全,存取速度快。依赖的是元素的hashCode方法和euqals方法。
TreeSet:线程不安全,可以对Set集合中的元素进行排序。它的排序是通过compareTo或者compare方法中的来保证元素的唯一性。元素是以二叉树的形式存放的。

说道集合,介绍一下Map。Map 是一个双列集合

  Hashtable:线程安全,速度快。底层是哈希表数据结构。是同步的。不允许null作为键,null作为值。Properties:用于配置文件的定义和操作,使用频率非常高,同时键和值都是字符串。
  HashMap:线程不安全,速度慢。底层也是哈希表数据结构。是不同步的。允许null作为键,null作为值。替代了Hashtable.
  
  |--LinkedHashMap: 可以保证HashMap集合有序。存入的顺序和取出的顺序一致。

  |--TreeMap:可以用来对Map集合中的键进行排序.

Collection 和 Collections 的区别
Collection是集合类的上级接口。
Collections是针对集合类的一个帮助类,提供了操作集合的工具方法:一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

2、集合的比较怎么实现?
实现comparable 接口 或者实现Comparator接口。

3、vector 和 ArrayList 的区别
Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的。因为它不考虑线程安全,效率会高些。
当存储进它们里面的元素的个数超过了容量时,就需要增加Vector增长原来的一倍,ArrayList增加原来的0.5倍。
4、HashMap 和 HashTable 的区别
Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。
只有HashMap可以让你将空值作为一个表的条目的key或value 。
5、什么是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接口。所以实体类最好能序列化。

6、垃圾回收的优点和原理。并考虑2种回收机制。
Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"。垃圾回收可以有效的防止内存泄露,有效的使用可以使用的内存。垃圾回收器通常是作为一个单独的低级别的线程运行,不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清楚和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。回收机制有分代复制垃圾回收和标记垃圾回收,增量垃圾回收。
7、heap和stack有什么区别。
java的内存分为两类,一类是栈内存,一类是堆内存。栈内存是指程序进入一个方法时,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束时,分配给这个方法的栈会释放,这个栈中的变量也将随之释放。
堆是与栈作用不同的内存,一般用于存放不放在当前方法栈中的那些数据,例如,使用new创建的对象都放在堆里,所以,它不会随方法的结束而消失。方法中的局部变量使用final修饰后,放在堆中,而不是栈中。

猜你喜欢

转载自blog.csdn.net/weixin_38008100/article/details/82895552