java中的集合 最全面的集合讲解

article/2025/11/7 23:49:28

集合只能存储对象,长度可变的数据结构'

Collection是一个接口,没有办法创建对象,所以需要它的子类来创建对象,创建对象的时候可以使用多态。

一、Collection中通用的方法

方法:

  • 创建集合对象,会自动重写toSting方法

  • add

  • remove 删除指定元素

     

  • contains 判定集合是否包含给定对象

         

  • isEmpty判断集合是否为空,为空返回true

  • size

  • toArray

  • clear

二、List集合

  • 特点:

    • 有序的集合(存储元素和取出元素的顺序一致)

    • 有索引,包含了一带索引的方法

    • 允许存储重复元素

  • List是大小可变的数组实现

  • 常用方法:

 public static void main(String[] args) {List<String> list =  new ArrayList<>();//多态list.add("a");list.add("b");list.add("s");list.add("s");System.out.println(list);//[a,b,s,s]打印的不是地址值,说明重写了toString方法//使用add方法在指定位置,添加元素list.add(2,"c");//在索引为2的位置添加cSystem.out.println(list);//[a,b,c,s,s]//移除指定位置元素,并返回被移除的元素String remove = list.remove(2);System.out.println(remove);//[a,b,s,s]System.out.println(list);//[a,b,s,s]//替换指定位置的元素,并返回被替换的元素String c = list.set(2, "c");System.out.println(c);//sSystem.out.println(list);//[a,b,c,s]//遍历集合,三种方式//使用普通for循环for (int i = 0; i < list.size(); i++) {//get()返回指定位置的元素String s = list.get(i);System.out.println(s);}System.out.println("-----------");//使用迭代器Iterator<String> iterator = list.iterator();while(iterator.hasNext()){String next = iterator.next();System.out.println(next);}System.out.println("-----------");//使用foreachfor (String s:list) {System.out.println(s);}// String r = list.get(5);//没有索引为5的,会报索引越界异常IndexOutOfBoundsException//System.out.println(r);}

三、ArrayList

  • 是List集合的实现类

  • ArrayList最底层的源码是数组的复制。如果添加一个元素,会先创建一个数组,长度是原数组的长度+1,然后把数据放到新数组。先所以查询快(连续的),增删慢

  • 所以查询多,增删少的的话用ArrayList

 

Vector是单线程的,在1.2之后,被ArrayList取代了

四、 LinkedList 

是List接口的链表实现, LinkedList 底层是一个双向链表,里面包含大量操作首尾的方法,查询慢,增删快,此集合是多线程。

 要使用LinkedList 特有方法,不能使用多态了

LinkedList 的方法 

1.添加的方法

 2.获取的方法

 3.移除的方法

 五、Set接口

继承了Collection,

特点:1.没有索引,没有带索引的方法,也不能for循环遍历 2.不允许存储重复元素

主要看他的实现类,HashSet和LinkedHashSet

六、HashSet集合

实现了Set接口

特点:1.不允许存储重复元素 

          2.没有索引,没有带索引的方法,也不能for循环遍历

          3.是无序的集合,存储和取出数据的顺序可能不一样

          4.底层是哈希表结构(查询速度非常快)

【哈希值】

1.是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到的地址,不是数据实际存储的物理地址)

2. 在Object类有一个方法int hashCode 返回该对象的哈希码值 

hashCode方法源码:public native int hashCode();

native :代表该方法调用的是本地操作系统的方法

说到这,我们想起了之前的toString方法,看一下他的源码: 

3.也可以重写hashCode方法

重写之后调用hashCode方法,返回的值虽然一样,但是对象并不一样

4.String类是重写了hashCode的

【哈希表】

是HashSet集合存储数据的结构

特点:查询速度很快

在jdk1.8之前:哈希表=数组+链表

jdk1.8之后:哈希表=数组+链表;哈希表=数组+红黑树(可以提高查询效率)

哈希表:初始容量是16;将元素进行分组,相同哈希值的元素是一组,以链表/红黑树结构连接

1.8之后当一组的元素超过8个,会转换成红黑树

哈希冲突:两个元素不同,但是哈希值相同。

Set集合存储元素不重复的原理:

Set集合在调用add方法时,会先调用元素的hashCode方法和equals方法,判断元素是否重复

Set集合存储元素不重复的前提:所存储的元素类型必须重写hashCode方法和equals方法

保证Set集合元素唯一:重写hashCode方法和equals方法

如果不重写对象的equals方法,则比较的是两个对象的地址值

如果不重写对象的hashCode方法,操作系统会随机匹配hashcode值

 七、LinkedHashSet集合

是HashSet的子类

特点:底层是一个哈希表+链表:多了一条链表,用来记录元素的存储顺序,保证元素有序 

 八、Collections

是操作集合的工具类

Collections的方法:

 addAll,统一添加

shuffle,打乱顺序

 

 sort(实现Comparable的方法)

如果泛型用的是String也可以,因为 Integer和String都实现了Compareable接口,为了重写这个接口里CompareTo方法(排序的方法)

sort方法(Comparaor)

 

需要重写 Comparator里的compare方法,

也可以用于自定义的类,但是要重写compare这个方法

如果自定义一个Person类,要用这个sort方法时,重写compare这个方法。如下


http://chatgpt.dhexx.cn/article/G9A51m7I.shtml

相关文章

Java中List集合与Set集合

目录 一、List 集合 1、List 接口特点 2、List 接口中常用的方法 3、List 集合存储数据结构 4、ArrayList 集合ArrayList 集合是最常用的集合&#xff0c;是用存储数据结构&#xff0c;元素增删慢&#xff0c;查找快。 5、LinkedList 集合 6、Vector 集合 二、Set 接口…

Java中的集合类

Java中所有的类都位于java.util包下&#xff0c;主要由两个接口派生出来。分别是Collection&#xff08;集合&#xff09;和Map.Collection&#xff08;映射集合&#xff09;&#xff0c;包含了List和Set两大分支。Map是一个映射接口。Set、Map、List&#xff08;集&#xff0c…

java中的集合详解

Collection接口和Map接口 1 Collection集合 1.1 集合概述 集合&#xff1a;集合是java中提供的一种容器&#xff0c;可以用来存储多个数据。集合和数组既然都是容器&#xff0c;它们有啥区别呢&#xff1f; 数组的长度是固定的。集合的长度是可变的。 数组中存储的是同一类型的…

java中的集合

1.集合概述 Java的集合框架是由很多接口、抽象类、具体类组成的&#xff0c;都位于java.util包中。 2.Collection接口 Collection 接口&#xff0d;定义了存取一组对象的方法&#xff0c;其子接口Set和List分别定义了存储方式。Set 中的数据对象没有顺序且不可以重复。 List…

Java——集合(超详细超级全)

集合 Java 集合类可以用于存储数量不等的多个对象&#xff0c;还可用于保存具有映射关系的关联数组。 在这里主要讲一些我们平常很常用的一些接口和一些实现类。 Java 集合可分为 Collection 和 Map 两种体系&#xff1a; Collection接口&#xff1a;单列数据&#xff0c;定…

java集合(超详细)

1 - 概述 所有的集合类和集合接口都在java.util包下。 在内存中申请一块空间用来存储数据&#xff0c;在Java中集合就是替换掉定长的数组的一种引用数据类型。 2 - 集合与数组的区别 长度区别 数组长度固定&#xff0c;定义长了造成内存空间的浪费&#xff0c;定义短了不够用…

java创建多线程的方法

Java中是可以创建多个线程的&#xff0c;每个线程都有自己的名字和时间戳。下面我们来看看创建多个线程的方法。 创建多个线程&#xff0c;需要使用到 Thread类中的 create方法。需要注意的是&#xff0c;不是所有的线程都可以使用 create方法来创建&#xff0c;只有当这些线程…

Java创建多线程的五种方法

Java创建多线程的五种方法 Java创建多线程的五种方法&#xff08;一&#xff09;继承Thread类1&#xff0e;实现描述2&#xff0e;具体步骤3&#xff0e;代码实现4&#xff0e;注意事项 &#xff08;二&#xff09;实现Runnable接口1&#xff0e;实现描述2&#xff0e;具体步骤…

Java创建线程(Lambda表达式创建线程)

一、创建线程三种方式 1.1 继承Thread类创建线程类&#xff08;main线程与t线程交替执行&#xff09; 1.2 通过Runnable接口创建线程类 弊端是:不能直接使用Thread中的方法需要先获取到线程对象后,才能得到Thread的方法,代码复杂 上述代码中Thread.currentThread()方法返回当…

java创建线程的四种方法

第一种: 通过继承Thread类创建线程 第二种: 通过实现Runnable接口创建线程 这两种早已烂记于心,这里就不作过多的介绍, 主要介绍其源码 Thread类 implements Runnable thread空线程的run方法 是判断target是否存在实,再执行target实例中的run方法 public void run(){if(th…

Java创建线程

目录 既然说到线程&#xff0c;在这里就给大家普及一下线程。 线程&#xff08;Thread&#xff09;&#xff1a; 那么&#xff0c;进程是什么呢&#xff1f; 接下来&#xff0c;就让我们步入主题&#xff1a; 在 Java 中&#xff0c;是这样说线程的&#xff1a; 创建一个新…

Java创建多线程的8种方式

目录 1、继承Thread类&#xff0c;重写run()方法 2、实现Runnable接口&#xff0c;重写run() 3、匿名内部类的方式 4、带返回值的线程(实现implements Callable<返回值类型>)————以上3种方式&#xff0c;都没有返回值且都无法抛出异常。 5、定时器(java.util.Timer)…

java如何创建线程

java如何创建线程 1. java如何创建线程1.1 通过继承Thread类来创建线程1.2 通过实现Runnable接口来创建线程1.3 通过匿名内部类来创建线程1.4 lambda表达式1.5 通过实现Runnable接口的方式创建线程目标类的优缺点 1. java如何创建线程 一个线程在Java中使用一个Thread实例来描…

Java多线程 - Java创建线程的4种方式

文章目录 1. Java创建线程有哪几种方式&#xff1f;1.1 线程创建方法一&#xff1a;继承Thread类创建线程类1.2 线程创建方法二&#xff1a;实现Runnable接口创建线程目标类1.5 线程创建方法三&#xff1a;使用Callable和FutureTask创建线程1.6 线程创建方法四&#xff1a;通过…

java创建线程的四种方式

1&#xff09;继承Thread类创建线程 如图所示: //继承Thread类 class Aclass extends Thread{//输出100以内的偶数Overridepublic void run() {for (int i 1; i <100; i) {System.out.println(getName()":"i);}} } 测试: Thread t1 new Aclass();t1.setName…

Java创建线程的七种方法,全网最全面总结~

目录 前言 一、继承Thread&#xff0c;重写run方法 二、实现Runnable接口&#xff0c;重写run方法 三、使用匿名内部类创建 Thread 子类对象 四、使用匿名内部类&#xff0c;实现Runnable接口 五、lambda表达式 六、实现Callable接口 七、使用线程池创建线程 前言 属于基…

java创建线程(Thread)的5种方式

java创建线程&#xff08;Thread&#xff09;的5种方式 方式一&#xff1a;继承于Thread类方式二&#xff1a;实现Runnable接口方式三&#xff1a;实现Callable接口方式四&#xff1a;使用线程池方式五&#xff1a;使用匿名类 方式一&#xff1a;继承于Thread类 步骤&#xff1…

前端开发与vscode开发工具介绍

文章目录 1、前端开发2、vscode安装和使用2.1、下载地址2.2、插件安装2.3、设置字体大小2.4、开启完整的Emmet语法支持2.5、创建项目2.6、保存工作区2.7、新建文件夹和网页 1、前端开发 前端工程师“Front-End-Developer”源自于美国。大约从2005年开始正式的前端工程师角色被…

IntelliJ IDE 插件开发指南

作者介绍 洪进锋&#xff0c;字节跳动后端研发工程师&#xff0c;参与过高并发系统&#xff08;百万QPS&#xff09;设计与研发工作。在开源项目方面混过 Sharding-JDBC 的 PR。个人开发的 IntelliJ IDE 插件 Redis Manager&#xff0c;目前在官方插件库中下载量 30K&#xff0…

真的要转到云IDE了吗?VS Code的开源IDE

云IDE产品介绍 云IDE使用教程 免费使用地址&#xff1a;点击【云IDE】&#xff0c;即可开始创建工作空间啦~ 前言 CSDN最新产品【云IDE】来啦&#xff01;【云IDE】将为各位技术er一键秒级构建云开发环境&#xff0c;提升开发效率&#xff01; 1. 什么是IDE&#xff1f; 做…