JAVA
基础
equals与==的区别
equals:默认实现为比较两个对象的内存地址是否相同,不同的对象有不同实现,比如String中比较的是字符串是否相同 ==:对于基本数据类型,判断的是他们的值是否相等,对于其他对象是判断他们的引用地址是否相等
Java的四种引用,强弱软虚,用到的场景
- 强引用,最常用引用,GC时不会被回收
- 弱引用,当内存不足,即将发生OOM时,弱引用关联的对象才会被回收
- 软引用,GC时必被回收
- 虚引用,任何时候都可能被GC回收,相当于没有引用,被GC回收时引用者会收到一个系统通知
String、StringBuffer与StringBuilder的区别
- String:只读字符串,值一旦确定就不能修改
- StringBuffer:可修改,线程安全的。
- StringBuilder:可修改,单线程下使用,效率更高
容器框架
Collection
List :表示为一个集合接口,实现类如下
- ArrayList :基于数组实现,所以查找的效率高,删除和移动需要移动大量元素,效率低,默认大小为10,每次扩容到原来大小的1.5倍加1。
- LinkedList : 基于双向链表实现,查找需要遍历效率低,删除和移动的效率高
- Vector : 类似于ArrayList,线程安全,很少使用
Set :表示没有重复元素的集合
Map
Map : 表示一种键值对的映射关系,键唯一,值可以为空。
- HashMap : 其主要实现是一个数组,每一项是一个单链表。构建::初始容量:initialCapacity默认16,加载因子:loadFacor默认0.75 ,put(K,V)过程: 1. 传入key和value,判断key是否为null,如果为null,则调用putForNullKey,以null作为key存储到哈希表中。 2. 然后计算key的hash值,根据hash值搜索在哈希表table中的索引位置,若当前索引位置不为null, 则对该位置的Entry链表进行遍历,如果链中存在该key,则用传入的value覆盖掉旧的value,同时把旧的value返回,结束 3. 否则调用addEntry,用key-value创建一个新的节点,并把该节点插入到该索引对应的链表的头部 ,get(K)过程读取的步骤比较简单,调用hash(key)求得key的hash值,然后调用indexFor(hash)求得hash值对应的table的索引位置,然后遍历索引位置的链表,如果存在key,则把key对应的Entry返回,否则返回null