引出:
数组:数组一旦创建 长度不可变
int[] ages = new int[5];
数组的扩容:创建新的数组 将元素进行复制拷贝
集合:
存储数据的容器
集合长度可变
集合中只能存储引用数据类型的对象
基本数据类型可以通过自动装箱直接转为包装类的对象进行存储
集合默认情况下可以存储任意类型的数据
也可以通过给集合指定泛型来限制集合存储元素的数据类型
Collection-集合的顶级接口
-List-子接口
--ArrayList 实现类
--LinkedList 实现类
-Set-子接口
--HashSet 实现类
--LinkedHashSet 实现类
--TreeSet 实现类
原理
-Queue-子接口
--LinkedList 实现类
原理
集合划分:
1、元素是否可以重复
2、能否保证元素的存储顺序
3、能否对元素进行排序
Collection接口
通过ArrayList 实现类来练习Collection接口中方法的使用
JDK1.2版本开始提供
方法:
boolean add(E e)--添加元素
boolean addAll(Collection<? extends E> c)--从参数集合中添加元素到当前集合
void clear()-移除集合中所有元素 清空集合
boolean contains(Object o)--判断当前集合是否包含参数元素
equals方法对元素进行比较是否相等
boolean containsAll(Collection<?> c)--判断当前集合中是否包含参数集合的所有元素
boolean equals(Object o)--判断集合中元素是否相同
boolean isEmpty()--判断集合中是否没有元素
boolean remove(Object o)--移除集合中的元素
boolean retainAll(Collection<?> c)--求交集
int size()-返回集合中元素的个数
Object[] toArray()-将集合转数组
集合的遍历:
1、将集合转数组 遍历数组
List子接口:
特点:
List可以保证元素的存储顺序-索引(下标) 可以通过索引来操作List集合中的元素
List集合中允许存在重复的元素
List集合中允许存在多个null
方法:
从Collection中继承过来的方法
void add(int index, E element)
index取值范围
index从0开始
最大值为集合元素的个数
如果超出范围,会抛出异常
原理:
如果指定index位置已经有元素存在,将当前位置以及之后的元素全部向后挪一位 将要添加的元素插入
如果该位置没有元素,则直接插入
E get(int index) - 获取指定index位置处的元素
index取值范围
0~长度-1
int indexOf(Object o)--查找参数元素在集合中第一次出现的下标
int lastIndexOf(Object o)--查找参数元素在集合中最后一次出现的下标
如果没有找到 则返回值为-1
E remove(int index)
移除指定位置的元素 将当前位置之后的元素依次向前挪了一位
E set(int index, E element)--设置指定下标处的元素值
index:
0~长度-1
List<E> subList(int fromIndex, int toIndex)
遍历List集合:
1、普通for循环
for (int i = 0; i <= list.size()-1 ; i++) {
System.out.println(list.get(i));
}
2、foreach遍历集合
for (int i:list) {
System.out.println(i);
}
ArrayList :
基于数组实现。
查询快 增删慢
构造方法:
public ArrayList()--构造一个初始容量为10的列表
底层是创建了一个长度为10的数组如果元素的个数超过数组的长度了 则会触发数组扩容
public ArrayList(int initialCapacity)--构造指定初始容量的列表对象
减少数组扩容的发生 提高程序的执行效率
底层数组扩容源码:
int newCapacity = oldCapacity + (oldCapacity >> 1);//10+10>>1=10+10/2=15
//15+15>>1=15+7=22
默认情况下初始容量为10,第一次扩容之后为15,第二次扩容22,第三次扩容为33,…
elementData = Arrays.copyOf(elementData, newCapacity);
应用场景:
查询多 增删少的场景
LinkedList
LinkedList基于链表数据结构实现的
查询慢 增删快
构造方法:
LinkedList()
构造一个空列表。
方法:
从Collection List接口实现
应用场景:
增删多 查询少的场景
Set接口
特点:
元素不能重复
允许元素为null,但是只能一个
方法:
都是从Collection直接继承过来的
如何判断元素重复:
equals方法来进行判断的
如果元素类型是自定义类需要注意重写equals方法
HashSet
底层是通过HashMap来实现的
特点:
元素不能重复
允许元素为null,但是只能一个
不能保证元素的存储顺序 且保证不了顺序是不变的
“hello” "hi" "world"
"world" “hello” "hi" "abc" "def"
"hi" "world" "hello"
构造方法:
public HashSet()
创建HashMap实现的 初始容量为16 加载因子 0.75
public HashSet(int initialCapacity)
创建HashSet对象 指定初始容量
减少扩容的次数 提高程序效率
LinkedHashSet
是HashSet的子类
元素不能重复
允许元素为null,但是只能一个
保证元素的存储顺序-底层维护了一个链表
构造方法:
LinkedHashSet()
构造一个新的,空链接的哈希集,默认初始容量(16)和负载因子(0.75)。
数据结构
组织数据的形式
数组
数组元素的内存空间是连续
链表
链表元素的内存空间不连续
队列
栈
树
图