集合
概念:对象的容器,定义了对多个对象进行操作的常用方法,可实现数组的功能
和数组的区别
- 数组的长度固定,集合长度不固定
- 数组可以存储基本类型和引用类型,集合只能存储引用类型
- 都位于java.util.*里
Collection体系集合
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lohcvAWv-1629465662810)(C:\Users\ONCE-Jam\Desktop\超车\笔记\QQ截图20210820144314.png)]
Collection父接口
特点:代表一组任意类型的对象,无序、无下标、不能重复
方法:
boolean add(Object obj);
boolean addAll(Collection c);
void clear();
boolean contains(Object o);
boolean equals(Object o);
boolean isEmpty();
boolean remove(Object o);
int size();
Object[] toArray();
注意!iterator方法的hasNext()方法是判断当前指向的下一个有没有元素,最开始指向第一个元素的上方
迭代过程中不能使用collection的删除方法,会报异常,可以试用iterator的删除方法
List子接口
有序、有下标、元素可以重复
void add(int index, Object o);
boolean addAll(int index, Collection c);
Object get(int index);
List subList(int fromIndex, int toIndex);
有列表迭代器,和Iterator的区别在于,列表迭代器可以向前向后遍历hasPrevious和previous和previousIndex三个方法
remove是根据下标来删除,可以通过强转成Object或new Integer来实现根据数字删除
List实现类
ArrayList
-
数组结构实现,查询快、增删慢 -
JDK1.2版本,运行效率快、线程不安全 -
remove()可以通过下标或对象来删除 -
indexOf查找下标 -
通过重写equals改变比较规则,可以方便查找与删除 源码分析
-
默认容量 DEFAULT_CAPACITY = 10;如果没有向集合中添加任何元素时,容量为0 -
存放元素的数组 elementData -
实际元素个数 size -
public boolean add(E e) {
ensureCapacityInternal(size + 1);
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++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
elementData = Arrays.copyOf(elementData, newCapacity);
}
-
每次扩容,新容量是原来的1.5倍
Vector
-
数组结构实现,查询快、增删慢 -
JDK1.0版本,运行效率慢、线程安全 -
枚举器遍历 -
Enumeration en = vector.elements();
while(en.hasMoreElements()){
String o = (String)en.nextElement();
System.out.println(o);
}
LinkedList
- 链表结构实现,增删快、查询慢
- 可以使用迭代器和列表迭代器
泛型
- 本质是参数化类型,把类型作为参数船体
- 常见形式有泛型类、泛型接口、泛型方法
- 语法<T,…> T成为类型占位符,表示一种引用形式
-
- 提高代码的重用性
- 防止类型转换异常,提高代码的安全性
泛型类
- 可以使用泛型创建变量
- 使用泛型作为方法的参数
- 使用泛型作为方法的返回值
泛型接口
- 不能有静态常量
- 可以作为参数和返回值
- 接口被实现时需要写明泛型的类
- 可以用泛型类实现泛型接口(不用写明类)
泛型方法
- 语法: 返回值类型
- 可以作为参数和返回值
- 调用泛型方法,类型由传入的类型决定
泛型集合
- 参数化类型、类型安全的集合,强制集合元素的类型必须一致
- 编译时即可检查,而非运行时抛出异常
- 访问时,不必类型转换
- 不同泛型之间引用不能相互赋值,泛型不存在多态
Set子接口
无序、无下标、元素不可重复
方法全部继承自Collection集合
Set实现类
HashSet
- 基于HashCode实现元素不重复
- 当存入元素的哈希码相同时,会调用equals进行确认,如果为true则拒绝后者存入
- 可以使用增强for,迭代器来遍历
- 存储结构:哈希表(数组+列表+红黑树)
- 使用HashSet实际就是在使用hashMap,hashset的add实际就是用的hashMap的key
TreeSet
- 基于排列顺序实现元素不重复
- 实现了SortedSet接口,对集合元素自动排序
- 元素对象的类型必须实现Comparable接口,制定排序规则
- 通过CompareTo方法确定是否为重复元素
- 可以创建集合时就指定比较规则,通过匿名内部类comparator
- 实际用的是TreeMap
Map集合
Map接口
- 用于存储任意键值对(Key-Value)
- 键:无序、无下标、不允许重复
- 值:无序、无下标、允许重复
方法
V put(K key,V value);
Object get(Object key);
Set<K>;
Set<Map.Entry<K,V>>;
HashMap
- 存储结构哈希表(数组+链表+红黑树)
- 使用key和hashcode和equals作为重复
源码分析
-
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
static final int MAXIMUM_CAPACITY = 1 << 30;
static final float DEFAULT_LOAD_FACTOR = 0.75f;
static final int TREEIFY_THRESHOLD = 8;
static final int UNTREEIFY_THRESHOLD = 6;
static final int MIN_TREEIFY_CAPACITY = 64;
TreeMap
- 实现了SortedMap接口,可以对key自动排序
- 使用时要实现Comparable接口
- 可以创建集合时就指定比较规则,通过匿名内部类comparator
|