【Java】集合框架学习(List、Set、Map)

目录

Collection接口概述:

创建集合的格式:

Iterator迭代器使用:

List接口特点(也是其所有实现类的特点):

List接口的常用子类有:

ArrayList:

LinkedList:

Vector:

Set接口:

HashSet:

HashSet元素不能重复,如何实现:

LinkedHashSet介绍

TreeSet:

Map接口:

HashMap:,v>

Map集合遍历键找值方式:

Collections集合工具类 Arrays  

Collections类常用方法总结


Collection接口概述:

Collection接口是集合中的顶层接口,那么它中定义的所有功能子类都可以使用,是共性的功能,是集合中所有实现类必须拥有的方法。

所有我们学习的时候首先从父类Collection开始,然后再学习子类中特有的内容。

Collection接口的基本方法

 以上的方法基本都是常用方法,需要记住。

创建集合的格式:

方式1:Collection<元素类型> 变量名 = new ArrayList<元素类型>();

方式2:Collection 变量名 = new ArrayList();

方式1创建的集合,只能存储<>中指定的元素类型,该方式为常用方式。(这里使用了泛型)

【Java】泛型&注解学习_多糖橘橘子的博客-CSDN博客

方式2创建的集合,集合的元素类型默认为Object类型,即任何类型的元素都可以存储。(但是后续可能会需要强制类型转换)。

Iterator迭代器使用:

具体演示:

public void test2() {
   Collection<String> collection = new ArrayList<>();
   collection.add("张三");
   collection.add("李四");
   collection.add("王五");
   collection.add("张三");
   Iterator<String> iterator = collection.iterator();
   while (iterator.hasNext()) {//判断有没有下一个,有下一个返回true
     String data = iterator.next();//用来返回迭代的下一个元素,并把指针向后移动一位
     System.out.println(data);
   }
}

List接口特点(也是其所有实现类的特点):

1、它是一个元素存取有序的集合。有序指的是存元素的顺序是11、22、33。取出来的时候也是11、22、33。而不是22、11、33这种情况。不是自动排序。

2、它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。

3、 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

List接口的常用子类有:

ArrayList集合

LinkedList集合

Vector集合(已经不再使用)

ArrayList:

ArrayList集合数据存储的结构是数组结构。是方便查找指定元素和替换指定元素的集合。

1、增加元素方法

     add(Object e):向集合末尾处,添加指定的元素

     add(int index, Object e):向集合指定索引处,添加指定的元素,原有元素依次后移

2、删除元素删除

     remove(Object e):将指定元素对象,从集合中删除,返回值为被删除的元素

     remove(int index):将指定索引处的元素,从集合中删除,返回值为被删除的元素

3、替换元素方法

     set(int index, Object e):将指定索引处的元素,替换成指定的元素,返回值为替换前的元素

4、查询元素方法

     get(int index):获取指定索引处的元素,并返回该元素

注意一个问题

Iterator<String> it = list.iterator();
   while(it.hasNext()){
     String s = it.next();
     //对获取出的元素s,进行判断,是不是有"abc3"
     if(s.equals("abc3")){
        list.add("ABC3");
     }
     System.out.println(s);
   }

如果想要使用迭代器遍历集合并且进行添加操作的话是不可以的,因为迭代器中没有定义添加方法。如果想要实现添加操作可以使用ListIterator进行迭代。另外for,each增强for循环也是不可以添加操作的。删除操作可以使用Iterator。

LinkedList:

LinkedList集合数据存储的结构是链表结构。是方便元素添加、删除的集合。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。

除此之外LinkedList还有offer()、poll()组合完成对队列的操作,peek()获取队首元素,pollLast()队尾出列方法。所以Linkedlist既可以实现栈也可以实现队列。

Vector:

Vector集合数据存储的结构是 数组结构,为JDK中最早提供的集合。Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器。此接口Enumeration的功能与 Iterator 接口的功能是类似的。 Vector集合已被ArrayList替代。枚举Enumeration已被迭代器Iterator替代。
Vector & ArrayList比较
相同点:Vector与ArrayList本质上都是一个Object[] 数组,都实现了List这个接口
不同点:
1)Vector是 线程安全的集合类,ArrayList并不是线程安全的类。Vector类对集合的元素操作时都加了synchronized,保证线程安全。
2)Vector与ArrayList的扩容并不一样,Vector默认扩容是 增长一倍的容量,Arraylist是 增长50%的容量。ArrayList就有利于节约内存空间。 【Java】ArrayList扩容机制学习_多糖橘橘子的博客-CSDN博客
Vector无论查询还是增删都很慢,所以被ArrayList替代了。


Set接口:

Set中元素无序不重复。无序指的是存取无序。不重复即不允许出现相同元素。Set中允许null值但是只允许一个!在List集合中允许多个null值。

实现Set接口的有HashSet和TreeSet。

LinkedHashSet继承了HashSet类。

HashSet:

无序:HashSet集合不能保证的迭代顺序与元素存储顺序相同。

不重复:HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于两个方法:hashCode()与equals()方法

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

HashSet元素不能重复,如何实现:

在给哈希表中存放对象时,会调用对象的hashCode方法,算出对象在表中的存放位置,这里需要注意,如果两个对象hashCode方法算出结果一样,这样现象称为哈希冲突,这时会调用对象的equals方法,比较这两个对象是不是同一个对象,如果equals方法返回的是true,那么就不会把第二个对象存放在哈希表中,如果返回的是false,就会把这个值存放在哈希表中。

解决哈希冲突(四种方法)_君诀的博客-CSDN博客_解决哈希冲突的方法

在ThreadLocal中解决哈希冲突的方法是开放定址法。

在HashMap中解决哈希冲突的方法是链式寻址法。

保证HashSet集合元素的唯一,是根据对象的hashCode和equals方法来决定的。如果我们往集合中存放自定义的对象,为了保证其唯一,必须复写hashCode和equals方法建立属于当前对象的比较方式。

给HashSet中存储JavaAPI中提供的类型元素时,不需要重写元素的hashCode和equals方法,因为这两个方法,在JavaAPI的如String类、Integer类已经重写了hashCode和equal方法。


LinkedHashSet介绍

我们知道HashSet保证元素唯一,可是元素存放进去是 没有顺序的,那么我们要保证有序?
在HashSet下面有一个子类LinkedHashSet,它是链表和哈希表组合的一个数据存储结构。
public void test4() {
   Set<String> set = new LinkedHashSet<String>();
   set.add("bbb");
   set.add("aaa");
   set.add("abc");
   set.add("bbc");
   Iterator it = set.iterator();
   while (it.hasNext()) {
     System.out.println(it.next());
   }
}

TreeSet:

Java中的TreeSet是Set的一个子类,TreeSet集合是用来对象元素进行排序的,同样他也可以保证元素的唯一。

那TreeSet为什么能保证元素唯一,它是怎样排序的呢?

需要在自定义类(Student)中实现```Comparable```接口,并重写接口中的compareTo方法

@Override
   public int compareTo(Student o) {
       return 0;  //当compareTo方法返回0,认为是相同的元素
       return >0;  //当compareTo方法返回值正数,读取时是正序排列的
       return <0; //当compareTo方法返回值负数,读取时是倒序排列的
   }
}

Map接口:

1、Collection中的集合,元素孤立存在。向集合中存储元素采用一个个元素的方式存储。

2、Map中的集合,元素成对存在。每个元素由键与值两部分组成,通过键可以找对所对应的值。

3、Collection中的集合称为单列集合,Map中的集合称为双列集合。

4、需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

(Key可以为null但是只能有一个为null,值可以多个为null)

5、Map中常用的集合为HashMap集合、LinkedHashMap集合

HashMap<K,V>:

存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。(存放自定义类的时候重写,API中的类不需要)

LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

Map集合遍历键找值方式:

一、键找值方式:即通过元素中的键,获取键所对应的值。
1.获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。

2.遍历键的Set集合,得到每一个键

3.根据键,获取键所对应的值

二、Map集合遍历键值对方式

键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

1.获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回

2.遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象

3.通过键值对(Entry)对象,获取Entry对象中的键与值。

注意:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。

Collections集合工具类 Arrays  

Collections类常用方法总结

public static <T> void sort(List<T> list) // 集合元素排序
//排序前元素list集合元素 [33,11,77,55]
Collections.sort( list );
//排序后元素list集合元素 [11,33,55,77]
public static void shuffle(List<?> list) //  集合元素存储位置打乱
//list集合元素 [11,33,55,77]
Collections.shuffle( list );
//使用shuffle方法后,集合中的元素为[77,33,11,55],每次执行该方法,集合中存储的元素位置都会随机打乱
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值