java集合类详解

目录

1、数组导入:

2、单列集合

List接口

1、ArrayList:数组列表

ArrayList类中的方法

2、LinkedList:链表列表

3、Vector:数组列表

4、list集合的遍历

1、for循环遍历

2、增强for循环

3、迭代器遍历

Set接口

1、HashSet

​编辑

2、TreeSet

3、双列集合

map接口

1、HashMap

HashMap的底层结构:

HashMap的遍历 

2、HashTable

3、TreeMap


1、数组导入:

容器---->数组:

一组数据类型相同的元素集合
创建数组时,必须给定长度,而且一旦创建长度不能变。
一旦数组装满元素,需要创建一个新的数组,将元素复制过去。
缺点:
如果我们从数组中间删除了一个元素或者添加一个元素,需要移动后面的元素。
如果数组装满了,超过了数组的最大长度,会创建新的数组将旧数组复制到新数组上。

java中为了解决数据存储单一的情况,提供了许多不同结构的集合类。让我们可以根据不同的场景进行数据存储选择。

 提供了数组实现的集合,链表实现的集合,哈希结构,树结构... 让iava程序员使用起来就非常方便。

2、单列集合

单例集合指的是:一次放进去一个值(对象)。集合实现Collection接口,定义了单例集合共有的方法。

List接口

特点:List类中可以有重复元素

1、ArrayList:数组列表

底层有一个数组,可以动态扩展数组的长度,并提供一个一系列方法操作。

特点:查询快, 中间增加、删除慢。

ArrayList类中的方法
arrayList.add()--->添加
arrayList.remove()---->删除
arrayList.get()----->获取指定位置上的元素
arrayList.indexOf()----->查找给定元素第一次出现的位置
arrayList.lastIndexOf()---->从后往前查找指定元素第一次出现的位置
arrayList.set(int index,E element)---->将指定位置上的元素替换并返回原来的值arrayList.clear()----->清空
arrayList.isEmpty()----->判断是否为空
arrayList.contains()----->判断是否包含指定元素
arrayList.size()----->返回集合中元素的个数

public class Demo3 {public static void main(String[] args) {ArrayList arrayList = new ArrayList();arrayList.add("a");arrayList.add("b");arrayList.add("c");arrayList.add("d");arrayList.add("e");System.out.println(arrayList.remove("b"));//boolean类型,根据内容删除匹配的第一个元素,删除成功返网true,否则返回falseSystem.out.println(arrayList.remove(1));//删除并返回指定位置的值System.out.println(arrayList.get(1));//获取指定位置上的元素System.out.println(arrayList.indexOf("d"));//查找第一次出现的位置System.out.println(arrayList.lastIndexOf("d"));//从后查找,第一次出现的位置System.out.println(arrayList.set(1, "v"));//将指定位置上的元素替换并返回原来的值arrayList.clear();System.out.println(arrayList.isEmpty());System.out.println(arrayList.contains("c"));//判断是否包含指定元素System.out.println(arrayList.size());//返回集合中元素的个数for (int i = 0; i < arrayList.size(); i++) {System.out.println(arrayList.get(i));}}
}

2、LinkedList:链表列表

底层是一个链表结构。

特点:查询慢,增加、删除快

linkedList.add("a")---->向链表末尾添加元素
linkedList.add(2, "y")---->向链表指定的位置插入元素
linkedList.get(2)----->获取指定位置上的元素
linkedList.remove("y")----->删除
linkedList.remove(1)------>删除并返回指定元素的值
linkedList.removeFirst())----->删除第一个元素并返回其值
linkedList.pop()----->出栈
linkedList.clear()------>清空
linkedList.contains()----->判断是否包含指定元素
linkedList.isEmpty()----->判断是否为空
linkedList.size()----->返回集合中元素的个数

3、Vector:数组列表

特点:相对于ArrayList是线程安全的。其他与arraylist相似。、

4、list集合的遍历

1、for循环遍历

允许操作(删除)元素的.

(注意索引的变化与元素位置的移动)


public class List1 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<String>();arrayList.add("a");arrayList.add("b");arrayList.add("r");System.out.println(arrayList);/*List 接口实现类/List集合遍历方式1、for循环遍历,允许操作(删除)元素的.注意索引的变化与元素位置的移动*/for (int i = 0; i < arrayList.size(); i++) {if ("a".equals(arrayList.get(i))) {arrayList.remove("a");i--;}}System.out.println(arrayList);}
}
2、增强for循环

增强for循环遍历元素时, 不允许修改集合元素(删除,添加)


public class List2 {/*List接口实现类/List集合遍历方式2:增强for循环增强for循环遍历元素时,  不允许修改集合元素(删除,添加)*/public static void main(String[] args) {ArrayList<String> arrayList=new ArrayList<>();arrayList.add("a");arrayList.add("b");arrayList.add("r");for(String s:arrayList){//arrayList.remove("a");ConcurrentModificationException报错System.out.println(arrayList);}System.out.println(arrayList);}
}
3、迭代器遍历

迭代器只能对list接口下的实现类遍历


public class List3 {public static void main(String[] args) {ArrayList<String> arrayList = new ArrayList<String>();arrayList.add("a");arrayList.add("b");arrayList.add("r");/*List接口实现类/List集合遍历方式3:使用迭代器遍历获得集合对象的选代器对象*/Iterator<String> it = arrayList.iterator();while (it.hasNext()) {//判断数组是否遍历完成  0!=3,next,3==3,false结束String s = it.next();//获取到下一个元素if (s.equals("a")) {it.remove();//使用迭代器对象删除元素}System.out.println(arrayList);}}
}


//迭代器2
public class List4 {public static void main(String[] args) {ArrayList<String> arrayList=new ArrayList<>();arrayList.add("a");arrayList.add("b");arrayList.add("f");arrayList.add("b");arrayList.add("g");System.out.println(arrayList);System.out.println("从指定位置往后遍历");ListIterator<String> listIterator=arrayList.listIterator(2);//while(listIterator.hasNext()){System.out.println(listIterator.next());}System.out.println("从(最后)后往前遍历");ListIterator<String> listIterator1=arrayList.listIterator(arrayList.size());//while (listIterator.hasPrevious()){System.out.println(listIterator.previous());}}
}

Set接口

特点:Set类中不能有重复元素

1、HashSet

无序的,通过hashCode和equals方法判断元素是否有序。
在添加元素时,是如何判断元素重复的:(当我们向集合中添加一个元素时,如果每次都使用equals()比较内容是否相等效率会很低)
因此该如何比较呢?先判断hashcode()值是否相等,如果相等,不一定内容相同,即此情况下会出现哈希冲突,再用equals()比较内容。在底层会先调用hashcode()-- 0bject中的hashcode()返回的是对象的地址(但是我们不调用这个) 我们需要:调用类中重写的Hashcode(),返回的是根据内容计算的哈希值遍历时,会用哈希值先比较是否相等,会提高比较的效率,但是哈希值会存在问题。内容不同,哈希相同此种情况下,再调用equals()比较内容,这样设计既提高判断效率,又保证安全。
   public static void main(String[] args) {HashSet<String> set=new HashSet<>();set.add(new String("asdfgdfgdfgsa"));set.add("bgbgbgghjdnbu");set.add("通话");set.add("重地");for(String s:set){System.out.println(set);}}

2、TreeSet

有序的,可以给Set集合中的元素进行指定方式的排序。存储的对象必须实现Comparable接口。
 可以给Set集合中的元素进行指定方式的排序。存储的对象必须实现Comparable接口。
特点: 
1、有序的
2、不能存储重复元素的
3、存储时可以根据值进行排序,底层使用了树形结构,树结构本身即是有序的
向树形结构中添加元素时,如何判断元素大小以及元素是否重复?向TreeSet中添加的元素类型,必须实现Comparable接口,重写compareTo方法每次添加元素时,调用compareTo()方法进行比较大小(第一个为根节点,比他大的在右边,比它小的在左边)
package A_集合单例.Set.TreeSet;import java.util.Objects;public class Student implements Comparable<Student> {private String name;private int num;public Student(String name, int num) {this.name = name;this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getNum() {return num;}public void setNum(int num) {this.num = num;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Student)) return false;Student student = (Student) o;return getNum() == student.getNum() &&Objects.equals(getName(), student.getName());}@Overridepublic int hashCode() {return Objects.hash(getName(), getNum());}@Overridepublic String toString() {return "Student{" +"name='" + name + '\'' +", num=" + num +'}';}@Overridepublic int compareTo(Student o) {return this.num - o.num;}
}package A_集合单例.Set.TreeSet;import java.util.TreeSet;public class StudentTest {public static void main(String[] args) {TreeSet<Student> treeSet=new TreeSet<>();Student s1=new Student("张三1",103);Student s2=new Student("张三2",101);Student s3=new Student("张三3",102);Student s4=new Student("张三4",104);treeSet.add(s1);treeSet.add(s2);treeSet.add(s3);treeSet.add(s4);System.out.println(treeSet);}}

3、双列集合

map接口

map接口:

数据存储是(键:值)键值对的形式存储。
键不能重复的,(重复了覆盖原键),值可以重复
通过键可以找到值
一个键只能映射到一个值

1、HashMap

键是无序的,可以存储键为空,值为空的值。
{public static void main(String[] args) {HashMap<String, String> map = new HashMap<>();map.put("a","ddd");map.put("b","eee");map.put("c","fff");map.put("e","ttt");map.put("a","dd");//向map中添加一组 键值对System.out.println(map.remove("b"));//删除指定的键值,返回对应的值map.clear();//清空键值对System.out.println(map.isEmpty());//判空System.out.println(map.containsKey("b"));System.out.println(map.containsValue("eee"));System.out.println(map.get("c"));System.out.println(map);}
}
HashMap的底层结构:
哈希表(数组)
链表
红黑树

对于HashMap详细的讲解可看,(讲解很清楚):https://blog.csdn.net/Wooo_e/article/details/136974366?spm=1001.2014.3001.5501

HashMap的遍历 

HashMap两种遍历方式:

1、根据键找值

2、利用map.Entry键值对的查找

package B_集合双列.hashmap;import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class Demo2 {/*1、用key计算哈希值static final int hash(Object key) {int h;return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}2、public V put(K key, V value) {return putVal(hash(key), key, value, false, true);}*/public static void main(String[] args) {HashMap<String,String> map=new HashMap<>();map.put("a","aa");map.put("b","bb");map.put("c","ccc");map.put(null,null);System.out.println(map);//map遍历//方式1、先拿到所有的键  遍历键  根据键找值Set<String> keyset = map.keySet();for(String s: keyset) {System.out.println(s + ":" + map.get(s));}//方式2、推荐的遍历Set<Map.Entry<String, String>> entries = map.entrySet();for(Map.Entry entry:entries){System.out.println(entry.getKey()+":"+entry.getValue());}}
}

2、HashTable

HashTable的底层实现:
也是用到key的哈希值,计算位置,判断元素是否重复。
但是方法上都添加了synchronized锁
Hashtbale中不能存储为null的键和为null的值
package B_集合双列.hashtable;import java.util.Hashtable;public class Demo1 {
public static void main(String[] args) {Hashtable<String,String> hashtable=new Hashtable<>();hashtable.put("a","bb");hashtable.put("c","cc");hashtable.put("b","ff");hashtable.put("a","aa");//hashtable.put("d",null);//报错System.out.println(hashtable);
}
}

3、TreeMap

 TreeMap底层使用树形结构存储键值(红黑树)键可以排序键元素类型必须实现Comparable接口,重写compareTo()方法.

在TreeMap中,可以存储值为null,但是键不能为null。

package B_集合双列.TreeMap;import java.util.TreeMap;public class Demo1 {public static void main(String[] args) {TreeMap<Integer,String> treeMap=new TreeMap<>();treeMap.put(3,"aa");treeMap.put(2,"bb");treeMap.put(1,"ff");treeMap.put(4,"jj");treeMap.put(5,"oo");System.out.println(treeMap.get(3));System.out.println(treeMap.containsKey(2));System.out.println(treeMap.size());System.out.println(treeMap);}}

持续更新ing........ 

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

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

相关文章

data studio连接到虚拟机上的openGauss

参考&#xff1a;使用DataStudio连接本地虚拟机中的opengauss数据库_big data_白日梦想家_胖七七-华为云开发者联盟 本实验虚拟机安装的是CentOS7 数据库版本是&#xff1a;openGauss-5.0.2-CentOS-64bit-all.tar.gz 1.配置pg_hba.conf 首先使用su - omm登录到omm用户&…

MySQL数据库,创建表及其插入数据和查询数据

首先&#xff0c;由上图创建表 mysql> create table worker( -> dept_id int(11) not null, -> emp_id int (11) not null, -> work_time date not null, -> salary float(8,2) not null, -> poli_face varchar(10) not null default 群众, -> name…

华为设备WLAN基础配置

WLAN基础配置之AP上线 配置WLAN无线网络的第一阶段&#xff0c;AP上线技术&#xff1a; 实验目标&#xff1a;使得AP能够获得来自AC的DHCP地址服务的地址&#xff0c;且是该网段地址池中的IP。 实验步骤&#xff1a; 1.把AC当作三层交换机配置虚拟网关 sys Enter system view…

安卓CardView使用

目录 前言一、基础使用1.1 依赖导入1.2 CardView的常用属性1.3 CardView继承关系 二、关于Z轴的概念三、CardView效果3.1 圆角 CardView3.2 阴影 CardView3.3 设置卡片背景3.4 设置卡片背景&#xff08;内部颜色&#xff09;3.5 同时设置背景颜色 前言 CardView是Android支持库…

WXML模板语法-数据绑定

1.数据绑定的基本原则 (1)在data中定义数据 (2)在WXML中使用数据 2.在data页面中定义数据&#xff1a;在页面对应的.js文件中&#xff0c;把数据定义在data对象中即可 &#xff08;这里打错了 应该是数组类型的数据... 报意思啊&#xff09; 3.Mustache语法的格式 把data中的…

低代码开发平台:开启企业数字化转型的快捷通道

低代码开发平台&#xff08;Low-Code Development Platform&#xff09;是近年来企业数字化转型中备受瞩目的技术工具&#xff0c;其被誉为加速业务上线的利器。随着信息技术的迅猛发展&#xff0c;企业对于数字化的需求与日俱增&#xff0c;但传统的软件研发流程往往耗时耗力&…

MATLAB|【免费】融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型

目录 主要内容 部分代码 部分结果一览 下载链接 主要内容 该程序实现多输入单输出预测&#xff0c;通过融合正余弦和柯西变异改进麻雀搜索算法&#xff0c;对CNN-BiLSTM的学习率、正则化参数以及BiLSTM隐含层神经元个数等进行优化&#xff0c;并对比了该改进算法…

摄像头应用测试

作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…

Linux 信号捕捉与处理

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; ​ 目录 前言 1. 信号的处理时机 1.1用户…

【排版问题解决】word加入公式时字间距突然变大

出现以下问题 解决方案 第一步:选择段落 第二步 段落括起来后右键选择“段落”- 第三步 “换行和分页”-在换行里打勾“允许西文在单词中间换行”。 恢复格式

vue.js状态管理和服务端渲染

状态管理 vuejs状态管理的几种方式 组件内管理状态&#xff1a;通过data&#xff0c;computed等属性管理组件内部状态 父子组件通信&#xff1a;通过props和自定义事件实现父子组件状态的通信和传递 事件总线eventBus&#xff1a;通过new Vue()实例&#xff0c;实现跨组件通…

LP-MSPM03507学习资料汇总

(因对MSPM0研究不够深入,故暂不开启浏览权限,权当记录学习。但愿尽快掌握供大家免费阅读。有意者可私信我共同学习) 一、延时函数 1、滴答定时器SYSTICK 1.1 SysConfig配置 配置1ms延时函数,并开启中断 1.2 编写延时函数delay_ms unsigned int utick = 0;//滴答定时器中…

57. UE5 RPG 处理AI敌人转向以及拾取物品的问题

在上一篇文章中&#xff0c;我们实现了使用AI行为树控制敌人进行移动&#xff0c;它们可以一直跟随玩家&#xff0c;虽然现在还未实现攻击。但在移动过程中&#xff0c;我发现了有两个问题&#xff0c;第一个是敌人转向的时候很僵硬&#xff0c;可以说是瞬间转向的&#xff0c;…

Vue3实战笔记(39)—封装页脚组件,附源码

文章目录 前言一、封装页脚组件二、使用组件总结 前言 在Web开发中&#xff0c;页脚组件是一个重要的部分&#xff0c;它为用户提供关于网站的信息、导航链接以及版权声明等。而封装页脚组件则是一种高效的方法&#xff0c;可以提高代码的可重用性和可维护性。 一、封装页脚组…

重生之我要精通JAVA--第五周笔记

文章目录 APIJDK7时间Date时间类CalendarSimpleDateFormat 类SimpleDateFormat 类作用 JDK8时间Zoneld时区 包装类Integer成员方法 Arrays Lambda表达式标准格式注意点好处省略写法 集合进阶Collection迭代器遍历Collection集合获取迭代器Iterator中的常用方法细节注意点 增强f…

机器学习势系列教程(3):cp2k的安装

大家好&#xff0c;我是小马老师。 本文继续介绍机器学习势相关内容&#xff1a;cp2k的安装。 和abacus一样&#xff0c;cp2k也是一款开源的第一性原理模拟软件&#xff0c;模拟的数据也可作为机器学习势的训练数据集。 cp2k安装方法也很多&#xff0c;常见的有docker安装、…

2024年中国电机工程学会杯数学建模思路 - 案例:最短时间生产计划安排

# 前言 2024电工杯(中国电机工程学会杯)数学建模思路解析 最新思路更新(看最新发布的文章即可): https://blog.csdn.net/dc_sinor/article/details/138726153 最短时间生产计划模型 该模型出现在好几个竞赛赛题上&#xff0c;预测2022今年国赛也会与该模型相关。 1 模型描…

安当SLA操作系统双因素认证——成功解决Windows远程桌面登录的安全问题

Windows远程桌面登录的安全风险主要包括以下几个方面&#xff1a; 弱密码和暴力破解&#xff1a;如果远程桌面用户使用了弱密码&#xff0c;或者密码被泄露&#xff0c;攻击者可能会使用暴力破解技术来尝试猜测密码&#xff0c;从而获取远程桌面的访问权限。中间人攻击&#x…

【编译原理复习笔记】语法分析-补充(二义性与LR错误处理)

二义性文法的 LR 分析 每个二义性文法都不是 LR 的 但是某些二义性文法更加简短&#xff0c;描述更方便 如 I7 和 I8 具有移进归约冲突 使用优先级和结合性解决冲突 对于 I7&#xff0c;由于乘号优先级高于加号&#xff0c;所以当下一个输入符号为乘号时&#xff0c;我们优…

pdfbox pdf转换图片时中文丢失,变成方框,提示No glyph for xxx in font STSong-Light

使用pdfbox转换图片时&#xff0c;转换出来的图片中文丢失&#xff0c;变成方框。原因是由于服务器字体缺失&#xff0c;pdfbox在转换时找不到合适的字体。 有几种方案&#xff1a; 服务器安装字体&#xff0c;具体资源百度使用备用字体。 将pdfbox中的FontMapperImpl类&…