JAVA集合框架的使用

一、框架概述

1.内存层面需要针对多个数据进行存储。

  • 可以考虑的容器有数组、集合…

2.数组存储多个数据方面的特点:

  • 数组一旦初始化,其长度是固定的
  • 数组中多个元素是依次紧密排列的,有序的,可重复的
  • (优点)数组一旦初始化完成,其元素的类型就是确定的.不是此类型的元素,就不能添加到此数组中
  • (优点)元素的类型即可以是基本数据类型,也可以是引用数据类型。

3.数组存储多个数据方面的弊端:

  • 数组一旦初始化,其长度不可变
  • 数组中存储数据特点的单一性。对于无序的、不可重复的场景的多个数据就无能为力了
  • 数组中可用的方法、属性都极少。具体的需求、都需要自己来组织相关的代码逻辑

4.Java集合框架体系(Java.util包下)

  • java.util.Collection:存储一个一个的数据

子接口:List:存储有序的、可重复的数据("动态"数组)

ArrayList (主要实现类)、LinkedList 、Vector

子接口:Set:存储无序的、不可重复的数据(集合)

HashSet(主要实现类)、LinkedHashSet、TreeSet

  • java.uitl.Map:存储一对一对的数据(Key - Value)

HashMap(主要实现类)、LinkedHashMap、TreeMap、Hashtable、Properties

二、Collection的使用

1.Collection中的抽象方法

  • add(E e):将元素添加到集合中
  • boolean addAll(Collection<? extends E> c):将指定集合中的所有元素添加到集合中
  • boolean remove(Object o):从集合中移除指定的元素
  • boolean removeAll(Collection<?> c):从集合中移除指定集合中的所有元素(差集)
  • boolean retainAll(Collection<?> c):保留集合中与指定集合相同的元素,移除其他元素(交集)
  • removeAll(Collection<?> c):从集合中移除指定集合中的所有元素
  • int size():返回集合的大小
  • boolean isEmpty():判断集合是否为空
  • boolean contains(Object o):判断集合是否包含指定的元素
  • boolean containsAll(Collection<?> c):判断集合是否包含指定集合中的所有元素
  • void clear():清空集合中的所有元素
  • int hashCode():返回集合的哈希码
  • Object toArray(Collection col):将集合转化为数组
  • Iterator iterator():返回用于遍历集合的迭代器

2.数组和集合之间的相互转化

  • 集合----->数组

Object[] toArray(Collection col) :将集合转化为数组

  • 数组----->集合

Arrays.asList(Object …objs) 该静态方法的返回值是集合

3.向Collection中添加元素的要求:

  • 要求元素所属的类一定要重写equals()
  • 原因:

因为Collection中的相关方法在使用时,要调用元素所在类的equals()

三、迭代器(Iterator)

1.迭代器的作用

  • 用来遍历集合元素的。

2.如何获取迭代器的对象?

Iterator iterator = Collection接口实例.iterator();

3.如何实现遍历?

while(iterator.hasNext()){
    
     //hasNext():判断下一位置是否有元素
            System.out.println(iterator.next()); //next():1.指针下移 2.返回当前指针位置的元素
        }

4.增强for循环(foreach循环)的使用(jdk5.0新特性)

  • 作用:用来遍历数组、集合
  • 格式:
for (Object obj: list) {
    
    
            System.out.println(obj);
        }
  • 说明:

针对于集合来讲,增强for循环的底层仍然使用的是迭代器
增强for循环的执行过程中,是将集合或数组的元素依次赋值给临时变量,注意,循环体中对临时变量的修改,可能不会导致原有集合或数组中元素的修改

四、List接口与实现类的使用

1.List接口中存储数据的特点:

  • 用于存储有序的、可以重复的数据(“动态”数组)

2.List中的常用方法

  • List继承了Collection接口,有Collection的全部方法
  • 因为List是有序的,进而就会有索引,进而就会增加一些针对于索引的操作方法。

add(Object obj)
addAll(Collection coll)

remove(Object obj)
remove(int index)

set(int index , Object ele)

get(int index)


add(int index,Object ele)
addAll(int index , Collection eles)

长度

size()

遍历

iterator():使用迭代器进行遍历
增强for循环
普通for循环

3.List及其实现类的特点

  • ArrayList :List的主要实现类:线程不安全、效率高;底层使用Object[] 数组存储

在添加数据、查找数据时,效率较高;在插入、删除数据时、效率较低

  • Vector:List的古老实现类;线程安全、效率低;底层使用Object[]数组存储
  • LinkedList:底层使用双向链表的方式进行存储

在插入、删除数据时,效率较高;在添加数据、查找数据时效率较低

五、Set接口与实现类的使用

1.Set及其实现类特点

  • Set:存储无序的、不可重复的数据(集合)

  • HashSet

主要实现类;底层使用的是HashMap,即使用数组+单向链表+红黑树结构进行存储

  • LinkedHashSet

是HashSet的子类;在现有的数组+单向链表+红黑树的基础上,又添加了一组双向链表,用于记录添加元素的先后顺序。即可以按照添加的元素的顺序实现遍历。便于频繁的查询操作

  • TreeSet

底层使用红黑树存储,可以按照添加元素的指定的属性的大小顺序进行遍历。

2.开发中的使用频率及场景

  • 较List、Map来说,Set的使用频率比较少
  • 用来过滤重复数据

3.Set中常用方法:

  • 即为Collection中声明的15个抽象方法。没有新增方法

4.Set中无序性、不可重复性的理解

  • 无序性: !=随机性

无序性与添加元素的位置有关,不像ArrayList一样是一次紧密排列的。这里是根据添加的元素的哈希值,计算的其在数组中的存储位置。此位置不是依次排列的,表现为无序性。

  • 不可重复性:添加到Set中的元素是不能相同的。

比较的标准,需要判断hashCode()得到的哈希值以及equals()得到的boolean型的结果。哈希值相同且equals()返回true,则认为元素是相同的。

5.添加到HashSet/LinkedHashSet中元素的要求:

  • 要求元素所在类要重写两个方法:equals()和hashCode().

同时,要求equals()和hashCode()要保持一致性!IDEA自动生成即可,能保证两个方法的一致性。

6.TreeSet的使用

  • 底层的数据结构:红黑树
  • 添加数据后的特点:可以按照添加元素的指定属性的大小顺序进行遍历
  • 向TreeSet中添加元素的要求:

要求添加到TreeSet中的元素必须是同一个类型的对象,否则会报ClassCastException
添加的元素需要考虑排序:1.自然排序 2.定制排序

  • 判断数据是否相同的标准

不再是考虑hashCode()和equals()方法了,也就意味着添加到TreeSet中的元素所在的类不需要重写hashCode()和equals()了
比较元素大小的或比较元素是否相等的标准就是考虑自然排序和定制排序中,compareTo()或compare()的返回值。如果compareTo()或compare()的返回值为0,则认为两个对象是相等的。由于TreeSet中不能存放相同的元素,则后一个相等的元素就不能添加到TreeSet中。

六、Map接口及实现类的使用

1.Map及其实现类对比

  • java.uitl.Map:存储一对一对的数据(Key - Value)
  • HashMap(主要实现类)

线程不安全的,效率高;可以添加null的key和value值;底层使用数组+单向链表+红黑树结构存储(jdk8)

  • LinkedHashMap

是HashMap的子类;在HashMap使用的数据结构基础上,增加了一对双向链表,用于记录添加的元素的先后顺序,进而我们在遍历元素时,就可以按照添加的顺序显示。开发中,对于频繁的遍历操作,建议使用此类。

  • TreeMap

底层使用红黑树存储;可以按照添加的key-value中的key元素指定的属性大小顺序进行遍历。需要考虑使用1.自然排序2.定制排序

  • Hashtable(古老实现类)

线程安全的,效率低;不可以添加null的key和value值;底层使用数组+单向链表结构存储(jdk8)

  • properties

其key和value都是String类型。常用来处理属性文件。

2.HashMap中元素的特点

HashMap中的所有的key彼此之间是不可重复的、无序的。所有的key就构成一个Set集合。—>key所在的类要重写HashCode()和equals()方法
HashMap中的所有的value彼此之间是重复的、无序的。所有的value就构成一个Collection集合。—>value所在的类要重写equals()方法
HashMap中的一个key-value,就构成了一个entry
HashMap中所有的entry彼此之间是不可重复的、无序的。所有的entry就构成了一个Set集合

3.HashMap中的常用方法

put(Object key , Object value)
putAll(Map m)

Object remove(Object key)

put(Object key , Object value)

Object get(Object key)

  • 长度

size()

  • 遍历

遍key集:Set keySet()
遍历value集:Collection values()
遍历entry集 :Set entrySet()

  • 其他常用方法

void clear():清空当前Map中的所有数据
boolean containsValue(Object value):是否包含指定的value
boolean containsKey(Object key):是否包含指定的key
boolean isEmpty():判断当前Map是否为空
boolean equals(Object obj):判断当前map和参数对象obj是否相等

4.TreeMap的使用

  • 底层使用红黑树存储;
  • 可以按照添加的key-value中的key元素指定的属性大小顺序进行遍历。
  • 需要考虑使用1.自然排序2.定制排序
  • 要求:向TreeMap中添加的key必须是同一类型的对象

七、工具类的使用

1.Collections概述

  • Collections是一个操作List、Map、Set等集合的工具类

2.常用方法

  • 排序操作

reverse(List):反转List中元素的顺序
shuffle(List):对List集合元素进行随机排序
sort(List):根据元素的自然顺序对指定List集合元素按升序排序
sort(List , Comparator):根据指定的Comparator产生的顺序对List集合元素进行排序
swap(List , int , int):将指定list集合中的i处元素和j处元素进行交换

  • 查找

Object max(Collection):根据元素的自然排序,返回给定集合中的最大元素
Object max(Collection , Comparator):根据Comparator指定的顺序,返回给定集合中的最大元素
Object min(Collection):根据元素的自然排序,返回给定集合中的最小元素
Object min(Collection ,Comparator):根据Comparator指定的顺序,返回给定集合中的最小元素
int binarySearch(List list , T key)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象
int binarySearch(List list , T key , Comparator c)在List集合中查找某个元素的下标,但是List的元素必须是T或T的子类对象
int frequency(Collenction c , Object o):返回指定集合中指定元素的出现次数

  • 复制、替换

void copy(List dest , List src):将src中的内容复制到dest中
boolean replaceAll(List list,Object oldVal , Object newVal):使用新值替换List对象的所有旧值
提供了多个unmodifiableXxx()方法,该方法返回指定Xxx的不可修改的视图

  • 添加

boolean addAll(Collection c , T… elements)将所有指定元素添加到指定collection中。

  • 同步

Collections类中提供了多个synchronizedXxx()方法,该方法可使将指定集合包装成线程同步的集合,从而可以使得线程安全