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

2024-05-27 13:28

本文主要是介绍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-熟悉常见的数据结构(后面讲“常用的数据结构”)

这篇关于Java学习51-常用类 集合类Collection Arrays数组类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1007607

相关文章

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

Java五子棋之坐标校正

上篇针对了Java项目中的解构思维,在这篇内容中我们不妨从整体项目中拆解拿出一个非常重要的五子棋逻辑实现:坐标校正,我们如何使漫无目的鼠标点击变得有序化和可控化呢? 目录 一、从鼠标监听到获取坐标 1.MouseListener和MouseAdapter 2.mousePressed方法 二、坐标校正的具体实现方法 1.关于fillOval方法 2.坐标获取 3.坐标转换 4.坐

Spring Cloud:构建分布式系统的利器

引言 在当今的云计算和微服务架构时代,构建高效、可靠的分布式系统成为软件开发的重要任务。Spring Cloud 提供了一套完整的解决方案,帮助开发者快速构建分布式系统中的一些常见模式(例如配置管理、服务发现、断路器等)。本文将探讨 Spring Cloud 的定义、核心组件、应用场景以及未来的发展趋势。 什么是 Spring Cloud Spring Cloud 是一个基于 Spring

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

java8的新特性之一(Java Lambda表达式)

1:Java8的新特性 Lambda 表达式: 允许以更简洁的方式表示匿名函数(或称为闭包)。可以将Lambda表达式作为参数传递给方法或赋值给函数式接口类型的变量。 Stream API: 提供了一种处理集合数据的流式处理方式,支持函数式编程风格。 允许以声明性方式处理数据集合(如List、Set等)。提供了一系列操作,如map、filter、reduce等,以支持复杂的查询和转

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

Java面试八股之怎么通过Java程序判断JVM是32位还是64位

怎么通过Java程序判断JVM是32位还是64位 可以通过Java程序内部检查系统属性来判断当前运行的JVM是32位还是64位。以下是一个简单的方法: public class JvmBitCheck {public static void main(String[] args) {String arch = System.getProperty("os.arch");String dataM