List集合

本文介绍了Java集合框架,集合可动态存放多个对象,分为Collection和Map两大家族。Collection接口常用子接口有List和Set,List元素有序且可重复。还介绍了List接口的常用实现类,如ArrayList、LinkedList和Vector。此外,讲解了Iterator迭代器,用于遍历集合元素,使用时需注意避免并发访问异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 集合简介

1.1 什么是集合

1、 集合是Java API所提供的一系列类,可以用于动态存放多个对象。--集合只能存对象

2、 集合与数组的不同在于,集合是大小可变的序列,而且元素类型可以不受限定,只要是引用类型。(集合中不能放基本数据类型,但可以放基本数据类型的包装类)

3、 集合类使用初始容量和加载因子调整自己的大小。

4、 集合类全部支持泛型,是一种数据安全的用法。

1.2 集合框架图

Java的集合框架从整体上可以分为两大家族。

1、 Collection(接口)家族。该接口下的所有子孙均存储的是单一对象。

2、 Map(接口)家族。该接口下的所有子孙均存储的是key-value(键值对)形式的数据。

另外还有三个分支,均是为上述两大家族服务的。

1、 Iterator(迭代器)家族。主要用于遍历Colleciton接口的及其子类而设计。

2、 Compaator(比较器), 在集合中存储对象时候,用于对象之间的比较

3、 Collecitons是工具类。注意该类名带个s,一般就表示工具类。里面提供了N多静态方法,来对Colleciton集合进行操作。

2. Collection接口

2.1 Collection概述

Collection接口-定义了存取对象的方法。两个非常常用的子接口:

List接口:存放的元素有序且允许有重复的集合接口。

Set接口:存放的元素无序不包含重复的集合接口,所有的重复内容是靠hashCode()和euqals()两个方法区分的。

说明:

“元素”-对象,实例

“重复”-两个对象通过equals相等。

“有序”-元素存入的顺序与取出的顺序相同。

2.2 Collection的常用方法

1、 int size(); 返回此collection中的元素数。

2、 boolean isEmpty(); 判断此collection中是否包含元素。

3、 boolean contains(Object obj); 判断此collection是否包含指定的元素。

4、 boolean contains(Collection c); 判断此collection是否包含指定collection中的所有元素。

5、 boolean add(Object element); 向此collection中添加元素。

6、 boolean addAll(Collection c);将指定collection中的所有元素添加到此collection中

7、 boolean remove(Object element); 从此collection中移除指定的元素。

8、 boolean removeAll(Collection c); 移除此collection中那些也包含在指定collection中的所有元素。

9、 void clear(); 移除些collection中所有的元素。

10、boolean retainAll(Collectionc); 仅保留此collection中那些也包含在指定collection的元素。

11、Iterator iterator(); 返回在此collection的元素上进行迭代的迭代器。

12、Object[]toArray();把此collection转成数组。

3. List接口

3.1 接口概述

1、 实现List接口的集合类中的元素是有序的,且允许重复

2、 List集合中的元素都对应一个整数型的序号记载其在集合中的位置,可以根据序号存取集合中的元素。

JDK API所提供的List集合类常用的有:

ArrayList(重点,必须掌握)

​ LinkedList

​ Vector(并不常用,了解)

3.2 List常用方法

见如下代码:


 
  1. package cn.sz.gl.test01;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class Test02 {
  7.  
  8. public static void main(String[] args) {
  9. ArrayList list = new ArrayList();
  10.  
  11. list.add("zhangsan");
  12. list.add("lisi");
  13. list.add("wangwu");
  14.  
  15. System.out.println("集合长度:"+list.size());
  16. //list.clear();//清空集合中的所有数据
  17. System.out.println("调用clear方法后,集合长度:"+list.size());
  18.  
  19. boolean flag = list.contains("lisis");//判断集合中是否包含指定的数据
  20. System.out.println("判断集合中是否包含指定的数据:"+flag);
  21.  
  22. int index = list.indexOf("wangwu");//用来获取元素保存在list集合中的索引号
  23. System.out.println("获取指定数据的索引号:"+index);
  24.  
  25. boolean isempty = list.isEmpty();
  26. System.out.println("判断集合是否有元素:"+isempty);
  27.  
  28. int index2 = list.lastIndexOf("wangwu");
  29. System.out.println("从后往前查找指定的元素,并返回元素的索引号:"+index2);
  30.  
  31. Object obj = list.remove(2);//用来删除指定位置的元素, 并返回该已经删除的元素
  32. System.out.println("删除第2位的数据后,集合的长度:"+list.size());
  33. System.out.println("删除的元素是:"+obj);
  34.  
  35. boolean isRemove = list.remove("lisi");//删除指定的元素,并返回是否删除成功
  36. System.out.println("删除lisi后,集合的长度:"+list.size());
  37. System.out.println("删除lisi后,返回值是:"+isRemove);
  38.  
  39. list.set(0, "zhangsans");//修改指定位置的元素
  40. System.out.println("集合长度:"+list.size());
  41. System.out.println("set之后,元素内容:"+list.get(0));
  42.  
  43.  
  44.  
  45. list.add("111");
  46. list.add("222");
  47. list.add("333");
  48. list.add("xxxx");
  49. list.add("yyyy");
  50. list.add("zzz");
  51. List list2 = list.subList(2, 5);//获取原list集合中的某一部分元素(获取子集),这里包含第2个,但不包含第5个
  52. for (int i = 0; i < list2.size(); i++) {
  53. System.out.print(list2.get(i)+"\t");
  54. }
  55. System.out.println();
  56. System.out.println("***************************************");
  57.  
  58. Object os [] = list.toArray();//把集合转变为一个数组
  59. for (int i = 0; i < os.length; i++) {
  60. System.out.print(os[i]+",");
  61. }
  62.  
  63. }
  64. }

3.3 ArrayList和LinkedList的区别

ArrayListLinkedList
底层封装数组实现,分配的是一块连续的内存空间底层封装链表实现,分配的是不连续的内存空间
读取数据效率更高读取数据效率相对较低
增,删等操作效率相对偏低增,删等操作效率高
 相对于ArrayList,多了对于首元素和尾元素的操作

3.4 Vector与ArrayList的区别

  1. Vector是jdk1.0出现的,老版本java使用的集合,注重安全,是线程安全的;

    ArrayList是jdk1.2之后使用,注重性能,是非线程安全的.

  2. 当长度扩充时,Vector直接扩充一倍,而ArrayList是扩充50%

    ArrayList默认长度为10个,当存满10个时,长度会自动扩充50%

4. Iterator(迭代器)接口

4.1 Iterator概述

​ 由于集合中存有很多元素,很多时候需要遍历集合中的所有元素,java专门为集合提供了遍历集合的API:迭代器接口

​ Iterator是专门的迭代输出接口。所谓的迭代输出就是将元素进行判断,判断是否有内容,如果有内容则把内容取出。

​ Iterator对象称作迭代器,用以方便的实现对集合内元素的遍历操作。

4.2 获得Iterator对象

调用集合对象的iterator()方法,可以获得一个与该集合对象关联的迭代器对象。

例如:

List list = new ArrayList<>();

Iteratoriterator = list.iterator(); //获得Iterator对象

4.3 Iterator的常用方法

Iterator定义如下三个方法:

​ boolean hasNext(); //判断游标右边是否有元素。如果有返回true,否则false

​ Object next() ; //返回游标右边的元素并将游标移动到下一个位置

​ void remove(); //删除游标左面的元素(即next的时候跳过的对象)

注意:迭代方向是单向的,只能从前朝后(Iterator有个专为list集合设计的子接口ListIterator可以实现双向迭代)。

示例代码如下:


 
  1. package cn.sz.gl.no1;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Iterator;
  5. import java.util.List;
  6.  
  7. public class TestIterator {
  8.  
  9. public static void main(String[] args) {
  10. List<String> list = new ArrayList<>();
  11. list.add("abc");
  12. list.add("bcd");
  13. Iterator<String> iterator = list.iterator();
  14.  
  15. while (iterator.hasNext()) {// 判断后面是否还有元素
  16. String string = iterator.next(); // 获得下一个元素
  17. System.out.println(string);
  18.  
  19. }
  20.  
  21. }
  22. }

​ 注意:在用迭代器遍历集合的时候,如果要删除集合中的元素,只能调用迭代器的remove(),禁止调用集合对象的rmove()方法,否则有可能会出现异常:

​ java.util.ConcurrentModificationException。//并发访问异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值