1集合分类
interface Collection<E>,java中所有集合的底层接口,带有泛型E
interface List<E>有序,可重复
class ArrayList<E> 底层数据存储结构数组
class LinkedList<E> 底层数据存储结构为带有【链表头的双向链表】
class Vector<E> 底层数据存储结果数组,同时【线程安全,效率低】
interface Set<E> 无序,不可重复
class HashSet<E> 底层存储数据结构为哈希表结构
class TreeSet<E> 底层存储数据结构为平衡二叉树
2.ArrayList集合的底层数组扩容机制
私有化扩容方法,要求提供的参数是当前扩容所需的最小容量需求 minCapacity
获取原数组容量 oldCapacity
计算新数组容量,大约是原数组容量的1.5倍
判断新数组容量是否满足最小容量要求
判断新数组容量是否超出最大容量限制
创建新数组
从原数组中赋值数据到新数组中
保存新数组地址
3.ArrayList 和LinkedList的性能分析
ArrayList集合底层是数组结构
增删时:1 数组添加有可能导致数组扩容,扩容效率低
2. 在数组中添加或删除元素时会导致数据整体向后或向前移动,效率较低
3. 删除操作会导致有效元素个数和当前底层数组容量占比较低,浪费内存空间
改/查:
数组由于下标的存在可直接通过下标进行改查,效率极高
LinkedList集合底层是有链表头的双向链表结构
链表结构效率集中在链表头和链表尾,在两端进行操作时效率极高。(增删改查),但在链表中间的结点效率较低。
链表结构常用在一些队列中,例如线程池,数据库连接池,消息队列,任务队列。。。
4.String注意事项
4.1 String字符串的拼接
java中的字符串是一个常量,存储在内存的数据区(常量池)中,字符串+拼接时每一次都会生成一个新的字符串。
4.2 String字符串的比较
== 判断,比较多是当前变量的数据存储情况,引用数据类型比较的是地址。
对于java而言""内包含的字符串内容只要是一样的,都是同一个字符串,为了节省空间。
任何时候,字符串判断是否一致,必须使用equals(Object)方法。equals方法是Object类方法,String进行重写后,比较的是字符串的数据内容。
4.3 JDK 1.7和JDK 1.8字符串常量池+处理的区别
jdk1.7字符串拼接操作是在数据区/常量池进行的,操作过程效率较低。
jdk1.8是根据第一个字符串,在内存堆区创建StringBuilder可变长字符串对象利用append进行拼接其他字符串,效率高,不占用数据区/常量池空间,最后通过toString方法转换为String字符串返回。