浅析java集合
简介
集合或数组都是对多个数据进行存储操作,也被称为容器。
注意:这里的存储是指内存级别的,而不是磁盘持久化(图片、视频等)
为什么要使用集合
1:数组定长,不能更改,集合可以;
2:集合增删效率大于数组;
3:集合可以获取元素数量,而数组没有提供这个方法;
4:数组中的数据有序可重复,不能无序不重复
集合两大阵营
ArrayList与LinkedList的区别
1.ArrayList查询快,增删改慢;LinkedList查询慢,增删改快(ArrayList底层是数组有下标,方便查询,也因此导致每次增删改都需要改变下标,所以慢;LinkedList底层是双向链表,在源码内部类中每次查询需要一级一级往下查,所以慢,但增删改可以直接操作,所以快)
扩展
ArrayList的1.7数组基本容量是10,每次扩容为之前的1.5倍;1.8数据基本容量是{},调用add()方法后赋值10的容量(节约空间)
HashMap简介
jdk1.7底层是哈希表(链表加数组)
jdk1.8底层是数组+链表+红黑树
红黑树:自平衡的二叉查找树(根节点是黑色,不能有2个连续的红色节点,每个红色节点子节点是2个黑色节点)
链表插入的方式:7上8下(jdk1.7从上面插入,1.8从下面插入)
最大容量为16
表结构:
|key|value|hash值|下一个元素的位置|
HashSet
底层:哈希表(数组+链表)
往HashSet里面存数据,一定要有:equals,hashcode这2个方法
线程不安全
用ConcurrentHashMap(分段锁解决),不用像Synchronizd那样锁住整个表,只锁住一个桶,更高效
TreeMap简介
特点:唯一,有序(升序或降序)
原理:二叉树
放入集合的key,一定实现了比较器(内部或外部比较器)
TreeSet
特点:唯一,升序(二叉树中序遍历:左 根 右)
Arraylist与vector的区别
Arraylist:扩容为原来的1.5倍,线程不安全,效率高
vector:扩容为原来的2倍,线程安全,效率低
stack
代表后进先出(LIFO)的堆栈对象,允许一个向量被视为堆栈
泛型
jdk1.5引入
相当于一个标签<>
指定了集合中的数据类型
便于遍历
泛型的类型都是引用数据类型(还有一个string),不能是基本数据类型