Java学习51-常用类 集合类Collection Arrays数组类

Arrays数组类 & 集合类Collection

  1. 内存层面需要针对多个数据进行存储,此时可以考虑的容器有:数组,集合类

  2. 数组Arrays介绍:
    数组存储多个数据方面的特点:

数组一旦初始化,其长度是确定的。
数组中的多个元素是依次紧密排列的,有序的,可重复的
(优点) 数组一旦初始化完成,其元素的类型就是确定的,不是此类型的元素,就不能添加到此数组中。
(优点)元素的类型既可以是基本数据类型,也可以是引用数据类型
举例

// 基本数据类型举例
int [] arr = new int[10];
arr[0]=1;
arr[1]="AA";//编译会报错
上面这种情况使用String [] 但是又不能输入int数值类型。// 只能使用下面这种引用数据类型
Object [] arr1 = new Object[10];
arr1[0]=new String; //既可以放String
arr1[1]=new Date; //也可以放Date

数组存储多个数据方面的弊端:

数组一旦初始化,其长度就不可变了
数组中存储数据特点的单一性。对于无序的,不可重复的场景的多个数据就无能为力了。
数组中可用的方法属性都极少。具体的需求都需要自己来组织相关的代码逻辑。
针对数组中元素的删除、插入操作,性能较差。

  1. Collection集合介绍

Collection集合类

Java集合框架体系(java.util包下)
java.util.Collection:集合类,存储一个一个的数据
|----- 子接口:List:存储有序的,可重复的数据(List可以看成是“动态”数组)
|------ArrayList(这个用得多,主要实现类), LInkedList, Vector

|----- 子接口:Set:存储无序的,不可重复的数据(类似数学里说的集合,里面元素是乱的)
|------HashSet, LinkedHashSet,TreeSet

java.util.Map: 存储一对一对的数据(key-value键值对,(x1,y1),(x2,y2) --> y=f(x),类似于高中的函数,不同的key可以指向同一个value,同一个key不能指向多个value)
|------HashMap,LinkedHashMap,TreeMap,Hashtable,Properties

  • 集合常用方法(Collection中定义了15个抽象方法,这些方法需要大家熟悉)
    add(Object obj)
    addAll(Collection coll)
    clear()
    isEmpty()
    size()
    contains(Object obj)
    containsAll(Collection coll)
    retainAll(Collection coll)
    remove(Object obj)
    removeAll(Collection coll)
    hashcode()
    equals()
    toArray()
    注:iterator()下一章讲

下面来举例他们的具体使用:

* 1.add(Object obj):添加元素对象到当前集合中
* 2.addAll(Collection other):添加other集合中的所有元素对象到当前集合中,即this = this U other

应用举例

package Collection;import org.junit.Test;
import java.util.*;public class CollectionTest {/** 1.add(Object obj):添加元素对象到当前集合中* 2.addAll(Collection other):添加other集合中的所有元素对象到当前集合中,即this = this U other** */@Testpublic void test(){Collection coll = new ArrayList();coll.add("AA");coll.add(123);//自动装箱coll.add("haha");coll.add(new Object());coll.add(new Person("Tome",12));System.out.println(coll+"\n"+"-------->");System.out.println(coll.size());Collection coll1 = new ArrayList();coll1.add("BB");coll1.add(456);//自动装箱//coll.addAll(coll1);//size为5+2=7coll.add(coll1);//将coll1整体看成一个元素,加在后面,所以此时size为5+1=6System.out.println(coll);//size()System.out.println(coll.size());}

运行结果

[AA, 123, haha, java.lang.Object@1ef7fe8e, Person{name='Tome', age=12}]
-------->
5
[AA, 123, haha, java.lang.Object@1ef7fe8e, Person{name='Tome', age=12}, [BB, 456]]
6
* 3. int size() 获取当前集合中实际存储的元素个数
* 4. boolean isEmpty() 判断当前集合是否为空集合
* 5. boolean contains(Object obj) 判断当前集合中是否存在一个与obj对象equals返回true的元素

应用举例

package Collection;import org.junit.Test;
import java.util.*;public class CollectionTest {@Testpublic void test2(){Collection coll = new ArrayList();//add()coll.add("AA");coll.add(123);//自动装箱Person p1 = new Person("Tom",12);coll.add(p1);coll.add(new String("haha"));//coll.add(new Person("Tom",12));//isEmpty()System.out.println("coll是空的吗? "+coll.isEmpty());//contains()System.out.println(coll.contains("AA"));//结果为AASystem.out.println(coll.contains(123));//结果为true说明比较的不是地址,而是单纯的比较内容是否一致System.out.println(coll.contains(new String("haha")));//结果为trueSystem.out.println("coll内容里有person的p1吗?"+coll.contains(p1));//结果为trueSystem.out.println(coll.contains(new Person("Tom", 12))); //如果Person内equals方法不做任何重写,结果会为false,原因如下// 因为Person里面没有重写equals方法,那么这里的contains做比较,用的是Object里面的equals,也就是==比较的是两个引用是否指向内存中的同一个对象,这里是两个对象,所以得到false// 一般来说,contains比较,用的就是equals方法,主要比对的就是内容是否一致。对于自定义类例如Person,如果将来想要使用contains方法做内容比较,通常会在Person内部自己重写equals方法。
如果Person内equals方法重写后,结果为true。}
}

运行结果:

coll是空的吗? false
true
true
true
现在调用person.equals方法啦
现在调用person.equals方法啦
现在调用person.equals方法啦
coll内容里有person的p1吗?true
现在调用person.equals方法啦
现在调用person.equals方法啦
现在调用person.equals方法啦
true

问题:上述【现在调用person.equals方法啦】出现了三次然后才显示【coll内容里有person的p1吗?true】为什么会出现三次,怎么理解?
回答:因为上面coll定义的是一个new ArrayList(),而当判断“coll.contains”就需要调用这个元素p1所属 Person类的equal方法,而在Person类中用户定义的equals里面需要的行参是(Object o),这里就是coll,自然需要将coll里面的元素一个一个送进去都比对一遍,先是“AA”然后123然后才能轮到Person类的p1元素,所以调用了三次才出现的结果。

* 6. boolean containsAll(Collection coll):判断coll集合中的元素是否是在当前集合中都存在。即coll
* 7. boolean equals(Object obj) 判断当前集合与obj是否相等,注意必须是两个完全相同的集合(这个用的较少,了解一下)

应用举例

package Collection;import org.junit.Test;
import java.util.*;public class CollectionTest {@Testpublic void test03(){Collection coll = new ArrayList();coll.add("AA");coll.add(123);//自动装箱coll.add(new Person("Tom",12));coll.add(new String("haha"));Collection coll1 = new ArrayList();coll1.add("AA");coll1.add("BB");System.out.println(coll.containsAll(coll1));Collection coll2 = new ArrayList();coll2.add("AA");System.out.println(coll.containsAll(coll2));}}

运行结果:

false
trueProcess finished with exit code 0

/*
* 8. void clear(): 清空集合元素
* 9. boolean remove(Object obj)从当前集合中删除第一个找到的与obj对象equals返回true的元素
* 10. boolean removeAll(Collection coll) 从当前集合中删除所有与coll集合中相同的元素,即this = this - this ⋂ coll
* 11. boolean retainAll(Collection coll) 从当前集合中删除两个集合中不同的元素。使得当前集合仅仅保留与coll集合中元素相同的元素。也就是仅仅保留两个集合的交集,this = this ⋂ coll
*
* */

package Collection;import org.junit.Test;
import java.util.*;public class CollectionTest {@Testpublic void test03_1() {Collection coll = new ArrayList();coll.add("AA");coll.add("AA");//这里装进去"AA"X2coll.add(123);//自动装箱coll.add(new Person("Tom", 12));coll.add(new String("haha"));//coll.clear();coll.remove("AA");//依次删掉一个“AA”,如果原来有两个“AA”,那么还会剩一个//remove的删除方法实际是:求size之后,一个个把元素改为null,并不是直接把size改成0完事(如果直接不管那些元素,等着下次直接有data直接再覆盖,会造成内存泄漏)//第一种删除Person的方法//Person p1 = new Person("Tom",12);//coll.remove(p1);//第二种删除Person的方法coll.remove(new Person("Tom",12));System.out.println(coll);Collection coll1 = new ArrayList();coll1.add("AA");coll1.add(123);coll1.add("BB");System.out.println("coll="+coll);System.out.println("coll1="+coll1);//coll.removeAll(coll1);//删除coll里面出现的coll1所有元素//System.out.println("删除coll里面出现的coll1所有元素"+coll);System.out.println("------>");coll.retainAll(coll1);//保留coll 和 coll1的相同元素System.out.println("保留coll 和 coll1的相同元素"+coll);}}

运行结果:

现在调用person.equals方法啦
现在调用person.equals方法啦
现在调用person.equals方法啦
[AA, 123, haha]
coll=[AA, 123, haha]
coll1=[AA, 123, BB]
------>
保留coll 和 coll1的相同元素[AA, 123]Process finished with exit code 0
/*
* 12 Object[]toArray() 集合转化成数组(也就是:返回包含当前集合中所有元素的数组)
* 13 hashCode() 获取集合对象的哈希值
* 14 iterator() 返回迭代器对象,用于集合遍历(下一章讲)
* */
package Collection;import org.junit.Test;
import java.util.*;public class CollectionTest {@Testpublic void test04(){Collection coll = new ArrayList();coll.add("AA");coll.add("AA");//这里装进去"AA"X2coll.add(123);//自动装箱coll.add(new Person("Tom", 12));coll.add(new String("haha"));//集合 --> 数组Object [] arr = coll.toArray();System.out.println(Arrays.toString(arr));System.out.println(coll.hashCode());//求得hash码}
}

运行时得

[AA, AA, 123, Person{name='Tom', age=12}, haha]
2095848593Process finished with exit code 0
  1. 集合数组的相互转换

集合 —> 数组:toArray()
比如Object [] arr = coll.toArray();

数组 —> 集合:调用Arrays的静态方法asList(Object … objs)
比如Collection list = Arrays.asList(arr);

应用举例

package Collection;import org.junit.Test;
import java.util.*;public class CollectionTest {@Testpublic void test04(){Collection coll = new ArrayList();coll.add("AA");coll.add("AA");//这里装进去"AA"X2coll.add(123);//自动装箱coll.add(new Person("Tom", 12));coll.add(new String("haha"));//集合 --> 数组Object [] arr = coll.toArray();System.out.println(Arrays.toString(arr));System.out.println(coll.hashCode());//求得hash码}@Testpublic void test5(){String[] arr = new String[]{"AA","BB","CC"};//数组-->集合// List list = Arrays.asList(arr); List或者Collection都行Collection list = Arrays.asList(arr);System.out.println(list);//数组转成集合的方式,也可以直接在括号里面建立数组//注:写了代码Arrays.asList("AA","BB","CC","DD");后// 按alt+enter能快速补全需要的其他相关代码,比如List list1 =List list1 = Arrays.asList("AA", "BB", "CC", "DD");System.out.println(list1);}}

test4运行结果


[AA, AA, 123, Person{name='Tom', age=12}, haha]
2095848593Process finished with exit code 0

test5运行结果


[AA, BB, CC]
[AA, BB, CC, DD]Process finished with exit code 0

问题:下面的test6里面list和list1的size分别是多少?为什么?

package Collection;import org.junit.Test;
import java.util.*;public class CollectionTest {@Testpublic void test6(){Integer[] arr = new Integer[]{1,2,3};List list = Arrays.asList(arr);System.out.println("list size is "+list.size()); //这里应该得到3,因为Arrays.asList(Object)里面加的是Object,所以这里是3个Integer包,装了3个箱System.out.println(list);int[] arr1 = new int[]{1,2,3};List list1 = Arrays.asList(arr1);System.out.println("list1 size is "+list1.size());//这里应该得到1,因为Arrays.asList(Object)里面加的是Object,3个int被装了一个箱送进去的System.out.println(list1);}}

运行结果:

list size is 3
[1, 2, 3]
list1 size is 1
[[I@5fe5c6f]Process finished with exit code 0

结果分析:

Arrays.asLis(Object obj)由于只能放Object,所以遇见int系统会自动装箱。
Integer[] arr = new Integer[]{1,2,3};放进Arrays.asList时候按照3个箱放进去的,size得到3
int[] arr1 = new int[]{1,2,3};放进Arrays.asList时候自动将几个int装一个箱放进去的,size得到1

  1. 向Collection中添加元素的要求:
    要求元素所属的类一定要重写equals()

原因:因为Collection中的相关方法(比如:contains()/remove())在使用时,要调用元素所在类的equals().

  1. 学习的程度把握

层次一:针对于具体特点的多个数据,知道选择相应的适合的接口的主要实现类,会实例化,会调用常用的方法。
层次二:区分接口中不同的实现类的区别。

层次三:1-针对于常用的实现类,需要熟悉底层的源码 2-熟悉常见的数据结构(后面讲“常用的数据结构”)

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

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

相关文章

AIGC行业的发展前景与市场需求

简介:探讨当前时机是否适合进入AIGC行业,考虑行业发展阶段和市场需求。 方向一:行业前景 AIGC(人工智能生成内容)行业是近年来随着人工智能技术的快速发展而兴起的一个新兴领域,它涉及到使用人工智能技术来…

可视化大屏开发,知道了这些经验以及解决方案,效率至少提升2倍!(完结篇)

大家好,我是日拱一卒的攻城师不浪,专注可视化、数字孪生、前端、nodejs、AI学习、GIS等学习沉淀,这是2024年输出的第16/100篇文章; 前言 之前写了两篇可视化大屏开发的经验总结,小伙伴们反应还不错。 最近&#xff0…

上海企业ESG标准实施启动仪式暨首届城市可持续发展北外滩论坛,莱巍爵CEO瞿伟锋再获殊荣,绽放异彩

2024年5月20日,上海企业ESG标准实施启动仪式暨首届城市可持续发展北外滩论坛在虹口区白玉兰广场成功举行,上海市工业经济联合会会长管维镛,上海市市场监督管理总局副局长王益洋,联合国工业发展组织投资与技术促进办公室主任赵晓蕾…

【Flutter】Dialog组件PageView组件

🔥 本文由 程序喵正在路上 原创,CSDN首发! 💖 系列专栏:Flutter学习 🌠 首发时间:2024年5月27日 🦋 欢迎关注🖱点赞👍收藏🌟留言🐾 目…

Shiro+Jwt+Redis

如何整合ShiroJwtRedis,以及为什么要这么做 我个人认为 ①为什么用shiro:“ShiroJwtRedis”模式和“单纯的shiro”模式相比,主要用的是shiro里面的登录认证和权限控制功能 ②为什么用jwt:“ShiroJwt”模式和“ShiroCookie”模式相…

生命在于学习——Python人工智能原理(2.1)

二、机器学习 1、机器学习的定义 机器学习是指从有限的观测数据中学习出具有一般性的规律,并利用这些规律对未知数据进行预测的方法,通俗的讲,机器学习就是让计算机从数据中进行自动学习,得到某种知识。 传统的机器学习主要关注…

1分钟快速掌握JSON格式

文章目录 先说理论代码举例对象型数组型总结 先说理论 下面是JSON的几种简单数据类型: 数据类型描述数字型JavaScript中的双进度浮点类型,通常根据具体情况定义,这里是没有特殊的整形的。字符串型带双引号的Unicode,带反斜杠转义布尔型true…

图形学初识--双线性插值算法

文章目录 为什么需要双线性插值算法?双线性插值算法是什么?如何双线性插值?结尾:喜欢的小伙伴可以点点关注赞哦 为什么需要双线性插值算法? ChatGP回答: 双线性插值(bilinear interpolation&am…

AI绘画图生图有什么用?

随着AI渗透到我们生活中的各个角落,AI绘画图生图的出现,更是在艺术领域引起了广泛的关注和讨论。那么,AI绘画图生图究竟有什么作用呢? 首先,AI绘画图生图能够极大地提高创作效率。传统的绘画过程需要艺术家们花费大量的时间和精力…

2024年怎么下载学浪app视频

想要在2024年紧跟潮流,成为一名优秀的学浪用户吗?今天就让我们一起探索如何下载学浪app视频吧! 学浪视频下载工具打包 学浪下载工具打包链接:百度网盘 请输入提取码 提取码:1234 --来自百度网盘超级会员V10的分享…

第14章-蓝牙遥控小车 手把手做蓝牙APP遥控小车 蓝牙串口通讯讲解

本文讲解手机蓝牙如何遥控小车,如何编写串口通信指令 第14章-手机遥控功能 我们要实现蓝牙遥控功能,蓝牙遥控功能要使用:1.单片机的串口、2.蓝牙通信模块 所以我们先调试好:单片机的串口->蓝牙模块->接到一起联调 14.1-电脑控制小车 完成功能…

【面试题】MySQL高频面试题

谈一谈你对数据库的理解? 数据库是一个用于存储和管理数据的工具,它提供了一种结构化的方式来组织和访问数据。数据库可以存储大量的数据,并且可以通过查询语言进行检索、更新和删除数据。 数据库的主要目的是提供一个可靠的数据存储和管理…

使用docker的常用命令示例

命令描述示例注释docker run创建并启动一个容器docker run -d -p 80:80 nginx-d代表后台运行,-p代表端口映射docker ps列出正在运行的容器docker ps无docker ps -a列出所有容器,包括停止的docker ps -a-a代表列出所有容器docker stop停止一个或多个正在运…

网络工程师备考2——vlan

vlan 1、什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域…

简述 Vue父子組件和非父子組件的通信

Vue组件之间的通信可以分为父子组件通信和非父子组件通信两大类。下面将分别进行详细的解释: 父子组件通信 1. 父传子 方式:通过props属性进行传递。步骤: 在父组件中定义要传递的数据。在父组件的模板中,使用子组件标签并动态…

ABeam 德硕 Team Building | SDC Green Day——环保公益行动

山野好拾光 春日公益行 继上年度大连办公室Green Day活动的顺利举办,环保的理念更加深入到ABeam每一位员工的心中。春日天气晴好,西安办公室的小伙伴们也迫不及待来上一场说走就走的Green Day Outing活动。 本次环保公益行动主题为「夏日Go Green畅享山…

千亿级开源大模型Qwen110B部署实测

近日,通义千问团队震撼开源 Qwen1.5 系列首个千亿参数模型 Qwen1.5-110B-Chat。 千亿级大模型普通显卡是跑不了推理的,普通人一般也没办法本地运行千亿级大模型。 为了探索千亿级大模型到底需要计算资源,我用云计算资源部署了Qwen1.5-110B-…

谷歌AI搜索功能“翻车”,用户体验引担忧

近期,谷歌对其搜索引擎进行重大更新,推出了全新AI搜索功能“AI Overview”,试图通过人工智能技术提供更智能便捷的搜索体验,并追赶微软和OpenAI等竞争对手。然而事与愿违,这项备受期待的功能上线后却频频出错&#xff…

测试基础06:软件产品的运行环境dev、sit、test、fat、uat、pre、pro

​​​​​​​课程大纲 1、Dev开发环境 (Development environment) 使用者 开发人员使用。 用途 用于编程,版本变动很大。 外部能否访问 外部用户无法访问。 2、sit/ITE系统集成测试环境 (System Integration Testing en…

WIFI——ESP8266的一些知识

ESP8266的三种无线通讯模式: AP模式:ESP8266产生WIFI,其他设备加入该wifi 无线终端模式:别人创建wifi,ESP8266加入该wifi 混合模式:虽然是以上两种都能用,但同一时间只能用其中一个 设置AP模…