java集合关系讲解与Map概述

本文深入解析Java中的数组与集合的区别,详细介绍了List、Set、Map等集合类的特性与使用场景,包括ArrayList、LinkedList、HashSet、TreeSet及HashMap的内部实现机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们先了解一下都可以存储数据的数组与集合有什么不同:
数组:数组长度固定,只能存储同一元素类型,元素类型可以是基本元素类型或者引用类型。
集合:集合长度不固定,可以存储多种类型元素,元素类型必须是Object子类,不可以存储基本数据类型。
数组的效率高于集合。
java中集合类关系图见图,其中虚线框代表是接口。
1484390-20190117090542586-2071537009.png

Collection关系介绍
1484390-20190117093533522-1530284514.png

List:List接口的实现类可以盛放重复元素,且元素排列是有序的。
ArrayList:ArrayList的存储结构是基于数组实现的,而数组存储元素是含有下标的,因为有下标的特点所以ArrayList集合查询效率会更高。但是添加元素或者删除元素效率并不高,比如一个存放了十个集合,此时删除第一个元素时,后面九个元素都需要向前移动一位。(此时LinkedList就出现了)
1484390-20190119092637650-1367969099.png
LinkedList:ArrayList的存储结构是基于链表实现的,而链表结构的特点决定了它的增删元素的效率更高,但是查询的效率低。
1484390-20190119100221146-875563005.png

Set:Set接口的实现类不可以盛放重复元素,且元素排列顺序是无序的(TreeSet除外)。
Set判断元素是否重复的规则是先比较元素之间的hashCode方法返回值,元素之间再用equals方法判断,如果hashCode方法返回值相同并且equals方法返回true,则判定为重复元素。这也解释了在对象中equals方法与hashCode如果重写的话最好都重写的原因。
新建一个Cat类并重写equals方法与hashCode方法。
1484390-20190119173943019-621088093.png
测试:
1484390-20190121201908307-1432166126.png

HashSet的存储方式:
HashSet中有长度为16的table数组,添加的元素就存在这个数组下。添加元素时首先计算元素的hashCode值,并且该值与1111进行与运算(&1111),之后的十进制值就是该元素在table数组中的位置。如果有第二个元素与第一个元素在table中存储位置相同时(hashCode值 & 1111 相同)就执行equals方法,返回true时去重,返回false时就放在同一位置下形成链表。一个链表的最大长度是16。
进行测试:
此时我们改写Cat类的equals方法,只有id与name都相同的时候才返回true。
1484390-20190121204819499-2001948499.png
1484390-20190121205738678-901306853.png
通过Debug模式可以查看:
此时安迪与詹妮都在table[15]中
1484390-20190121205150384-62792383.png
杰瑞在table[12]中
1484390-20190121205849580-829765509.png
TreeSet的存储方式:
TreeSet的特点就是会对元素进行排序,如果元素是自定义对象,这个对象就需要实现Comparable接口并重写compareTo比较方法。
我们为cat对象实现Comparable接口重写compareTo比较方法,用他们的id进行比较:
1484390-20190123082343644-483761499.png
测试:
1484390-20190123082724732-280900506.png
LinkedHashSet,去重效率最高,数据结构与LinkedList一样是基于链表形式存储:
1484390-20190123085546594-1185718385.png

map集合特点:键值对方式存储,key不可以重复无序(Set集合),val可以重复(List集合)且有序

map中有hashMap\hashtable
HashMap与HashTable不同:
1.HashMap的键值都可以为null,而HashTable的键值都不可以为空。
2.HashMap是非线程安全的,HashTable是线程安全的。
3.HashTable的性能比较低。
hashMap存储元素的方式与插入重复key值的处理方式
HashMap存储元素是利用key-value键值对的方式进行存储,一个key对应一个value。
HsahMap中存入元素时首先获取key的hashcode值来决定value的存储位置并存放value值。如果此时多个key元素存储位置相同(hsahcode值相同),此时就比较key是否相同(用equals方法),如果rquals方法返回true,那么就认为kay值完全相同,map中完全相同的key只能有一个value值与之关联,所以此时后添加的value就会覆盖之前添加的value。如果返回false则在这个key原来的value之后再追加一个value形成一个链。
1484390-20190123094253927-1639658621.png
此时两个key值aaa完全相同,那么最新的value值“AAA1”就覆盖了旧的value值“AAA”。

转载于:https://www.cnblogs.com/keyforknowledge/articles/10296993.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值