Java集合简略记录

一、集合体系结构

        单列集合:Collection

        双列集合:Map

二、单列集合

List系列集合:添加的元素是有序、可重复、有索引
有序指的是存和取的顺序是一致的,和之前排序的从小到大是没有任何关系的

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

2.1、Collection

Collection是单列集合的祖宗接口,它的功能是全部单列集合都可以继承使用的。

public boolean add(E e)把给定的对象添加到当前集合中
public void clear()清空集合中所有的元素
public boolean remove(E e)把给定的对象在当前集合中删除
public boolean contains(Object obj)判断当前集合中是否包含给定的对象
public boolean isEmpty()判断当前集合是否为空
public int size()返回集合中元素的个数/集合的长度

代码实例

2.1.1、添加元素

public class CollectionTest {public static void main(String[] args) {/*Collection是一个接口,我们不能直接创建他的对象所以,现在我们为了学习Collection的方法时,只能创建他实现类的对象。实现类:ArrayList 作为一个例子目的:为了学习Collection接口里面的方法*///自己练习的时候按照自己的方式创建就行Collection<String> collection =new ArrayList<>();//添加元素//细节一:如果我们要往List系列集合中添加元素,那么方法永远返回true,因为List系列的是允许元素重复的。//细节二:如果要往Set系列集合中添加元素,如果当前要添加元素不存在,方法返回true,表示添加成功。//                                如果当前要添加元素已经存在,方法返回false,表示添加失败。//                                因为Set系列的集合不允许元素重复。collection.add("张三");collection.add("李四");collection.add("王五");System.out.println(collection);}
}

运行结果:

2.1.2、清空集合

public class CollectionTest {public static void main(String[] args) {Collection<String> collection =new ArrayList<>();collection.add("张三");collection.add("李四");collection.add("王五");System.out.println(collection);//清空集合collection.clear();System.out.println(collection);}
}

运行结果:

2.1.3、删除元素

package cn.ysy.collection;import java.util.ArrayList;
import java.util.Collection;public class CollectionTest {public static void main(String[] args) {Collection<String> collection =new ArrayList<>();collection.add("张三");collection.add("李四");collection.add("王五");System.out.println(collection);//删除//细节一:因为Collection里面定义的是共性的方法(要同时兼顾到List和Set),所以此时不能通过索引进行删除,只能通过元素的对象进行删除。//细节二:方法会有一个布尔类型的返回值,删除成功返回ture,删除失败返回false。System.out.println(collection.remove("张三"));System.out.println(collection);}
}

运行结果:

2.1.4、判断元素是否存在

public class CollectionTest {public static void main(String[] args) {Collection<String> collection =new ArrayList<>();collection.add("张三");collection.add("李四");collection.add("王五");System.out.println(collection);//判断元素是否包含//细节:底层是依赖equals方法进行判断是否存在的。//所以,如果集合中存储的是自定义对象,也想用过contains方法来判断是否包含,那么在javabean类中,一定要重写equals方法。//在String中,==比较引用地址是否相同,equals()比较字符串的内容是否相同System.out.println(collection.contains("张三"));}
}

运行结果:

引申:如果是自定义对象,又该怎么比较呐?

创建一个User实体类:

public class User {private String name;private int age;public User() {}public User(String name, int age) {this.name = name;this.age = age;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "User{name = " + name + ", age = " + age + "}";}//重写equals方法@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;User user = (User) o;return age == user.age && Objects.equals(name, user.name);}}

再写一个Collection测试类:

public class CollectionTest02 {public static void main(String[] args) {//1.创建集合对象Collection<User> collection =new ArrayList<>();//2.创建三个用户对象User user1 = new User("张三", 20);User user2 = new User("李四", 21);User user3 = new User("王五", 22);//3.将User对象添加到集合中collection.add(user1);collection.add(user2);collection.add(user3);//4.判断集合中某一个use对象是否包含User user4 = new User("张三", 20);//如果同姓名和年龄,则认为是同一个用户,结果应该是true,但是真实运行结果却是false//因为contains方法底层调用的是equals方法//如果存的是自定义对象,没有重写equals,那么默认使用Object类中的equals方法进行判断//而Object类中的equals方法比较的是地址值//需求:如果同姓名和年龄,则认为是同一个用户,结果应该是true//所以,需要在自定义的javabean类中,重写equals方法就可以了System.out.println(collection.contains(user4));}
}

没重写equals方法的话,打印结果是false,重写之后,打印结果就是true了

2.1.5、判断集合是否为空和获取集合长度

public class CollectionTest {public static void main(String[] args) {Collection<String> collection =new ArrayList<>();collection.add("张三");collection.add("李四");collection.add("王五");System.out.println(collection);//判断集合是否为空System.out.println(collection.isEmpty());//获取集合的大小System.out.println(collection.size());}
}

运行结果:

2.1.6、Collection的遍历方式

迭代器遍历

增强for遍历

lambda表达式

之所以不用普通的for遍历,因为set集合中没有索引,所以不能通过普通for进行遍历

2.1.6.1、迭代器遍历 

迭代器在java中的类是Iterator,迭代器是集合专用的遍历方式。

迭代器遍历集合的时候是不依赖索引的


Collection集合获取迭代器
Iterator<E> iterator()                          返回迭代器对象,默认指向当前集合的0索引


Iterator中的常用方法

boolean hasNext()                             判断当前位置是否有元素,有元素返回tru额,反之false

E next()                                              获取当前位置的元素,并将迭代器对象移向下一个位置

public class CollectionIteratorTest {public static void main(String[] args) {Collection<String> collection =new ArrayList<>();//添加元素collection.add("a");collection.add("b");collection.add("c");collection.add("d");//创建迭代器Iterator<String> iterator = collection.iterator();//利用迭代器遍历集合while(iterator.hasNext()){String result = iterator.next();System.out.println(result);}}
}

细节注意点:

1、当遍历完成时,还强行调用next()方法取获取元素时,就会报错NoSuchElementException

2、迭代器遍历完毕,指针不会复位

3、循环中智能用一次next方法

4、迭代器遍历时,不能用集合的方法进行增加或者删除

2.1.6.2、增强for遍历 
  • 增强for的底层就是迭代器,为了简化迭代器的代码书写的
  • 它是JDK5之后出现的,其内部原理就是一个Iterator迭代器
  • 所有的单列集合和数组才能用增强for进行遍历

格式:

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


}

idea快捷生成    集合名.for




增强for的细节:

修改增强for中的变量,不会改变集合中原本的数据

for(String s : list){System.out.println(s);
}
2.1.6.3、Lambda表达式遍历

得益于JDK8开始的新技术Lambda表达式,提供了一种更简单、更直接的遍历集合的方式。

collection.forEach(s -> System.out.println(s));

 2.2、List

  • Collection的方法List都继承了
  • List集合因为有索引,所以多了很多索引操作的方



    void add(int index,E element)      在此集合中的指定位置插入指定的元素

    E remove(int index)                      删除指定索引处的元素,返回被删除的元素

    E set(int index,E element)            修改指定索引处的元素,返回被修改的元素

    E get(int index)                              返回指定索引处的元素




    细节:利用remve删除元素时,如果类型是整数,那么此时删除的是1这个元素,还是1索引上的元素?为什么?

    因为在调用方法的时候,如果方法出现了重载现象,有限调用:实参跟形参类型一致的那个方法。
    比如:list.remove(1)  删除的就是1索引位置的元素



    如果要删除整数1,则可以手动装箱,将基本数据类型的1,变成Integer类型

    Integer i = Integer.valueOf(1);
    list.remove(i);//  此时删除的就是元素1了

2.3.1、List集合的遍历方式

2.3.1.1、迭代器
//迭代器Iterator<String> iterator = list.iterator();while (iterator.hasNext()){String next = iterator.next();System.out.println(next);}
2.3.1.2、列表迭代器
//列表迭代器遍历
//获取一个列表迭代器的对象,里面的指针默认也是指向0索引的 
//额外添加了一个方法;在遍历的过程中,可以添加元素ListIterator<String> it = list.listIterator();while (it.hasNext()){String next = it.next();if ("2".equals(next)){it.add("qqqq");}}System.out.println(list);

不能使用集合的方法取添加,比如list.add()会报错并发修改异常,所以要用迭代器本身的方法进行添加

结果:

2.3.1.3、增强for
//增强forfor (String s : list) {System.out.println(s);}
2.3.1.4、Lambda表达式
//Lambda表达式list.forEach(s -> System.out.println(s));
2.3.1.5、普通for循环
//普通for循环遍历for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));}

2.3.2、五种遍历方式的对比

2.3、数据结构

2.3.1、栈

栈的特点 :先进后出

数据进入栈模型的过程称为:压/进栈

数据离开栈模型的过程称为:弹/出栈 

2.3.2、队列 

队列特点:先进先出

数据从后端进入队列模型的过程称为:入队列

数据从前端离开队列模型的过程称为:出队列

2.3.3、数组 

数组是一种查询快,增删慢的模型

查询速度快:查询数据通过地址值和索引定位,查询任意数据耗时相同。(元素在内存中是连续存储的)

删除效率低:要将原始数据删除,同时后面每个数据前移

添加效率低:添加位置后的每个数据后移,再添加元素

2.3.4、链表 

链表中的结点是独立的对象,在内存中是不连续的,每个结点包含数据值和下一个结点的地址。

链表查询慢,无论查询哪个数据都要从头开始找

链表增删相对快

2.3.5、树

二叉查找树:

添加节点规则:

遍历方式:

前序遍历:

中序遍历:

后序遍历:

层序遍历:

平衡二叉树:

红黑树:

2.4、ArrayList 

底层原理:

源码分析

情况一:初始长度为0

情况二:当集合长度满时

2.5、LinkedList

源码分析

2.6、迭代器源码

2.7、泛型 

泛型的好处:


2.8、Set

2.9、HashSet

2.10、LinkedHashSet

2.11、TreeSet

三、双列集合

3.1、Map

3.1.1、Map的三种遍历方式

3.2、HashMap

3.3、LinkedHashMap

3.4、TreeMap

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

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

相关文章

webrtc vp8/9视频编解码介绍

在WebRTC中,VP8和VP9是两种常用的视频编码格式,由Google开发。这两种编码都属于开源项目,因此它们被广泛应用于需要编解码视频流的应用中,特别是在WebRTC这类实时通信技术中非常关键。 一、libvpx项目介绍 libvpx项目地址 https://chromium.googlesource.com/webm/libvpx…

拼多多笔试

拼多多2022数据分析笔试&#xff08;0822&#xff09; 一、选择题 1.已知样本量n&#xff0c;样本均值及方差求置信区间 2.决策树 3.峰度系数 4.协方差 5.第一、第二熵变 6.充分统计量 7.xgboost 8.方差分析中的多重比较 二、编程题 1. 一张用户点击路径的表&#x…

FL Studio21.2.8中文版水果音乐制作的革新之旅!

在数字化浪潮的推动下&#xff0c;音乐制作领域经历了翻天覆地的变化。从最初的模拟技术到如今的全数字化处理&#xff0c;音乐制作的门槛被大幅降低&#xff0c;越来越多的音乐爱好者和专业人士开始尝试自行创作和编辑音乐。在这个过程中&#xff0c;各种专业音乐制作软件成为…

勒索软件分析_目标文件扫描行为分析

BlackBasta首先通过 FindFirstVolumeW 与 FindNextVolumeW 实现系统中第一个卷的搜索和其余卷的遍历,之后通过 GetVolumePathNamesForVolumeNameW 检索指定卷的驱动器号和挂载的文件夹路径列表,然后通过 GetVolumeInformationW 获取关于指定卷的信息,具体代码如下所示。 Fin…

Numpy切片操作

基本切片: arr[start:stop:step]: 从索引start开始到stop结束&#xff08;不包括stop&#xff09;&#xff0c;步长为step。 省略切片: arr[:]: 复制整个数组。arr[:5]: 选择数组的前5个元素。arr[5:]: 选择从索引5开始到数组末尾的元素。 步长切片: arr[::2]: 选择数组中的每个…

几何(geometry)

题目描述 小可可最近在学习平面几何! 给定平面上的 n n n个点 ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x i , y i ) (x_1,y_1),(x_2,y_2),…,(x_i,y_i) (x1​,y1​),(x2​,y2​),…,(xi​,yi​)。 根据题目要求&#xff0c;输出下列两个值其中一个: 任意两点间欧几里得距…

yolov8逐步分解(9)_训练过程之Epoch迭代过程

yolov8逐步分解(1)--默认参数&超参配置文件加载_yolov8 加载yaml配置 预测-CSDN博客 yolov8逐步分解(2)_DetectionTrainer类初始化过程_train and val are required in all data yamls.-CSDN博客 yolov8逐步分解(3)_trainer训练之模型加载_yolov8 加载模型-CSDN博客 YOL…

TCP 建链(三次握手)和断链(四次握手)

TCP 建链&#xff08;三次握手&#xff09;和断链&#xff08;四次挥手&#xff09; 背景简介建链&#xff08;三次握手&#xff09;断链&#xff08;四次挥手&#xff09;序号及标志位延伸问题为什么建立连接需要握手三次&#xff0c;两次行不行&#xff1f;三次握手可以携带数…

智领未来,安全无忧:智能网联汽车监控大屏的守护之旅

在繁忙的都市中&#xff0c;驾驶者往往面临着诸多安全隐患。传统的驾驶辅助系统虽然能够提供一定的帮助&#xff0c;但在复杂多变的交通环境中&#xff0c;其局限性也逐渐显现。而智能网联汽车安全监控大屏&#xff0c;正是为了解决这一问题而诞生的。 山海鲸可视化大屏 大屏采…

基础篇04——多表查询

多表关系 一对多 多对多 多对多是通过中间表实现的 -- 创建学生表 create table student (id int auto_increment primary key comment ID,name varchar(10) comment 姓名,no varchar(3) comment 学号 ) comment 学生表;insert into student values (null, 黛绮丝, 001),(…

SLAM中四元数、流形、李群、李代数是啥?

知识点得逻辑关系如下 引言 非线性问题由于复杂的数学结构&#xff0c;多样的解空间&#xff0c;局部极值等问题求解难度大大增加。所以在求解时需要把非线性问题转化为更容易处理的形式&#xff0c;例如 数值优化方法&#xff1a;数值优化方法包括梯度下降、共轭梯度法、牛顿…

Spring boot实现基于注解的aop面向切面编程

Spring boot实现基于注解的aop面向切面编程 背景 从最开始使用Spring&#xff0c;AOP和IOC的理念就深入我心。正好&#xff0c;我需要写一个基于注解的AOP&#xff0c;被这个注解修饰的参数和属性&#xff0c;就会被拿到参数并校验参数。 一&#xff0c;引入依赖 当前sprin…

寒武纪:“国产平替”道阻且长

英伟达的一季报反映了AI装备竞赛白热化&#xff0c;科技巨头们正疯狂加码投资。 不过&#xff0c;因为众所周知的原因,英伟达最先进的产品卖不到国内&#xff0c;虽然说一定程度上限制了咱们AI的发展&#xff0c;但也给国产AI芯片公司们提供了机会&#xff0c;其中就包括我们今…

K8S==ingress简单搭建和使用

基础环境 D:\DOCKER_REPO\K8S>kubectl version Client Version: v1.29.2 Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3 Server Version: v1.29.2 D:\DOCKER_REPO\K8S>kubectl get nodes NAME STATUS ROLES AGE VERSION docker-…

null、未定义或未声明的变量之间有什么区别?

在 JavaScript 中,null、未定义的变量和未声明的变量之间存在以下区别: null:null 是一个特殊的值,表示"没有值"或"无"。它是一个关键字,可以被显式地赋值给一个变量。使用 typeof null 会返回 "object"(这是 JavaScript 的一个已知的设计缺陷)…

01_深度学习基础知识

1. 感知机 感知机通常情况下指单层的人工神经网络,其结构与 MP 模型类似(按照生物神经元的结构和工作原理造出来的一个抽象和简化了模型,也称为神经网络的一个处理单元) 假设由一个 n 维的单层感知机,则: x 1 x_1 x1​ 至 x n x_n xn​ 为 n 维输入向量的各个分量w 1 j…

【大学物理】Interference,diffraction,polarization:光学

nature of light definition speed of light reflection dispersion huygenss principle:惠更斯原理

OBD诊断协议

上周领导需要做个OBD相关的功能&#xff0c;我对OBD没有啥概念&#xff0c;于是周末就了解下这到底是个啥东西。了解过后发现很简单&#xff0c;其实就是个UDS协议的简化版&#xff0c;OBD是英文On-Board Diagnostics的缩写&#xff0c;中文翻译为“车载自动诊断系统”&#xf…

链表反转--理解链表指针的基本操作

链表反转--理解链表指针的基本操作 链表反转的方法--主要是理解链表指针链表心得类节点是对象和指针区别&#xff1a; 链表反转的方法–主要是理解链表指针 根据值创建新列表 用一个链表指针代替整个新链表 两个链表的赋值 递归求解反向链表 用一个链表代替前后链表数…