Java16:集合

news2024/11/15 13:27:10

一:Collecction接口

1.单列集合框架结构

》Collection接口:单列集合,用来存储一个一个的对象

     》   List接口:存储有序的,可重复的数据---》动态数组,实现类:ArrayList,LinkedList,Vector

     》Set接口,存储无序的,不可重复的数据--》高中讲的集合

实现类:Hash Set,LinkedHashSet,TreeSet

对应图示:

   

 2.Collection常用方法:

add(Object obj),addAll(Collection coll),size(),isEmpty(),clear()

contains(Object obj),containsAll(Collection coll),remove(Object obj),removeAll(Collection coll)

retainsAll(Collection coll),retainsAll(Collection coll),equals(Collection coll),hashCOde(),toArray(),iterator()

3.Collection集合与数组之间的转换

集合---》数组:toArray()

数组---》集合  Arrays.asList(T...t)

4.使用Collection集合存储对象,要求对象所属的类满足:

向Collection接口的实现类的对象中添加数据obj时,要求obj所在的类要重写equals()

5.遍历Collection集合

1.iterator迭代器 2 foreach循环(增强for循环)

2.遍历的代码实现:

Iterator iterator  = coll.iterator();

//hasNext():判断是否还有下一个元素

while(iterator.hasNext()){

//next()①指针下移,②将下移以后集合位置上的元素返回

System.out.println(iterator.next());}

3.迭代器图示:

二:List接口

1.存储的数据特点:

List 接口:存储有序,可重复的数据--》“动态数组”替换原来的数组     

2:常用方法:

增:add(Object obj)

删:remove(int index), remove(Object obj)

改:set(int index,Object ele)

查:get(int index)

插:add(int index,Object ele)

长度:size()

遍历:①Iterator迭代器方式

           ②增强for循环

            ③普通的循环

3.常用实现类:

         》ArrayList:作为List接口的主要实现类,线程不安全的,效率高;底层使用Object[] elementData存储

              》LinkedList:对于频繁的插入,删除操作,使用此类效率比ArrayList高,底层使用双向链表存储

              》vector:作为List接口的古老实现类;线程安全的,效率低;底层使用Object[] elementData存储        

4.源码分析:

ArrayList的源码分析:

1jdk7情况下:

ArrayList list = new ArrayList();//底层创建了长度是10的Object[]数组 elementData

List.add(123);//elementData[0]=new Integer(123);

...

List.add(11);//如果此次的添加导致底层elementData数组容量不够,则扩容。

默认情况下,扩容为原来的容量的1.5倍,同时需要将原来的数组中的数据复制到新数组中

结论:建议开发中使用带参的构造器:ArrayList  list= new ArrayList(int capacity)

2jdk8中的ArrayList的变化:

ArrayList list = new ArrayList();//底层 Object[] elementData初始化为{},并没有创建长度为10的数组

List.add(123);//第一次调用add()时,底层才创建了长度10的数组,并将数据添加到elementData[0]

后续的添加和扩容操作与jdk7无异

3 小结:jdk7中ArrayList的对象的创建类似于单列的饿汉模式,而jkd8中的ArrayList对象创建类似于单列的懒汉式,延迟数组的创建,节省内存

三:Set接口

1.存储的数据特点:

无序的,不可重复的数据

具体的以HashSet为例说明:

》无序性:不等于随机性。存储的数据在底层数组中并非按照数组的索引顺序添加,而且根据数据的哈希值决定的

》不可重复性:保证添加的元素按照equals()判断不能返回true,即相同的元素只能添加一个

2.元素的添加过程:(以HashSet为例)

我们在向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值

,此哈希值接着通过某种计算方法计算出在HashSet底层数组中存放位置(即为:索引位置,判断数组此位置上是否已经有元素:

              如果此时位置上没有其他元素,则元素a添加成功---》情况1

              如果此位置上有其他元素b(或以链表形式存在的多个元素,则比较元素a与元素b的hash值:

如果hash值不同,则元素a添加成功----》情况2

如果hash值相同,进而调用元素a所在类的equals()方法:

equals()返回true,元素a添加失败

equals()返回false,元素a添加成功----》情况3

对于添加成功的情况2和情况3而言:元素a与已经存在的指定索引位置上的数据以链表的方式存储。

jdk7:元素a放在数组中,指向原来的元素

jdk8:原来的元素在数组中,指向元素a

总结:七上八下

HashSet底层:数组+链表的结构

3.常用方法:

Set接口中没有额外定义新的方法,使用的都是Collection中声明的方法

4.常用实现类

》HashSet:作为Set 接口的主要实现类;线程不安全的可以存储null值

   》LinkedHashSet:作为HashSet的子类;遍历其内部数据时,可以按照添加的顺序遍历,对于频繁的遍历操作,LinkedhashSet效率高于HashSet

》TreeSet:可以按照添加对象的指定属性,进行排序

5.存储对象所在类的要求:

HashSet/LinkedHashSet:

要求:向Set(主要指:HashSet,LinkedHashSet)中添加数据,其所在的类一定要重写

HashCode()和equals

要求:重写的hashcode()和equals()尽可能保持一致性:相同的对象必须有相同的散列码

             重写两个方法的小技巧:对象中用作equals()方法比较的Filed,都应该用来计算hashcode值

TreeSet:

1.自然排序中,比较两个对象是否相同的标准为:compareTo() 返回0,不在是equals()

2.在定制排序中,比较两个对象是否相同的标准为:compare() 返回0,不在是equals()

6.TreeSet的使用:

1.使用说明:

》向TreeSet添加数据,必须是相同类的对象

》两种排序方式:自然排序实现Compareable接口和定制Comparator

四:Map接口

1.常用实现类结构

--Map:双列数据,存储key-value对的数据 ------ 类似高中的函数:y=f(x)

》HashMap:作为Map的主要实现类,线程不安全的,效率高;存储null的key和value

     --LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历

        原因:在原来的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素

                   对于频繁的遍历操作,此类执行效率高于HashMap

》TreeMap: 保证添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序底层使用红黑树

》Hashtable:作为古老的实现类;线程安全的,效率低,不能存储null的key和value

          ---Properties:常用来处置配置文件。key和vaule都是String类型

HashMap的底层:数组+链接(jdk7及以前)

                              数组+链表+红黑树(jdk8)

2.存储结构的理解:

》Map中的key:无序的,不可重复的,使用Set存储所有的Key--key所在的类要重写equals()和hashcode()以hashMap为例

》Map中的value:无序的,可重复的,使用Collection存储所有的value---》value所在的类要重写equals()

》Map中的entry:无序的,不可重复的,使用Set存储所有的entry

3.常用方法:

*添加: put(Object key,Object value)

*删除:remove(Object key)

*修改: put(Object key,Object value)

*查询:get(Object key)

*长度:size()

*遍历:KeySet()/values()/entrySet()

4.内存结构:

4.1 HashMap 在jdk7中实现原理:

HashMap map =new HashMap()

  * 在实例化后,底层创建了长度时16的一维数组Entry[]table

   map.put(key1,value1):

  *首先,调用key1所在类的hashcod()计算key1哈希值,此哈希值经过某种算法计算后

得到在Entry数组中的存放位置

*      如果此位置上的数据为空,此时的key1-value1 添加成功----情况1

*     如果此位置上的数据不为空,(意味着此位置上存在一个或多个数据(以链表形式存在))

       比较key1和已经存在的一个或多个数据的哈希值:

             *如果key1的哈希值与已经存在的哈希值都不相同,此时的key1-value1 添加成功---情况2

             *如果key1的哈希值与已经存在的某一个数据(key2-value2)的哈希值相同,继续比较调用 key2所在类的equals(Key2)方法:

                              如果equals()返回false:此时的key1-value1 添加成功----情况3

                               如果equals()返回true:使用value1替换value2

补充:关于情况2和情况3:此时 key1-value1和原来的数据以链表的方式存储

在不断的添加过程中,会涉及到扩容问题,当超出临界值(且要存放的位置非空)时。扩容的默认方式:扩容为原来容量的2倍,并将原来的数据复制过来

4.2 HashMap 在jdk8中相较于jdk7 底层实现不同:

1.new HashMap():底层没有创建一个长度为16的数组

2.jdk8 底层的数组时Node[] ,而非Entry[]

3.首次调用put()方法时,底层创建一个长度为16的数组

4.jdk7 底层结构只要 数组+链表,jdk8中底层结构:数组+链表+红黑树

*当数组的某一个索引位置上的元素以链接形式存在的数据个数>8,且当数组长度>64,

此时的索引位置上的所有数据改为使用红黑树存储。

4.3:TreeMap的使用

*向TreeMap中添加key-value,要求key必须由同一个类创建的对象

*因为要按照key进行排序:自然排序,定制排序

4.4 使用Properties 读取配置文件:

public static void main(String[] args) {
    Properties pro = new Properties();
    FileInputStream fileinput=null;
    try {
        fileinput  =new FileInputStream("jdbc.properties");
        pro.load(fileinput);
        String name = pro.getProperty("name");
        String password =pro.getProperty("password");
        System.out.println(name);
        System.out.println(password);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            fileinput.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

 五:Collections工具类:

1.作用:

操作Collection和Map工具类

2.常用方法:

*reverse(List):反转List中元素的顺序

*shuffle(List): 对List 集合随机排序

*sort(List):根据元素的自然顺序对指定List 集合元素升序排序

*sort(List,Compartor)::根据指定的Comparator产生的顺序对List 集合元素升序排序

*int frequency(Collection Object):返回指定集合中指定元素的出现次数

*voidcopy(List dest,List src):将src的中的内容复制到dest中

* boolean  replaceAll(List list,Object oleVal,Object newVal):使用新值替换list 对象所有的旧值

3.面试题:Collection 和Collections区别

Collection:集合接口

Collections 操作Collection 和Map接口的工具类

             

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

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

相关文章

【深蓝学院】手写VIO第3章--基于优化的 IMU 与视觉信息融合--作业

0. 题目 1. T1 T1.1 绘制阻尼因子曲线 将尝试次数和lambda保存为csv,绘制成曲线如下图 iter, lambda 1, 0.002000 2, 0.008000 3, 0.064000 4, 1.024000 5, 32.768000 6, 2097.152000 7, 699.050667 8, 1398.101333 9, 5592.405333 10, 1864.135111 11, 1242.7567…

【书影观后感 十四】左晖-做难而正确的事

距离上一本完整读完的书《李自成》及据此而作的读后感【书影观后感 十三】甲申三百七十八年祭已经接近一年时间了,最近心血来潮读了李翔的访谈形式系列《详谈》的第一本《左晖-做难而正确的事》。 虽然这本薄薄的书只有171页,访谈的形式也看似比较随意…

因果推断18--估计个体治疗效果:泛化界和算法CRF(个人笔记)

目录 1. 介绍 2. 相关工作 3.估计ITE:误差界 4. 估计ITE的算法 5.实验 5.1. 模拟结果:IHDP 5.2. 现实世界的结果:工作 5.3. 结果 6.结论 参考 英文题目:Estimating individual treatment effect: generalization bounds…

【Python plotly】零基础也能轻松掌握的学习路线与参考资料

Python plotly是一个优秀的数据可视化工具,通过使用Python语言和Plotly的图表支持库,可以轻松地创建交互式和动态图表,Python plotly的可视化效果美观且易于实现。 学习路线: Python基础语法和Numpy、Pandas基础学习 Python是一…

碳排放预测模型 | Python实现基于LSTM长短期记忆神经网络的碳排放预测模型(预测未来发展趋势)

文章目录 效果一览文章概述研究内容环境准备源码设计学习总结参考资料效果一览 文章概述 碳排放预测模型 | Python实现基于LSTM长短期记忆神经网络的碳排放预测模型(预测未来发展趋势) 研究内容 这是数据集的链接:https://github.com/owid/co2-data/blob/master/owid-co2-da…

windows一键安装redis3.2.100

下载 下载地址:https://gitcode.net/zengliguang/windows_redis_offline_install.git 使用git进行进行clone下载 在电脑桌面或者其他文件夹下 ,鼠标右键点击 选择git clone ,下图中url为下载地址,Directory为本地存储路径,点击…

ORB_SLAM3 闭环检测

ORB SLAM3系统初始化ORB SLAM3 构建FrameORB_SLAM3 单目初始化ORB_SLAM3 双目匹配ORB_SLAM3_IMU预积分理论推导(预积分项)ORB_SLAM3_IMU预积分理论推导(噪声分析)ORB_SLAM3_IMU预积分理论推导(更新)ORB_SLAM3_IMU预积分理论推导(残差)ORB_SLAM3_优化方法 Pose优化ORB_SLAM3 闭环…

【量化交易笔记】8.基于深度学习(LSTM)预测股票价格

前言 前一章节,已作随机森林来预测股票价格,也是一种比较常见的方法,本章基于深度学习算法来处理时间序列,来预测股票未来的价格。LSTM是一种特殊类型的循环神经网络(RNN),在自然语言处理和时间…

【C语言之函数栈帧】(动态图—巨细)一文带你了解局部变量随机值及栈区上的函数调用

🚩纸上得来终觉浅, 绝知此事要躬行。 🌟主页:June-Frost 🚀专栏:C语言 局部变量为什么是随机值?函数是如何调用的? ✉️ 该篇将使用该编译器,通过介绍栈帧的创建和销毁来深入了解局…

计算机网络开荒3-传输层

文章目录 一、传输层概述1.1 网络层 vs 传输层 二、多路复用 多路分用三、UDP3.1 RDT3.1.1 Rdt3.1.1.1 Rdt1.03.1.1.2 Rdt2.03.1.1.3 Rdt2.13.1.1.4 Rdt2.23.11.5 Rdt 3.0 四、滑动窗口协议4.1 流水线机制4.1.2 滑动窗口协议GBNSR 五、TCP5.1 可靠数据传输5.1.1 RTT和超时 5.2 …

Vue中如何进行图表绘制

Vue中如何进行图表绘制 数据可视化是Web应用中非常重要的一部分,其中图表绘制是其中的重要环节。Vue作为一款流行的前端框架,提供了很多优秀的图表库,以满足不同业务场景下的需求。本文将介绍如何在Vue中进行图表绘制,包括使用Vu…

MM32F3273G8P火龙果开发板MindSDK开发教程4 - 滴嗒定时器Systick的配置

MM32F3273G8P火龙果开发板MindSDK开发教程4 - 滴嗒定时器Systick的配置 1、Systick寄存器 Systick是ARM内核的一个外设,所以在不同芯片的代码上移植比较方便,他总共有4个寄存器, 从Systick定义中可以看到: typedef struct {__I…

一文看懂Java中的锁

阅读本文你可以获得 Synchronized、ReentrantLock、ReentrantReadWriteLock、StampedLock、Condition、Semaphore、CountDownLatch、CyclicBarrier、JMM、Volatile、Happens-Before。 全文共16000字左右(包含示例代码)、欢迎收藏、在看、转发分批食用 一…

基于粒子群优化算法的配电网光伏储能双层优化配置模型[IEEE33节点](选址定容)(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

【MySQL 数据库】11、学习 MySQL 中的【锁】

目录 一、锁的概述与分类二、全局锁(全库数据备份)三、表级锁(1) 表锁(2) 元数据锁(Meta Data Lock)(3) 意向锁 四、行级锁(1) 行锁(2) 间隙锁&临键锁 一、锁的概述与分类 锁是计算机协调多个进程或线程并发访问某一资源的机…

Whistle(基于 Node 实现的跨平台抓包调试工具)的使用

Whistle(基于 Node 实现的跨平台抓包调试工具)的使用 基于Node实现的跨平台抓包调试工具 可以劫持网络请求,并进行请求和响应的修改,来提高我们的开发调试效率 1.一键安装(装包/证书) npm i -g whistle && w2 start --init 证书的问题 安装…

[论文阅读] (31)李沐老师视频学习——4.研究的艺术·理由、论据和担保

《娜璋带你读论文》系列主要是督促自己阅读优秀论文及听取学术讲座,并分享给大家,希望您喜欢。由于作者的英文水平和学术能力不高,需要不断提升,所以还请大家批评指正,非常欢迎大家给我留言评论,学术路上期…

5.2 清洗数据

5.2 清洗数据 5.2.1 检测与处理重复值1、记录重复 drop_duplicates()2、特征重复 equals() 5.2.2 检测与处理缺失值 isnull()、notnull()1、 删除法 dropna()2、替换法 fillna()3、 插值法 5.2.3 检测与处理异常值1、3σ原则2、箱线图 5.2.4 任务实现(wei&#xff0…

学习HCIP的day.12

目录 MPLS:多协议标签交换 一、协议的解释和意义 二、工作过程 1、控制层面: 2、数据层面: 三、标签号 四、MPLS的次末跳 五、MPLS的配置 六、使用mpls解决BGP的路由黑洞 七、MPLS VPN 八、配置: 1、ISP部分 MPLS&am…

python+pyqt制作的可最小化到托盘的桌面图形应用代码实例

本篇文章主要讲解使用python、pyqt制作的可以最小化到托盘的桌面图形应用实例。 日期:2023年6月11日 作者:任聪聪 效果演示 说明:实现桌面应用显示窗口,关闭窗口缩小到托盘,点击托盘显示窗口,邮件图标显示退出按钮,点击退出按钮即可关闭应用。 动态演示: 实际情况:…