Java笔记--集合

Java集合笔记

1 集合与数组的区别

编程中,常常需要集中存放多个数据,我们可以使用数组来进行保存,但是数组长度不可变化,一旦在初始数组时指定了数组长度,这个数组长度就是不可变化的,对于变化长度的数据来说,数组就不适用了。此外,数组也不适合用于存储具有映射关系的数据,此时,用集合就变得十分方便了,集合提供了一系列的方法,列如排序,判断,使得编程变得方便。

2 Java集合概述

集合只能保存对象(对象的引用变量),但是数组可以保存基本类型数据和对象。Java集合大致可以分为Set,List,Queue和Map。Set代表无序,不可重复的集合;List代表有序,重复的集合;Map代表具有映射关系的集合;Queue代表队列集合实现

Java集合类主要有Collection和Map接口派生,如图是两个接口,子接口及其实现类的继承图
Collection接口
Map接口
常用的集合:HashSet,TreeSet,ArrayDeque,ArrayList,LinkedList,HashMap,TreeMap

3.1 Set集合(无序,不重复)

Set集合不允许添加相同的元素,如果添加相同的元素,add()方法会返回false,Set集合通常不能记住元素的添加顺序,优先选择HashSet

3.1.1 HashSet

HashSet是基于哈希查找算法来实现的。哈希算法可以直接根据元素的hashcode值来对元素定位,实现快速查找,类似于数组,根据数组的下标可以快速查找数组的元素。HashSet集合存入元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashcode值,然后根据该hashCode值决定该对象在HashSet中的存储位置。

**HashSet集合判断两个元素相等的标准是通过equals()方法比较相等,并且两个对象的hashCode()方法返回值也相等。**如果有两个元素通过equals()方法比较返回true,但他它们的hashCode()方法返回值不相等,HashSet将会把它们存储在不同位置
HashSet不是同步的,如果多个线程同时访问一个HashSet,必须通过代码来保证其同步

3.1.2 TreeSet

TreeSet可以确保集合元素处于排序状态,并且不是根据元素的插入顺序来排序的,而是根据元素实际值的大小来进行排序的(默认采用自然排序)
TreeSet采用红黑树的数据结构来存储集合元素,TreeSet支持两种排序方法

1,自然排序:TreeSet调用集合元素的compareTo(Object obj)方法比较元素间的大小关系,然后将集合元素按升序排列
2,定制排序:通过Comparator接口的帮助,该接口包含一个int comparator(T 01,T o2)方法,该方法用于比较o1和o2的大小

3.2 List集合(有序,可重复)

List集合默认按照元素添加顺序来设置元素的索引,通过索引可以访问指定位置的集合元素

ArrayList和Vector

List集合中常用的是ArrayList,但是它是不安全的,多个线程访问时,我们必须手动保证该集合同步,Vector是安全的但是性能低。
使用工具类Collections可以实现线程同步,Collections类中提供了多个synchronizeXXX()方法,比如:
Collection c = Collections.synchronizedCollection(new ArrayList());
List list = Collections.synchronizedList(new ArrayList());

3.3 Map集合(保存映射关系数据)

Map集合保存着两组值,一组保存Map里的key,一组保存Map里的value,key不能重复。这和Set集合很类似

3.3.1 HashMap和HashTable

HashMap线程不安全,但是性能高,HashTable线程安全,性能低
HashTable不允许使用null作为key和value,HashMap可以使用null作为key和value,但是最多只能由一个key为null

3.3.2 TreeMap

TreeMap是一个红黑树为数据结构的集合类,每个key-value对及作为红黑树的一个节点,TreeMap存储key-value对时,需要根据key对节点进行排序,TreeMap可以保证所有key-value处于有序状态。

Java9新增的不可变集合

程序可直接调用集合的of()方法即可创建包含N个元素的不可变集合,但是不能向这个集合中添加数据也不能删除这个集合中的数据。

Set set = Set.of(“Java”,“C”,“C++”);

map集合可使用of()方法依次传入多个key-value对,也可以用ofEntries()方法,该方法接受多个Entry对象
Map map = Map.ofEntries(Map.entry(“语文”,89),
Map.entry(“数学”,56),
Map.entry(“英语”,45));

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值