集合、Collection

系列文章目录

这里主要讲了集合的使用,有Collection和Map的集合接口,Colletion下的List和Set集合

目录

系列文章目录

文章目录

一、集合的概述

二、集合框架体系

继承体系图:

集合的分类:

三、Collection接口

Collection接口的主要方法:

四、集合的遍历

1.toArray()

2.迭代器

3.增强for循环

4.forEach

五、List接口

1.List集合的特点

2.常用方法

3.ArrayList

4.LinkedList

LinkedList操作头尾节点的方法:

时间戳:(用于计录时间)

5.Vector

六、Set接口

1.Set集合的特点

2.HashSet

HashSet的特点:

插入过程:

3.TreeSet

TreeSet的特点:

自然排序:

比较器排序:

4.LinkedHashSet

七、Map接口

1.特点

2.常用方法

3.遍历

1.keySet通过

2.entrySet()

4.HashMap

特点:

注意:

5.TreeMap

特点:

6.Hashtable

特点:

注意:

7.LinkedHashMap

八、Collections工具类

常用方法:

一、集合的概述

1.集合的长度是可变的

2.集合中的存储的数据可以是不同类型的 ,如果加上泛型的话就是会有限制

3.集合中只能存储引用数据类型

4.集合框架是在java.util包下的。

二、集合框架体系

集合框架主要由三个元素组成:接口,实现类,数据结构

继承体系图:

集合的分类:

单列集合和多列集合

单列集合:根接口是Collection接口,每个集合元素包含一个单独的对象。

多列集合:根接口是Map接口,每个集合元素由多个字段组成,用于存储多个相关的值。

三、Collection接口

Collection接口是单列集合的根接口

1.Collection接口还继承iterable接口,可以调用迭代器

Collection接口的主要方法:

注意点:

集合中的remove、contain等方法在底层调用的是equals方法,如果要存放自定义对象,要重写equals方法。

四、集合的遍历

单列集合的遍历有三种方法:

1.toArray()

调用toArray()方法,返回一个数组,遍历数组去进行遍历集合。

2.迭代器

调用iterator()方法,返回一个迭代器对象,然后进行遍历

需要使用迭代器的两个方法:hanNext()(判断下一个有没有元素)和next()(获取下一个集合元素并移动迭代器)方法

例如:

Iterator<泛型> iterator = 集合.iterator();

while(iterator.hasNext()){

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

}

3.增强for循环

for(集合元素类型 变量名:集合名 ){

        System.out.println(变量名);

}

4.forEach

调用forEach方法,内部用匿名内部类,重写accept方法遍历。

arr.forEach(new Consumer<Integer>() {
    @Override
    public void accept(Integer integer) {
        System.out.println(integer);
    }
});

五、List接口

1.List集合的特点

1.有序的集合

2.List是有索引下标的集合

3.List集合中可以存放重复的值。

4.List中的方法好多是可以通过索引的。

2.常用方法

3.ArrayList

ArrayList集合的底层是通过数组实现,它的特点是增删慢,查找快(LinkedList集合的特点与之相反)

4.LinkedList

LinkedList的底层是通过双链表实现的,它的特点是增删快,查找慢。

因为双链表查询的时候是从前到后的。

LinkedList操作头尾节点的方法:

时间戳:(用于计录时间)

long a = System.currentTimeMillis();

可以通过两个区计算操作的时间。

5.Vector

Vector底层也是通过动态数组实现的,线程安全。

之后用的不多,主要使用ArrayList,可以使用Collection类把ArrayList集合变为线程安全。

六、Set接口

1.Set集合的特点

1.Set集合是无序的

2.无索引下标

3.不能存放重复的值

2.HashSet

HashSet的特点:

1.无序性,底层是哈希表实现,存储顺序和插入顺序无关

2.唯一性,不允许存放重复的值

3.允许null元素,但只能存放一个null,因为不能存放重复的值

4.高效性

插入过程:

当向HashSet添加元素时,先获取hashCode()的值,再检查HashSet中是否存在相同哈希值的元素,如果元素哈希值唯一,则直接插入元素。

如果存在相同的哈希值的元素,再调用元素的equals()方法进一步判断是否相同。如果相同则不插入,如果不同,则插入。

如果是自定义类型需要重写hashCode()和equals()方法。

3.TreeSet

TreeSet是SortedSet(Set接口的子接口)的实现类,基于红黑树数据结构实现

TreeSet的特点:

1.有序性,基于红黑树的,每次插入元素会自动排序

2.唯一性,不允许有重复的值

3.高效性:对于有序集合的操作,比HashSet更有效。

4.动态性:插入删除的时间复杂度为O(log n),n为集合中元素的数量

自然排序:

自然排序是实现了Comparable接口,并重写了compareTo()方法。

compareTo(T o)方法:用this和o去进行比较

this是要插入的元素,o是已经在集合中的元素

如果想要正序,this - o

想要倒序:o-this

我自己的理解,因为是基于红黑树的,当 this - o 这是正常情况下的,当结果为正数,存到红黑树右边,负数存左边,最后得到就是正序的。

比较器排序:

比较器排序是可以使用匿名内部类实现,在定义TreeSet集合时直接传一个比较器对象

实现类Comparator接口,重写compare()方法

比较的规则是和自然排序一样的

compare(Object a , Object b )

a为要插入的元素,b是已经在集合的元素。

如果同时使用自然排序和比较器排序,比较器排序会覆盖自然排序。

4.LinkedHashSet

是HashSet的一个子类,会保存元素的插入顺序,基于哈希表和链表实现的。不允许重复元素。

七、Map接口

map集合是一种用于存储键值对映射关系的集合类,其中每个键是唯一的,值是可以重复的。

map是双列集合的根接口,没有实现Iterable接口,不能使用迭代器遍历。

map<key value>

1.特点

1.存储元素时,必须以key - value(键值对)的方式进行

2.键唯一性,map集合的键是唯一的,一个键对应一个值

3.可重复值:map集合的值可以重复,不同的键可以关联相同的值

4.高效的查找和访问,通过key去获得value

集合内部使用哈希表或红黑树等数据结构实现

2.常用方法

3.遍历

1.keySet通过

通过调用keySet()方法去遍历,调用keySet()返回了一个Set集合,存放所有的key

然后通过Set集合的遍历方法去遍历,然后通过get()方法获得value值

2.entrySet()

entrySet方法是把每一对的键值对去变为一个Entry对象,然后存到set集合中,然后遍历

例如:

Set<Map.Entry<k,v>> set = map集合.entrySet();

然后通过循环去遍历,通过getKey(),getValue()方法去进行获取键值。

4.HashMap

底层通过哈希表实现

特点:

1.键唯一

2.值可重复

3.无序xing

4.线程不安全

5.键和值允许使用null

注意:

1.如果键为自定义类型,那么自定义类型需要重写hashCode()和equals()方法

2.map中如果添加的是相同的,那么值会进行覆盖(如果想要修改某个值,那么可以直接覆盖它)

5.TreeMap

map接口下的子接口SortedMap接口下的实现类,和TreeSet相似,可以对键进行排序

特点:

1.有序的映射实现类,基于红黑树来存储键值对

2.键的排序,键可以按照自然排序和比较器排序进行排序

3.键唯一,值可以重复

4.线程不安全,如果在多线程下使用,需要使用Collections工具类

5.没有初始容量,是动态的。

6.键不能为null

6.Hashtable

特点:

1.线程安全,性能相对于HashMap较低

2.键和值不能为null

3.哈希表实现

注意:

单线程环境下建议使用HashMap

多线程环境下采用HashMap+Collections

7.LinkedHashMap

HashMap的子类,采用哈希表加链表的结构,可以保证元素的存取顺序一致

键和值都可以为null

八、Collections工具类

是java.util包下的工具类

常用方法:

1.fill()方法:使用指定元素替换指定列表中的所有元素

fill(集合名,20)把集合中的所有元素替换为20

2.max():根据元素的自然排序返回集合的最大值

3.min():返回最小值

4.reverse():反转集合中的元素

5.sort():根据元素的自然顺序,进行升序排序

sort(list ,可以在这里加一个比较器)

6.shuffle()通俗点就是打乱顺序

使用默认随机源对指定列表进行置换

7.addAll():往集合添加一些元素

Collections.addAll(list ,1,2,3,4);第二个参数为可变长参数

8.synchronized相关方法,将非线程安全的集合转为线程安全 

以下就是将非线程安全转为线程安全的方法:

synchronizedList:List转换

synchronizedSet:Set转换

synchronizedCollection:Collection转换

synchronizedMap:Map转换

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值