1、JAVA基础
问:“==”和 equals两者的区别?
答:“==” 是比较两个变量直接的值是否相等,比较的时候分为基本数据类型和引用类型;如果比较的是基本数据类型,则比较的是两者的值。如果比较的是引用类型,则比较的是对象的地址值是否一致。
equals()方法不能用于比较基本数据类型的对象,如果对象和自身进行比较,则equals()方法与==是一样的。对于String类 Date类 File类等 可重写equals() 方法用于比较对象的属性内容是否一致。
问:String、StringBuild和StringBuffer的区别?
答:String修饰的字符串是不可变的,是final类型的,创建和操作字符串。 StringBuild是线程不安全的,操作的是字符串变量,效率高。多线程操作字符串缓冲区下操作大量数据 StringBuffer是线程安全的。
问:常用的集合有哪些?
list、map、set集合
list、set集合的父接口的是collection,map是独立的接口。
list接口的子类实现有arraylist、linkedlist、vector
arraylist的数据结构是数组,在查询快,增删慢,线程不安全,效率高,最常用。
linkedlist的数据结构是链表,线程不安全,查询慢,增删快,效率高。
vector底层数据结构是数组,查询快,增删慢,线程安全,不常用。
map接口的实现类
HashMap:序存放,新的操作类,key不允许重复
Hahtable:无序存放,旧的操作类,key不允许重复
TreeMap:可以排序的Map集合,按集合的key排序,key不允许重复
JDK1.7和1.8 HashMap的优化有哪些?
1,7版本 hashmap的数据结构是数据+链表,实现类是entry类;
1.8版本 hashmap的数据结构是数据+链表+红黑树,当链表的长度大于8时,后面的数据结构会转为红黑树,实现类是node类。
优化:JDK 1.8 以前碰撞节点会在链表头部插入,而 JDK 1.8 开始碰撞节点会在链表尾部插入,对于扩容操作后的节点转移 JDK 1.8 以前转移前后链表顺序会倒置,而 JDK 1.8 中依然保持原序。
在插入是1.7是先判断是否扩容再插入;1.8版本是先完成插入后再判断是否扩容
hashmap默认的初始化长度是16,构造方法中 initialCapacity(初始容量)、loadFactor(默认负载因子0.75)
问:HashMap与HashTable的区别?
答:HashMap是线程不安全的,是map的一个接口,允许空值和空键,不允许键、值重复,效率比HashTable高,HashMap底层是一个Entry数组,当发生hash冲突的时候,hashmap是采用链表的方式来解决的,在对应的数组位置存放链表的头结点。(把Hashtable的contains方法去掉了,改成containsValue和containsKey)
HashTabele是线程安全的,不允许null值作为key或value值,是sychronize的,多线程访问时不需要为它的方法实现同步。( Hashtable则保留了contains,containsValue和containsKey三个方法)
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类。但二者都实现了Map接口。
Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
HashTable在不指定容量的情况下的默认容量为11,而HashMap为16。