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.rhkb.cn/news/329785.html

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

相关文章

React渲染流程

在 React 渲染分为两个阶段&#xff0c;Render 和 Commit&#xff0c;Render 是修改 React 组件的状态&#xff0c;把需要更新的组件标记为待更新&#xff0c;在 Commit 阶段将待更新的组件进行渲染并最终更新到浏览器的 Dom 树中。 Render 阶段是可以并执行操作的&#xff0c…

vue3项目+TypeScript前端项目 ———— elemnet-plus,svg图标配置,sass,mock数据

一.集成element-plus 官网地址 安装 pnpm install element-plus 引入 // main.ts import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css import App from ./App.vueconst app createApp(App)app.use(ElementPlus) app.…

JAVA基础面试题(第十三篇)线程并发死锁等!

线程死锁并发 1. 线程和进程有什么区别&#xff1f; 线程具有许多传统进程所具有的特征&#xff0c;故又称为轻型进程(Light—Weight Process)或进程元&#xff1b;而把传统的进程称为重型进程(Heavy—Weight Process)&#xff0c;它相当于只有一个线程的任务。在引入了线程的…

JetLinks物联网平台初步使用——TCP接入

基于上一篇&#xff0c;完整的搭建了前后端整个系统&#xff0c;可以在windows 7完美的运行使用。 目录 1、创建网络组件 2、创建协议管理 3、创建网关 ​4、创建产品 ​5、创建设备 6、模拟对接 1、创建网络组件 进入平台后&#xff08;用户名密码都是admin&#xff…

GRPC服务使用

目标&#xff1a; 1.什么是GRPC服务&#xff1f; 2.安卓客户端怎么不熟GRPC服务&#xff1f; 3.怎么生成GRPC的java类&#xff1f; 一、什么是GRPC服务&#xff1f; GRPC 一开始由 google 开发&#xff0c;是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。 支持长…

Android Webview加载pdf文件无法缩放问题

WebView设置开启页面缩放&#xff1a; settings webView.getSettings(); settings.setSupportZoom(true); settings.setJavaScriptEnabled(true); settings.setUseWideViewPort(true); settings.setLoadWithOverviewMode(true); settings.setBuiltInZoomControls(true); sett…

Matlab 2023b学习笔记1——界面认识

下载安装好Matlab后&#xff0c;可以看到如下界面&#xff1a; 可以看到&#xff0c;这时只有命令行窗口。我们在上方工具栏中选择“布局”—— “默认”&#xff0c;即可看到左右两边多出来了“当前文件夹”与“工作区”两栏。 一、当前文件夹界面 这个界面显示的是当前目录下…

常见应用流量特征分析

目录 1.sqlmap 1.常规GET请求 2.通过--os-shell写入shell 3.post请求 2.蚁剑 编码加密后 3.冰蝎 冰蝎_v4.1 冰蝎3.2.1 4.菜刀 5.哥斯拉 1.sqlmap 1.常规GET请求 使用的是sqli-labs的less7 &#xff08;1&#xff09;User-Agent由很明显的sqlmap的标志&#xff0c;展…

二叉数之插入操作

首先是题目 给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 &#xff0c;新值和原始二叉搜索树中的任意节点值都不同。 注意&#xff0c;可能存在多种有效…

佩戴安全头盔监测识别摄像机

佩戴安全头盔是重要的安全措施&#xff0c;尤其在工地、建筑工程和工业生产等领域&#xff0c;安全头盔的佩戴对于工人的生命安全至关重要。为了更好地管理和监控佩戴安全头盔的情况&#xff0c;监测识别摄像机成为了一项重要的工具。监测识别摄像机可以通过智能技术监测并记录…

小程序-滚动触底-页面列表数据无限加载

// index/index.vue <template> <!-- 自定义导航栏 --> <CustomNavbar /> <scroll-view scrolltolower"onScrolltolower" scroll-y class"scroll-view"> <!-- 猜你喜欢 --> <Guess ref"guessRef" /> </s…

vue koa post 请求代理失败问题总结

场景是在使用 koa 写接口时&#xff0c;客户端发送 post 请求&#xff0c;服务端会报下面这个错误&#xff0c;导致接口未能访问成功&#xff1a; 前端接口一直 Pending 状态&#xff0c; 解决方案&#xff1a;走的是本地 mock 数据&#xff0c;未访问服务端的接口 总结&#x…

.NET调用阿里云人脸核身服务端 (ExecuteServerSideVerification)简易流程保姆级教学

需要注意的是&#xff0c;以下内容仅限基础调用 功能说明 该功能是输入核验人的姓名和身份证以及人脸照片&#xff0c;去阿里库里面匹配&#xff0c;3个信息是否一致&#xff0c;一致则验证通过&#xff0c;需要注意的是&#xff0c;人脸有遮挡&#xff0c;或者刘海&#xff0…

「项目」负载均衡在线OJ(ONLINE_JUDGE)系统

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C&#xff0c;linux &#x1f525;座右铭&#xff1a;“不要等到什么都没有了…

作家百度百科怎么做出来的 怎么创建作家百科词条才能通过

创建作家百度百科词条需要遵循一定的步骤&#xff0c;并注意一些关键点&#xff0c;以确保词条能够顺利通过审核。以下是伯乐网络传媒pouquan根据经验结果得出的详细指导&#xff1a; 准备工作 注册百度账号&#xff1a;在创建任何百度百科词条之前&#xff0c;您需要先注册一…

Llama模型家族之使用 Supervised Fine-Tuning(SFT)微调预训练Llama 3 语言模型(一) LLaMA-Factory简介

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

docker 指定jdk11镜像执行jar

dockerfile :下载jdk11 并将上传的jar 放入jdk11容器/root&#xff0c;改名为app.jar vi dockerfile 。。。。内容见下图 # 构建jdk11镜像 docker build -t demo . # 也可以通过jdk11镜像&#xff08;前提有jdk11镜像&#xff09;外挂载目录方式运行jar docker run --name d…

AI大模型应用开发实践:4.基于 Chat Completions API 实现外部函数调用

基于 Chat Completions API 实现外部函数调用 2023年6月20日,OpenAI 官方在 Chat Completions API 原有的三种不同角色设定(System, Assistant, User)基础上,新增了 Function Calling 功能。 详见OpenAI Blog functions 是 Chat Completion API 中的可选参数,用于提供…

军工单位如何做到安全跨网文件交换与导出的

在现代信息化战争中&#xff0c;军工单位在信息安全方面的需求尤为突出。跨网文件交换与导出作为军工单位日常运营的重要环节&#xff0c;面临着网络带宽限制、数据安全风险、合规性要求和传输稳定性等挑战。下面&#xff0c;我们将从以下几个方面探讨军工单位如何实现安全、高…

《Effective Objective-C 2.0》读书笔记——协议与分类

目录 第四章&#xff1a;协议与分类第23条&#xff1a;通过委托与数据源协议进行对象间通信第24条&#xff1a;将类的实现代码分散到便于管理的数个分类之中第25条&#xff1a;总是为第三方类的分类名称加前缀第26条&#xff1a;勿在分类中声明属性第27条&#xff1a;使用“cla…