集合进阶Collection集合

简介: 这篇文档介绍了Java中的Collection集合和其子类List与Set的基本概念和特性。

集合进阶Collection集合

Collection单列集合(所有单列集合的祖宗)(接口)
Collection单列集合特点:有两个常用子类集合
1List系列集合:添加的元素有序,可重复,有索引的。
2set系列集合:添加的元素无序,不可重复,没有索引。



Collection集合的其他相关知识
1.可变参数(一种特殊的参数形式)
一、特点和好处:
特点:可以不传参数给它,也可以传一个参数给他,也可以传多个参数给它;也可以传一个数组
好处:可以非常灵活的接收数据
二、格式:数据类型.......参数名

三、注意事项:
1可变参数在方法内部就是一个数组(因为在方法内部声明使用可变参数时,实际上这个可变参数会转换成一个数组)
2一个形参列表中,可变参数只能有一个。
3可变参数必须是放在形参列表的最后面(因为不放在后面的话,编译的时候就会无法确定传递参数的个数)
4格式:

Collections(一个用来操作集合的工具类)
1作用:用来操作单列集合的一个工具类
2常用的一些方法
一、Collections.addAll(集合名字,"添加的数据,..........")批量添加数据进入集合
二、Collections.shuffle(集合名字)打乱集合中的元素顺序
三、Collerctions.sort(集合名字)对集合里的元素进行升序排序,一定要在类里面实现Comparable接口
四、Collections.sort(集合名字,实现Comparator接口,并指定排序规则)



代码如下:Conllection常用方法




Conllection的遍历方式
1迭代器
迭代器是用来遍历集合的专用方法(数组是没有迭代器的)在Java中的迭代器代表是iterator


使用方法直接用  对象名.iterator
1.迭代器方法:hasNext() 判断当前的集合是否有值  ,   next() 获取当前位置的元素
实例:



2增强for循环
格式:for(元素的数据类型  变量名 :数组或者集合){
}
增强for循环可以用来遍历数组和集合
底层原理:增强for循环就是使用了迭代器来遍历数组的
实例:


3lambda表达式
使用forEach()小括号里面new一个Consumer<数据类型>的接口,然后用来遍历
实例:


List集合(接口)
1特点:
有重复,有索引,有序
2特有方法:
一、增 add(int index  , E)将指定的元素插入列表中的指定位置
二、删 remove(int index)传入一个索引,把这个索引所对应的值删除
三、改 set(int index , E e) 传入你想更改的那个值的索引,然后再传入一个你想要用来修改原来数据的一个值
四、查 E  get(int index ) 返回列表中指定索引元素的位置

ArrarysList(List集合其中的一个实现类)
1.特点:
查询快,增加删除慢
List<String> list = new ArraryLIst<>();
List<String>如果泛型没有指定,就会默认为Object类型,到时候使用的时候要进行类型的强转。
2.底层原理
ArraryList的底层其实就是一个数组,它的实现过程如下
一、创建ArraryList对象的时候,在底层会创建一个长度为0的数组
二、在添加第一个元素的时候,会把原本长度为0数组扩容成为一个长度为10的数组
三、如果底层数组容器装满了,会继续扩容,会扩容1.5倍
四、如果一次性添加多个数据,底层就会用元素的长度+新增元素个数作为数组的新长度
3.使用场景
如果你要进行频繁的数据查询的话,就建议使用ArraryList来存放数据

LinkedList(List集合另一个实现类)
1.底层结构
双链表
2.特点
增删快,查询慢
3.特有方法
一、addFirst()  往集合的开头添加数据
二、addLast()   往集合的末尾添加数据
三、getFirst()    获取集合的第一个数据
四、getLast()     获取集合的最后一个数据
五、removeFirst  从集合列表删除第一个元素,并返回这个删除的元素给你看看
六、removeLast   从集合列表删除最后一个元素,并返回这个删除的元素给你看看
实例:



4.LinkedList可以实现两种数据结构
一、队列模式
特点:先进先出
代码实现:



二、栈结构
特点:先进后出
代码实现:



Set集合
1.特点
无序、不重复、无索引

HashSet集合(Set集合的其中一个实现类)
1.底层结构
数组+链表+红黑树
2.实现流程
一、在创建对象的时候,会创建一个长度为16的数组
二、添加数据:先获取这个值的哈希值然后用哈希值把数组的长度取余,计算出这个值在数组中的存放位置,然后判断这个位置上面是否有值,如果没有值就直接存放,如果有值就判断两个值的哈希值是否相同,如果不相同就直接存放,如果相同,就用equals对比他们两个值的内容是否相同,内容不同就存放,相同就不存放,当存放在数组的数据个数等于数组长度的0.75倍,就会进行扩容,扩容为当前数组的2倍,只有当数组的长度大于64,并且链表的长度大于等于8才会转化为红黑树
三、如果想实现对象内容去重的话,就要在JavaBean里面重写HashCode()和equals()方法

3.使用场景
如果不要求数据重复,想增删改查都快

LinkedHashSet(Set集合的另一个实现类)
1.底层结构
数组+链表+双链表+红黑树
双链表的作用:用来存放元素添加的顺序,就是记录它前后元素的位置
2.特点
底层有双链表,记录元素存储的位置所以存储有序,不重复,无索引
3.使用场景
如果不要求数据重复,想增删改查都快,同时存储有序

TreeSet(Set集合的另一个实现类)
1.底层结构
红黑树
2.特点
可以进行排序,而且比较的数据内容相同,会直接不存这个数据
3.指定排序规则
1.可以在JavaBean类里面实现Comparable接口,重写方法,指定排序规则
2.也可以在new TreeSet(指定Comparable接口,重写比较规则)



TreeSet指定排序规则(代码如下)


//在JavaBean类里面实现Comparable接口,重写方法,指定排序规则

@Override

   public int compareTo(Teacher o) {

       return Double.compare(this.height , o.height) ;

   }



//在测试类里面new TreeSet(指定Comparable接口,重写比较规则)

public class TeacherTest {

   public static void main(String[] args) {

       Teacher te = new Teacher();

       TreeSet<Teacher> set = new TreeSet<>(new Comparator<Teacher>() {

           @Override

           public int compare(Teacher o1, Teacher o2) {

               return Double.compare(o1.getHeight() , o2.getHeight());

           }

       });

       set.add(new Teacher("张老师", 35 , 165.8));

       set.add(new Teacher("李老师", 25 , 175.8));

       set.add(new Teacher("张老师1", 35 , 165.8));

       set.add(new Teacher("梁老师", 36 , 176.8));


       // TreeSet<Teacher> tea = new TreeSet<>();

       // tea.addAll(set);


       System.out.println(set);

   }



4.使用场景
如果想要实现数据自动排序的话就可以用

目录
相关文章
|
6月前
|
算法 安全 索引
【面试小知识】Collection(接口)集合
【面试小知识】Collection(接口)集合
集合框架系列(二)之 set集合
集合框架系列(二)之 set集合
|
5月前
|
索引
List集合(方法简介,集合遍历)
List集合(方法简介,集合遍历)
|
3月前
|
存储 Java 索引
Collection集合
Collection集合
|
5月前
(Collection)集合遍历,进阶
(Collection)集合遍历,进阶
|
5月前
|
Java
Java集合之map 集合使用
Java集合之map 集合使用
19 0
|
存储 SQL 安全
集合框架之Set集合
集合框架之Set集合
66 0
|
11月前
|
存储 Java 索引
Java集合之List集合(上)
Java集合之List集合
97 0
|
11月前
|
存储 Java API
Java集合之List集合(下)
Java集合之List集合(上)
67 0
|
存储 uml 容器
集合框架之List集合
集合框架之List集合
66 0