集合概述和分类

集合概述和分类Collection 单列集合 每个元素 数据 只包含一个值 Map 代表双列集合 每个元素包含老哥值 键值对 key valueList 系列集合 添加元素是有序 可重复 有索引

大家好,欢迎来到IT知识分享网。

目录

一、集合的概述和分类

1.1集合的分类

 1.2Collection集合的常用方法

二、Collection遍历方式

2.1迭代器遍历集合

2.2、增强for循环

2.3forEach遍历集合

三、List系列集合

3.1List集合的常用方法

3.3ArrayList底层的原理

3.4LinkedList底层原理

 3.5LinkedList集合的应用场景


一、集合的概述和分类

1.1集合的分类

Collection :单列集合,每个元素(数据)只包含一个值

Map:代表双列集合,每个元素包含老哥值(键值对),key :value

集合概述和分类

 List系列集合:添加元素是有序、可重复、有索引。

  • ArrayList、LinekdList:有序、可重复、有索引

Set系列集合:添加元素是无序、不重复、无索引。

  •  HashSet:无序、不重复、无索引;
  • LinkedHashSet:有序、不重复、无索引。
  • TreeSet:按照大小默认升序排序、不重复、无索引。

 1.2Collection集合的常用方法

集合概述和分类

Collection<String> c = new ArrayList<>(); //1.public boolean add(E e): 添加元素到集合 c.add("java1"); c.add("java1"); c.add("java2"); c.add("java2"); c.add("java3"); System.out.println(c); //打印: [java1, java1, java2, java2, java3] //2.public int size(): 获取集合的大小 System.out.println(c.size()); //5 //3.public boolean contains(Object obj): 判断集合中是否包含某个元素 System.out.println(c.contains("java1")); //true System.out.println(c.contains("Java1")); //false //4.pubilc boolean remove(E e): 删除某个元素,如果有多个重复元素只能删除第一个 System.out.println(c.remove("java1")); //true System.out.println(c); //打印: [java1,java2, java2, java3] //5.public void clear(): 清空集合的元素 c.clear(); System.out.println(c); //打印:[] //6.public boolean isEmpty(): 判断集合是否为空 是空返回true 反之返回false System.out.println(c.isEmpty()); //true //7.public Object[] toArray(): 把集合转换为数组 Object[] array = c.toArray(); System.out.println(Arrays.toString(array)); //[java1,java2, java2, java3] //8.如果想把集合转换为指定类型的数组,可以使用下面的代码 String[] array1 = c.toArray(new String[c.size()]); System.out.println(Arrays.toString(array1)); //[java1,java2, java2, java3] //9.还可以把一个集合中的元素,添加到另一个集合中 Collection<String> c1 = new ArrayList<>(); c1.add("java1"); c1.add("java2"); Collection<String> c2 = new ArrayList<>(); c2.add("java3"); c2.add("java4"); c1.addAll(c2); //把c2集合中的全部元素,添加到c1集合中去 System.out.println(c1); //[java1, java2, java3, java4]

二、Collection遍历方式

2.1迭代器遍历集合

Collection<String> c = new ArrayList<>(); c.add("赵敏"); c.add("小昭"); c.add("素素"); c.add("灭绝"); System.out.println(c); //[赵敏, 小昭, 素素, 灭绝] //第一步:先获取迭代器对象 //解释:Iterator就是迭代器对象,用于遍历集合的工具) Iterator<String> it = c.iterator(); //第二步:用于判断当前位置是否有元素可以获取 //解释:hasNext()方法返回true,说明有元素可以获取;反之没有 while(it.hasNext()){ //第三步:获取当前位置的元素,然后自动指向下一个元素. String e = it.next(); System.out.println(s); }

迭代器代码的原理如下:

  • 当调用iterator()方法获取迭代器时,当前指向第一个元素
  • hasNext()方法则判断这个位置是否有元素,如果有则返回true,进入循环
  • 调用next()方法获取元素,并将当月元素指向下一个位置,
  • 等下次循环时,则获取下一个元素,依此内推

 使用迭代器遍历集合用到的方法

方法名称 说明

Iterator<E> iterator()

返回集合中的迭代器对象

boolean hasNext()

询问当前位置是否有元素存在,存在返回true,反之false
E next() 获取当前位置的元素,并同时将迭代器对象指向下一元素

2.2、增强for循环

格式:

for(元素数据类型  变量名:数组或集合){

}

 需要注意的是,增强for不光可以遍历集合,还可以遍历数组。接下来我们用代码演示一em.o下:

Collection<String> c = new ArrayList<>(); c.add("赵敏"); c.add("小昭"); c.add("素素"); c.add("灭绝"); //1.使用增强for遍历集合 for(String s: c){ System.out.println(s); } //2.再尝试使用增强for遍历数组 String[] arr = {"迪丽热巴", "古力娜扎", "稀奇哈哈"}; for(String name: arr){ System.out.println(name); }

2.3forEach遍历集合

在JDK8版本以后还提供了一个forEach方法也可以遍历集合,如果下图所示:

集合概述和分类

 我们发现forEach方法的参数是一个Consumer接口,而Consumer是一个函数式接口,所以可以传递Lambda表达式

Collection<String> c = new ArrayList<>(); c.add("赵敏"); c.add("小昭"); c.add("素素"); c.add("灭绝"); //调用forEach方法 //由于参数是一个Consumer接口,所以可以传递匿名内部类 c.forEach(new Consumer<String>{ @Override public void accept(String s){ System.out.println(s); } }); //也可以使用lambda表达式对匿名内部类进行简化 c.forEach(s->System.out.println(s)); //[赵敏, 小昭, 素素, 灭绝]

三、List系列集合

3.1List集合的常用方法

List集合是索引的,所以多了一些有索引操作的方法,如下图所示:

集合概述和分类接下来,我们用代码演示一下这几个方法的效果

//1.创建一个ArrayList集合对象(有序、有索引、可以重复) List<String> list = new ArrayList<>(); list.add("蜘蛛精"); list.add("至尊宝"); list.add("至尊宝"); list.add("牛夫人"); System.out.println(list); //[蜘蛛精, 至尊宝, 至尊宝, 牛夫人] //2.public void add(int index, E element): 在某个索引位置插入元素 list.add(2, "紫霞仙子"); System.out.println(list); //[蜘蛛精, 至尊宝, 紫霞仙子, 至尊宝, 牛夫人] //3.public E remove(int index): 根据索引删除元素, 返回被删除的元素 System.out.println(list.remove(2)); //紫霞仙子 System.out.println(list);//[蜘蛛精, 至尊宝, 至尊宝, 牛夫人] //4.public E get(int index): 返回集合中指定位置的元素 System.out.println(list.get(3)); //5.public E set(int index, E e): 修改索引位置处的元素,修改后,会返回原数据 System.out.println(list.set(3,"牛魔王")); //牛夫人 System.out.println(list); //[蜘蛛精, 至尊宝, 至尊宝, 牛魔王]

3.2List集合的遍历方式

List集合相比于前面的Collection多了一种可以通过索引遍历的方式,所以List集合遍历方式一共有四种:

  • 普通for循环(只因为List有索引)
  • 迭代器
  • 增强for
  • Lambda表达式
List<String> list = new ArrayList<>(); list.add("蜘蛛精"); list.add("至尊宝"); list.add("糖宝宝"); //1.普通for循环 for(int i = 0; i< list.size(); i++){ //i = 0, 1, 2 String e = list.get(i); System.out.println(e); } //2.增强for遍历 for(String s : list){ System.out.println(s); } //3.迭代器遍历 Iterator<String> it = list.iterator(); while(it.hasNext()){ String s = it.next(); System.out.println(s); } //4.lambda表达式遍历 list.forEach(s->System.out.println(s));

3.3ArrayList底层的原理

ArrayList集合底层是基于数组结构实现的,也就是说当你往集合容器中存储元素时,底层本质上是往数组中存储元素。 特点如下:

集合概述和分类

 我们知道数组的长度是固定的,但是集合的长度是可变的,这是怎么做到的呢?原理如下:

集合概述和分类

 数组扩容,并不是在原数组上扩容(原数组是不可以扩容的),底层是创建一个新数组,然后把原数组中的元素全部复制到新数组中去。

3.4LinkedList底层原理

LinkedList底层是链表结构,链表结构是由一个一个的节点组成,一个节点由数据值、下一个元素的地址组成。如下图所示

集合概述和分类

 假如,现在要在B节点和D节点中间插入一个元素,只需要把B节点指向D节点的地址断掉,重新指向新的节点地址就可以了。如下图所示:

集合概述和分类

 假如,现在想要把D节点删除,只需要让C节点指向E节点的地址,然后把D节点指向E节点的地址断掉。此时D节点就会变成垃圾,会把垃圾回收器清理掉。

集合概述和分类

 上面的链表是单向链表,它的方向是从头节点指向尾节点的,只能从左往右查找元素,这样查询效率比较慢;还有一种链表叫做双向链表,不光可以从做往右找,还可以从右往左找。如下图所示:

集合概述和分类

 LinkedList集合是基于双向链表实现了,所以相对于ArrayList新增了一些可以针对头尾进行操作的方法,如下图示所示:

集合概述和分类

 3.5LinkedList集合的应用场景

那么LInkedList集合有什么用呢?可以用它来设计栈结构、队列结构。

入队列可以调用LinkedList集合的addLast方法,出队列可以调用removeFirst()方法.

//1.创建一个队列:先进先出、后进后出 LinkedList<String> queue = new LinkedList<>(); //入对列 queue.addLast("第1号人"); queue.addLast("第2号人"); queue.addLast("第3号人"); queue.addLast("第4号人"); System.out.println(queue); //出队列 System.out.println(queue.removeFirst()); //第4号人 System.out.println(queue.removeFirst()); //第3号人 System.out.println(queue.removeFirst()); //第2号人 System.out.println(queue.removeFirst()); //第1号人

接下来,我们再用LinkedList集合来模拟一下栈结构的效果。还是先来认识一下栈结构长什么样。栈结构可以看做是一个上端开头,下端闭口的水杯的形状。

元素永远是上端进,也从上端出,先进入的元素会压在最底下,所以栈结构的特点是先进后出,后进先出

集合概述和分类

//1.创建一个栈对象 LinkedList<String> stack = new ArrayList<>(); //压栈(push) 等价于 addFirst() stack.push("第1颗子弹"); stack.push("第2颗子弹"); stack.push("第3颗子弹"); stack.push("第4颗子弹"); System.out.println(stack); //[第4颗子弹, 第3颗子弹, 第2颗子弹,第1颗子弹] //弹栈(pop) 等价于 removeFirst() System.out.println(statck.pop()); //第4颗子弹 System.out.println(statck.pop()); //第3颗子弹 System.out.println(statck.pop()); //第2颗子弹 System.out.println(statck.pop()); //第1颗子弹 //弹栈完了,集合中就没有元素了 System.out.println(list); //[]

 

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/132143.html

(0)
上一篇 2025-08-02 18:45
下一篇 2025-08-02 19:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信