java基础-12 : 单列集合(Collection) - 详解

news/2025/11/4 14:32:30/文章来源:https://www.cnblogs.com/yangykaifa/p/19190263

 一.单列集合体系结构

  • List系列集合:添加的元素时有序,可重复,有索引
  • Set系列集合:添加的元素时无序,不重复,无索引

二.单列集合的通用方法

1.1基本数据类型的用法

package 集合;
import java.util.ArrayList;
import java.util.Collection;
public class demo1 {public static void main(String[] args) {// 1. 使用多态方式创建集合Collection list = new ArrayList<>();// 输出空列表:[]System.out.println(list);// 2.添加元素,添加成功返回trueboolean result1 = list.add("1");boolean result2 = list.add("2");boolean result3 = list.add("3");System.out.println(result1); // trueSystem.out.println(list);// 3.删除元素,删除成功返回truelist.remove("2");System.out.println(list);// 4. 集合长度System.out.println(list.size()); // 2// 5. 集合是否为空System.out.println(list.isEmpty()); // false// 6. 集合是否包含某个元素System.out.println(list.contains("1")); // true}
}

1.2引用数据类型的用法

public static void main(String[] args) {ArrayList list = new ArrayList();Student s1 = new Student("张三", 12);Student s2 = new Student("李四", 13);Student s3 = new Student("王五", 14);list.add(s1);list.add(s2);list.add(s3);for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i).getName() + "," + list.get(i).getAge());}for (int i = 0; i < 3; i++) {Student s = new Student();Scanner sc = new Scanner(System.in);System.out.println("输入学生姓名:");String name = sc.nextLine();System.out.println("输入学生年龄");int age = sc.nextInt();s.setName(name);s.setAge(age);list.add(s);}for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i).getName() + "," + list.get(i).getAge());}}

2.遍历集合

1.迭代器

先获取数据,再移动指针,遍历后指针不复位,既依然指向最后没有数据的位置,删除时只能使用迭代器的remove方法,不能使用集合的remove方法

package 集合;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.function.Consumer;
public class demo1 {public static void main(String[] args) {Collection list = new ArrayList<>();list.add("a");list.add("b");list.add("c");Iterator it1 = list.iterator();while(it1.hasNext()){String s = it1.next();System.out.println(s);}Iterator it2 = list.iterator();while(it2.hasNext()){String s = it2.next();if("b".equals(s)){it2.remove();}}System.out.println(list);}
}
a
b
c
[a, c]

2.增强for

增强for: 内部原理是迭代器,只能遍历单列集合,数组,不能遍历Set双列集合

package 集合;
import java.util.ArrayList;
import java.util.Collection;
public class demo1 {public static void main(String[] args) {Collection list = new ArrayList<>();list.add("a");list.add("b");list.add("c");for (String s : list) {//s = "d";//不能修改集合中的元素System.out.println(s);}}
}
a
b
c

3.使用forEach+lambda

package 集合;
import java.util.ArrayList;
import java.util.Collection;
import java.util.function.Consumer;
public class demo1 {public static void main(String[] args) {Collection list = new ArrayList<>();list.add("a");list.add("b");list.add("c");list.forEach(new Consumer() {@Overridepublic void accept(String s) {System.out.println(s);}});list.forEach((String s) -> System.out.println(s));//等同于:list.forEach(s -> System.out.println(s));}
}
a
b
c
a
b
c

三.集合list的特有方法

特性ArrayListLinkedList
底层数据结构动态数组双向链表
访问元素极快,通过索引直接访问,时间复杂度 O(1),需要从头或尾遍历,时间复杂度 O(n)
插入/删除元素,需要移动后续元素,时间复杂度 O(n),只需修改指针,时间复杂度 O(1)
内存开销较小,只存储数据和数组容量较大,每个节点都需要存储数据和两个指针
适用场景频繁随机访问,多读少写频繁在头尾或中间插入/删除,少随机访问

ArrayList 和 LinkedList 都实现了 List<E> 接口。这意味着它们对外承诺了完全相同的一组方法。因此,从代码编写的角度来看,你可以用完全相同的方式去调用 add(int index, E element)remove(int index)set(int index, E element)get(int index) 这些方法,而不需要关心底层是数组还是链表.

有序可重复

  1. 有序: 元素有索引,可以根据索引操作元素
  2. 可重复: 集合中可以存储重复元素

1.void add(int index ,E element)

package 集合;
import java.util.ArrayList;
import java.util.List;
public class demo1 {public static void main(String[] args) {List list = new ArrayList<>();list.add(3);list.add(2);list.add(1);System.out.println(list);list.add(1,5);System.out.println(list);}
}
[3, 2, 1]
[3, 5, 2, 1]

2.remove(int index)/remove(Object O)

  • remove(int index): 删除指定索引处的元素,返回被删除的元素
  • remove(Object o): 删除指定元素,返回是否删除成功
package 集合;
import java.util.ArrayList;
import java.util.List;
public class demo1 {public static void main(String[] args) {List list = new ArrayList<>();list.add(3);list.add(2);list.add(1);System.out.println(list);list.remove(Integer.valueOf(2));System.out.println(list);list.remove(1);System.out.println(list);}
}
[3, 2, 1]
[3, 1]
[3]

    因为在调用方法时,如果出现了重载的现象,优先调用实参跟形参类型一致的方法(缺少了封箱这一步)

    3.set(int index,E element)

    package 集合;
    import java.util.ArrayList;
    import java.util.List;
    public class demo1 {public static void main(String[] args) {List list = new ArrayList<>();list.add(3);list.add(2);list.add(1);System.out.println(list);list.set(0, 100);System.out.println(list);}
    }
    [3, 2, 1]
    [100, 2, 1]

    4.get(int index)

    package 集合;
    import java.util.ArrayList;
    import java.util.List;
    public class demo1 {public static void main(String[] args) {List list = new ArrayList<>();list.add(3);list.add(2);list.add(1);System.out.println(list.get(1));}
    }
    2

    5.列表遍历

    1.普通for循环与增强for循环

    因为list是有序的,所以可以使用索引

    package 集合;
    import java.util.ArrayList;
    import java.util.List;
    public class demo1 {public static void main(String[] args) {List list = new ArrayList<>();list.add(3);list.add(2);list.add(1);for (Integer i : list) {System.out.println(i);}System.out.println("-----------------");for(int i = 0;i
    3
    2
    1
    -----------------
    3
    2
    1

    2.列表迭代器

    package 集合;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.ListIterator;
    public class demo1 {public static void main(String[] args) {List list = new ArrayList<>();list.add(3);list.add(2);list.add(1);ListIterator listit = list.listIterator();while(listit.hasNext()){Integer i = listit.next();if(i == 2){listit.add(521);}System.out.println(i);}System.out.println(list);}
    }
    3
    2
    1
    [3, 2, 521, 1]

    对比总结

    特性维度迭代器遍历增强for循环普通for循环列表迭代器forEach遍历
    删除能力✅ 安全删除❌ 不支持⚠️ 需手动调整索引✅ 安全删除❌ 不支持
    添加能力❌ 不支持❌ 不支持⚠️ 需手动调整索引✅ 支持添加❌ 不支持
    修改能力❌ 不支持❌ 不支持✅ 直接修改✅ 支持修改❌ 不支持
    双向遍历❌ 单向❌ 单向⚠️ 可反向但复杂✅ 双向❌ 单向
    适用集合所有Collection数组+Iterable仅List仅List所有Iterable
    • 迭代器循环:在遍历过程中需要删除元素
    • 增强for循环:仅仅遍历
    • forEach:仅仅遍历
    • 普通for循环:需要对索引进行操作
    • 使用列表迭代器:在遍历过程中需要添加元素

    四.底层原理

    1.ArrayList

    1. 利用空参构造创建的集合,在底层创建一个默认长度为0的数组
    2. 在添加第一个元素时,底层会创建一个新的长度为10的数组
    3. 存满时,会扩容1.5倍
    4. 如果一次性添加多个元素,1.5倍放不下,则新创建的数组长度以实际为准

    2.LinkedList

    3.iterator

    五.集合Set

    特性HashSetTreeSet
    底层数据结构基于 HashMap (哈希表)基于 TreeMap (红黑树)
    元素顺序无序(不保证插入顺序或任何特定顺序)有序(按元素的自然顺序或自定义比较器排序)
    性能 (增、删、查)O(1) 平均时间复杂度O(log n) 平均时间复杂度
    元素要求必须正确实现 equals() 和 hashCode() 方法必须实现 Comparable 接口  提供 Comparator
    允许 null 元素允许一个 null 元素不允许(如果使用自然排序,因为 null 无法比较)
    线程安全非线程安全非线程安全

    1.HashSet

    赖 hashCode 和 equals

    • 当添加元素时,HashSet 会调用元素的 hashCode() 方法来确定存储位置。

    • 如果两个元素的 hashCode 相同,它会再调用 equals() 方法来检查它们是否真的相等。

    • 如果两个对象通过 equals() 比较是相等的,那么它们的 hashCode() 必须返回相同的值。 否则,会导致重复元素被加入,破坏了 Set 的唯一性。

    在使用引用数据类型时,需要重写hashCode()和equals()方法
    String 与 integer 类型都重写了hashCode()和equals()方法

    import java.util.Objects;
    public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student student = (Student) o;return age == student.age && Objects.equals(name, student.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
    }
    import java.util.HashSet;
    import java.util.Set;
    import java.util.TreeSet;
    public class test {public static void main(String[] args) {Student s1 = new Student("张三", 18);Student s2 = new Student("张三", 18);Student s3 = new Student("李四", 19);Student s4 = new Student("王五", 20);Set set = new HashSet();set.add(s1);set.add(s2);set.add(s3);set.add(s4);System.out.println(set);}
    }
    [Student{name = 张三, age = 18}, Student{name = 王五, age = 20}, Student{name = 李四, age = 19}]

    2.TreeSet

    TreeSet 是基于红黑树(一种自平衡的二叉搜索树)实现的 Set,它保证了元素处于排序状态。

    元素必须可比较

    • 自然排序:元素类必须实现 java.lang.Comparable 接口,并重写 compareTo 方法。

    • 定制排序:在创建 TreeSet 时,传入一个 Comparator 比较器对象。

    1.实现Comparable接口,并重写 compareTo方法

    package 集合;
    import java.util.Objects;
    public class Student implements Comparable {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}@Overridepublic int compareTo(Student o) {
    //        this 表示当前要填加的元素, o 表示在红黑树存在的元素return this.age - o.age;}
    }
    package 集合;
    import java.util.HashSet;
    import java.util.Set;
    import java.util.TreeSet;
    public class test {public static void main(String[] args) {Student s1 = new Student("张三", 18);Student s2 = new Student("张三", 18);Student s3 = new Student("李四", 19);Student s4 = new Student("王五", 20);Set set2 = new TreeSet();set2.add(s1);set2.add(s2);set2.add(s3);set2.add(s4);System.out.println(set2);}
    }
    [Student{name = 张三, age = 18}, Student{name = 李四, age = 19}, Student{name = 王五, age = 20}]

    2.使用比较器

    import java.util.Comparator;
    import java.util.Set;
    import java.util.TreeSet;
    public class test2 {public static void main(String[] args) {
    //        使用比较器进行排序规则的指定
    //        规则当长度相同时,按照字典序排序,长度不同时,按照长度排序Set set = new TreeSet<>(new Comparator() {@Overridepublic int compare(String o1, String o2) {
    //                o1 表示当前要填加的元素, o2 表示在红黑树存在的元素int i = o1.length() - o2.length();i = i==0? o1.compareTo(o2) : i;return i;}});set.add("a");set.add("bw");set.add("qwer");set.add("s");System.out.println(set);}
    }
    [a, s, bw, qwer]

    六.泛型

    1.泛型类

    在集合中不限制子类类型时,会默认为Object类型,可以往集合中添加任意类型的数据,类似于多态形式,但是不可以调用子类的特性

    // 定义一个泛型类 Box
    public class Box {private T content; // T 代表一个未知的类型public void setContent(T content) {this.content = content;}public T getContent() {return content; // 返回类型是 T,不需要强制转换}
    }

    在创建类时,使用形参E进行表示,在创建实例对象时,才给出数据类型        

    import java.util.Arrays;
    //1.泛型类
    public class myArrayList{Object[] obj = new Object[10];int size = 0;
    //    添加元素public boolean add(E e){obj[size] = e;size++;return true;}public E get(int index){return (E)obj[index];}//    重写toString方法@Overridepublic String toString(){return Arrays.toString(obj);}
    }
    import java.util.ArrayList;
    public class demo1 {public static void main(String[] args) {
    //        1.泛型类myArrayList list = new myArrayList<>();list.add("hello");list.add("world");System.out.println(list);
    [hello, world, null, null, null, null, null, null, null, null]

    2.泛型方法

    public class Utility {// 一个普通的泛型方法(在非泛型类中)public static  void printArray(T[] array) {for (T element : array) {System.out.print(element + " ");}System.out.println();}// 另一个泛型方法,有两个类型参数public static  void printPair(T first, U second) {System.out.println("First: " + first + ", Second: " + second);}
    }
    public class Main {public static void main(String[] args) {Integer[] intArray = {1, 2, 3};String[] strArray = {"A", "B", "C"};// 调用泛型方法。通常编译器可以推断出类型 T,无需显式指定Utility.printArray(intArray); // T 被推断为 IntegerUtility.printArray(strArray); // T 被推断为 String// 显式指定类型(不常用,通常在类型推断失败时使用)Utility.printArray(intArray);Utility.printPair("Age", 25); // T 是 String, U 是 Integer}
    }

    3.泛型接口

    1.实现类给出具体类型

    import java.util.Collection;
    import java.util.Iterator;
    import java.util.List;
    import java.util.ListIterator;
    //3.泛型接口
    public class list implements List {...@Overridepublic boolean add(String s) {return false;}...
    }
    list list2 = new list();
    list2.add("hello");
    list2.add("world");
    System.out.println(list2);

    2.实现类延续泛型,在创建实现类对象时再确定类型

    import java.util.Collection;
    import java.util.Iterator;
    import java.util.List;
    import java.util.ListIterator;
    public class list2 implements List {...@Overridepublic boolean add(E e) {return false;}...
    }
    list2 list3 = new list2<>();
    list3.add("hello");
    list3.add("world");
    System.out.println(list3);

    4.通配符

    当方法中不确定使用什么类型的泛型时,使用通配符?

    • ? extends E 表示泛型类型是E的子类
    • ? super E 表示泛型类型是E的父类
    • ? 表示任意类型

    本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/955684.shtml

    如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

    相关文章

    2025 年 11 月 ESB 集成平台,API 管理集成平台,集易云集成平台公司最新推荐,聚焦资质、案例、售后的五家机构深度解读!

    引言 随着企业数字化转型进入深水区,ESB 集成平台、API 管理集成平台、集易云集成平台的市场需求持续攀升。为帮助企业精准筛选优质服务商,行业协会联合专业测评机构开展了 2025 年度专项测评,通过 “资质审核 - 技…

    三场比赛(四)

    摘要。0.前言 NOIP 模拟赛。 1.正文 2.总结

    mssql public权限sql注入

    第一 查看数据库库名 http://192.168.152.129:85/1.aspx?xxser=1 and 1=(select db_name()) http://192.168.152.129:85/1.aspx?xxser=1 and 1=(select db_name(1)) http://192.168.152.129:85/1.aspx?xxser=1 and …

    2025 年 11 月 SAP 集成平台,EDI 集成平台,ERP 集成平台公司最新推荐,聚焦资质、案例、售后的五家机构深度解读!

    引言 随着企业数字化转型的深入,SAP 集成平台、EDI 集成平台、ERP 集成平台的需求持续攀升,选择优质公司成为企业提升运营效率的关键。本次推荐基于行业权威协会测评数据,测评涵盖资质认证、技术方案适配性、项目案…

    Luogu P11361 [NOIP2024] 编辑字符串 题解

    SolutionLink。 观察题。一个有趣的事实是题解中提到的所有错解我还真都想过一次,比如贪心 pick 最长的连续 \(1\) 段以及尝试合并上下连续的 \(1\) 段。这题的数据范围和特殊性质做的不错,顺着来想比较好考虑问题。…

    AI辅助编程下的软件分层设计:让生成的代码井然有序

    在人工智能(AI)辅助编程日益普及的今天,我们编码的方式正在经历一场前所未有的变革。 AI 工具如 QWenCoder,TreaCN等,能够帮助我们快速生成代码,极大地提升了开发效率。 然而,这也带来了一个新的挑战: 如何确保…

    2025年钢管总成加工厂权威推荐榜单:液压钢管总成/硬管总成品牌/免焊接钢管总成源头厂家精选

    在工业装备与流体传输系统日益精密的今天,一套高品质的钢管总成已成为保障系统安全与稳定运行的关键环节。 钢管总成作为工业设备中传递介质、连接系统的核心部件,其质量直接影响整个系统的可靠性与寿命。为帮助您精…

    2025年变电站接地线定做厂家权威推荐榜单:便携型接地线/单簧卡口接地线/电厂专用接地线源头厂家精选

    在电力安全标准持续升级的背景下,变电站接地线作为保障电力作业安全的关键设备,其定制化市场需求显著增长。据2025年电力行业安全器具分析报告显示,中国变电站接地线市场规模已达86亿元,年增长率稳定在18%以上。 随…

    关于Dify工作流的项目实现与思考

    最近公司搭建基于DIFY的工作流,参与了部分工作,记录一下所思所想。 1、项目应用的关键技术有:.NET、Python、DIFY 2、.NET作为公司代码语言,提供工作流所需的所有的查询接口 3、Python用来实现Dify和.Net和钉钉之间…

    2025年河北搬家渠道权威推荐榜单:河北单位搬迁/河北搬运小时工/河北大型设备搬运服务精选

    在京津冀协同发展持续深化的背景下,一次专业可靠的搬家服务已成为企业高效运营和家庭顺利乔迁的重要保障。 作为物流行业的重要组成部分,搬家服务的专业性与可靠性直接影响着企业和居民的搬迁体验与效率。据2024年行…

    2025年顶尖候车亭/公交站台//电子站牌/公交站牌/公交候车厅厂家: 江苏兰太城市科技领跑

    2025年顶尖候车亭/公交站台//电子站牌/公交站牌/公交候车厅厂家: 江苏兰太城市科技领跑 摘要 随着城市化进程加速和公共交通需求增长,公交候车厅行业在2025年迎来快速发展,环保、智能化和定制化成为主流趋势。本文基…

    华为高斯Gauss数据库版本与兼容协议--详解(附带Gorm连接示例代码) - 教程

    pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

    任务栏图标变空白

    win+r->cmd,在命令行窗口依次输入如下代码:taskkill /im explorer.exe /fcd /d %userprofile%\appdata\localdel iconcache.db /astart explorer.exe

    2025年酒店剃须刀生产厂家权威推荐榜单:一次性剃须刀套装/女士刮毛刀/刮胡刀供应商精选

    在酒店用品采购领域,一次性剃须刀虽是小物件,却直接影响着客户体验。行业数据显示,超过68%的商务旅客会将客房配备的剃须刀质量列为重要服务指标。 在酒店用品行业,剃须刀作为个人护理用品的重要组成部分,其品质直…

    打开word或PDF,在同目录下自动生成debug.log文件,文件大小0字节!最后发现竟然是一个时时刻刻都要用到的软件引起的

    问题描述: 最近使用了ai编辑器后,就发现在打开word文档或者PDF文档时,总是在同级目录下生成debug.log文件,这个文件很诡异,大小为0字节,里面是空的,没有内容。 通过搜索类似问题,发现并没有有效的线索,没有跟…

    2025年铸铁修正轮企业权威推荐榜单:丸片修正轮/金刚石丸片修正轮/镀砂修正轮源头厂家精选

    在机械加工精度要求日益提升的今天,一片高质量的铸铁修正轮已成为保障磨床加工精度与效率的关键耗材。 作为磨床加工过程中的重要修整工具,铸铁修正轮的精度与耐用性直接影响着工件的加工质量与生产成本。据2024年行…

    西南地区钢结构工程设计施工服务TOP5推荐:钢结构工程设计服务商哪个靠谱

    在西南地区(重庆、云南、贵州、四川)工业经济快速发展的背景下,钢结构工程因绿色环保、施工周期短等优势成为工业厂房、仓储物流中心的优选方案。但客户常面临设计、施工、材料环节割裂导致的成本超支、工期延误、质…

    2025年防水卷材供应商权威推荐榜单:防水涂料/堵漏材料/外墙防水涂料源头厂家精选

    作为建筑工程中不可或缺的功能性材料,防水卷材的性能直接影响建筑物的防水效果与使用寿命。据2024年行业数据显示,中国防水卷材市场规模已突破1800亿元,其中新型自粘卷材占比达52%,年增长率稳定在9.5%。 为帮助工程…

    2025年不锈钢门定制工厂排名,不锈钢酒柜定制公司推荐

    2025年装饰领域快速迭代,不锈钢门、不锈钢酒柜等定制金属制品凭借耐用性与高级质感,成为别墅、酒店、商业空间的核心装饰选择。然而市场中供应商良莠不齐:设计落地偏差大、尺寸精度失控、售后缺失等问题频发,客户陷…

    1000UserGuide:独立开发者获取前1000个用户的终极指南

    1000UserGuide是一个专为独立开发者和创业者设计的资源手册,提供国内外优质曝光渠道、营销策略和实战案例,帮助产品快速获取早期用户,建立稳固的用户基础。:rocket: 1000UserGuide项目简介 1000UserGuide 是一个专门…