1.ArrayList嵌套
1.1 在集合中存放集合,和二维数组类似
ArrayList<ArrayList> arraylList=new ArrayList<>();
2.Set集合
2.1 定义
set集合存放的元素是无序的,不能存放重复元素
2.2 应用场景
1.当集合中不想有重复元素时,可以使用set集合
2.当需要排除集合中的重复元素时,可以使用set集合
3.HashSet集合
3.1 定义
1.HashSet集合中的元素通过hash值来比较,通过集合元素hashCode()和equals()方法来决定是否加入
2.元素最后存入的元素是由元素的hash值决定的,不是顺序的
3.2 存储原理
1.要加入集合的元素,先计算hash值,确定元素存放的位置,再通过equals方法判断要加入的元素是否和hash值所在位置的元素相等,如果相等,不加入,不相等就加入
2.如果两个元素计算出了相同的hash值,也同样加入
3.3 构造方法
1.无参构造
HashSet() 构造出一个新的HashSet对象,初始容量是16,扩容时扩大一倍
2.有参构造
HashSet(Collection<? extends E> c) 构造一个包含指定collection中元素的新set
3.4 常用方法
1.boolean add( E e) 如果此set集合中尚未包含指定元素,则添加指定元素
2.boolean remove(Object o) 移除某个元素
3.int size() 获取集合的⻓度
3.5 测试代码—去除ArrayList中的重复元素
public class Test {
public static void main(String[] args) {
ArrayList<Integer> arrayList=new ArrayList<>();
arrayList.add(12);
arrayList.add(213);
arrayList.add(213);
arrayList.add(45);
arrayList.add(67);
// 去除重复元素,将arrayList作为参数,创建hashSet对象
HashSet<Integer> hashSet=new HashSet<>(arrayList);
System.out.println(hashSet);
}
}
4.LinkedHashSet集合
4.1 定义
兼顾了linked的有序性和HashSet的元素唯一性
4.2 代码测试
HashSet<Integer> hashSet1=new HashSet<>();
hashSet1.add(12);
hashSet1.add(34);
hashSet1.add(12);
hashSet1.add(67);
System.out.println(hashSet1);
LinkedHashSet<Integer> linkedHashSet=new LinkedHashSet<>();
linkedHashSet.add(23);
linkedHashSet.add(46);
linkedHashSet.add(23);
linkedHashSet.add(78);
System.out.println(linkedHashSet);
5.TreeSet集合
5.1 定义
1.treeSet集合中的元素,都是有顺序的,是通过比较元素的大小来进行存储的,大的存右边,小的存左边
2.collection集合中的元素,一般都是引用类的,而继承类treeSet集合中存放的对象,都必须实现Comparable接口,其中有comparaTo方法,此方法决定treeSet的排序规则
3.最后的元素会形成一个树结构
5.2 构造方法
1.TreeSet() 构造⼀个新的空set, 该set根据其元素的⾃然顺序(元素类中comparaTo方法设定的排序方法)进⾏排序
2.TreeSet(Comparator <? super E> comparator) 构建⼀个空的TreeSet, 他根据指定⽐较器进⾏排序,如果存放的元素类没有实现comparable接口并重写comparaTo方法,就需要创建比较器类comparator,并用比较器创建treeSet对象
5.3 常用方法
1.add(E e) 将指定元素添加到此set
2.first() 返回此set中当前第⼀元素
3.last() 返回此set中当前最后⼀个元素
4.floor() 返回此set中⼩于等于给定元素的最⼤元素,不存在则返回null
5.higher() 返回此set中严格⼤于给定元素的最⼩元素,不存在则返回null
5.4 添加原理
TreeSet会将第⼀个添加的元素作为中点, 以后添加的元素会先跟中点进⾏⽐较, 如果⼤于就接
着跟所⽐较元素的右边的元素接着⽐较,如果⼩于就接着跟所⽐较元素左边的元素接着⽐较, 直
到⽆法找到可⽐较的元素,就会将新添加的这个元素放到当前位置
5.5 comparable接口
1.comparaTo方法
1)如果方法返回的数小于0,表示当前元素小于要加入的元素,存在左边
2)如果方法返回的数等于0,表示当前元素等于要加入的元素,不加入
3)如果方法返回的数大于0,表示当前元素大于要加入的元素,存在右边
5.6 comparator比较器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JHGY9Kfu-1639573382870)(C:\Users\tpszhao\AppData\Roaming\Typora\typora-user-images\image-20211215205217051.png)]
5.7 compara接口和comparator的区别
Comparable和Comparator的区别
1. 使用上: Comparable接口必须让类自己去实现并且重写对应方法
Comparator接口则是需要单个的实现类去单独实现他并且重写对应的方法
2. 排序上: 对于实现类Comparable接口的类,每次排序使用的都是同一个规则,无法自行更改排序规则
对于Comparator接口,则可以每次排序单独指定一个排序规则
3. 修改源代码: Comparable接口使用的前提是可以修改对应的类
Comparator接口则不需要修改对应的类,和类相互独立
4. 参数使用上:Comparable不能作为参数,在方法中出现
Comparator可以作为参数,在sort方法当中确定需要使用的排序的规则
同时存在的时候: Comparable和Comparator的优先级 --- Comparator的优先级更高
6.Colleactions类,针对collection集合的操作方法类
6.1常用方法
1.sort(List list) 根据元素的⾃然顺序排序**(元素类继承了comparabla类,重写了comparaTo方法)**
2.sort(List list ,Comparator <? super E> comparator) (元素没有继承comparabla类)
3.swap(List list , int i , int j) 交换集合中两个⻆标位上的值
4.reverse(List<?> list ) 反转集合中的元素的顺序
5.replaceAll(List list, T oldVal**(旧元素), T newVal(新元素)**) 替换