一、集合概念
1、什么是集合
对象的容器,定义了对多个对象进行操作的常用方法。可实现数组的功能。
2、集合和数组的区别
- 数组长度固定,集合长度不固定
- 数组可以存储基本类型和引用类型,但是集合只能存储引用类型
二、collection
1、collection体系
collection.clear
2、collection使用
使用collection保存student信息:
student类:
三、List集合
使用举例:
1、List实现类
2、ArrayList使用
3、ArrayList源码分析
ArrayList:
源码分析:
- DEFAULT_CAPACITY = 10 默认容量(注意:如果没有向集合中添加任何元素的时候,容量为0;添加一个元素之后,容量为10)(每次扩容的大小为原来的1.5倍)
- elementData:存放元素的数组
- size:实际的元素个数
- add():添加元素
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);
}
4、Vector使用
5、LinkedList使用
存储结构:双向链表
6、LinkedList源码分析
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
7、ArrayList和LinkedList区别
四、泛型
1、概述
把类型通过参数传递
2、泛型类
3、泛型接口
2种使用方法
1)
2)
4、泛型方法
综上,可以看出泛型的好处:
5、泛型集合
如果没有传入数据的话,是泛型的,默认为object,但是回来取的时候,需要进行强制转化
更正:
五、set集合
1、概述
2、set实现类
1)hashset
重写hashCode和equals方法
练习:
补充:
默认生成的hashcode分析:
2)Treeset
treeset存储结构:红黑树
红黑树是二叉查找树,红黑是为了保持平衡
如果是使用它来存储数据,需要定义比较的规则,不然会报错:
comparator接口
小例子:
六、map集合
1、概述
使用:
2、map集合的实现类
1)hashmap
hashcode:找位置
equals:判断是否形成链表
2)hashmap源码分析
static final int TREEIFY_THRESHOLD = 8;
//链表长度大于8,并且数组长度>64,则将其调正为红黑树
//无参构造
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
目的:节省空间
3)hashmap和hashset的关系
hashset中使用的是hashmap的key
4)、hashtable和properties
5)Treemap:
treeset和treemap的关系:
treeset中使用了treemap
七、collections工具类
八、集合总结
ArrayList:数组
LinkedList:双向链表
hashset:哈希表
treeset:红黑树(排序,必须要实现比较的方法的接口)
hashmap:哈希表
treemap:红黑树