Java集合

一、什么是集合。

集合是java中提供的一种容器,可以用来存储多个数据。

1 . 集合和数组的区别

① .长度区别,数组固定,集合可变

② .数组中存储的是同一类型的元素,可以存储基本数据类型值。而集合存储的都是对象。而且对象的类型可以不一致。

2.集合框架

① .集合根据存储结构分为两大类 单列集合Collection 双列结合Map

二.Collection集合

1 .Collection介绍:

      是所有单列集合的父接口,因此它定义了单列集合List和Set的通用的一些方法。方法如下

      ①.public boolean add(E e)把给定的对象添加到当前集合中

     ②.public void clear()清空集合中的所有元素

③.public boolean remove(E e)删除给定的对象

④.public boolean contains(E e)判断是否存在给定的对象。

⑤.public boolean isEmpty 判断当前集合是否为空

⑥.publuc int size()返回当前集合中的元素的个数

⑦.public Object[] toArray() 把集合中的元素。存储到数组中

2 . List集合

List接口特点:

①.它试一个元素存取有序的集合。

②.他是一个带索引的集合,通过索引就可以精确的操作集合中的元素。

③.集合中可以有重复的元素,通过元素的equals方法,来比较是否重复的元素

List的常用方法

它继承了Collection中的全部方法,还增加了元素索引来操作集合的特有方法。

①.public void add(int indext,E e)将制定的元素添加到指定的位置上。

②.public E get(int index)返回集合中的指定位置的元素

③.public E remove(int indext)移除指定位置元素并且返回这个值。

④.public E set(int index)用指定元素替代指定位置的元素

List的子类

ArrayList集合

元素增删慢。查找快。(不提倡随意使用ArrayList)

LinkedList集合、

存储的结构是链表结构,方便元素添加,删除的集合

LinledList试一个双向链表

3.Iterator迭代器

1.Iterator介绍

即Collection集合元素的通用获取方式。在取元素之前先要判断集合中有没有元素,如果有,就把这个元素取出来,继续在判断,如果还有就再取出出来。一直把集合中的所有元素全部取出。这种取出方式专业术语称为迭代。

2. 注意

在使用集合时,我们经常需要遍历所有元素,针对这种需求,JDK专门提供了一个接口,它也是Java集合中的一员,但它与Collection、Map接口有所不同,这两个接口主要用于存储元素,而它主要用于迭代访问Collection中的元素,也称为迭代器。

4.Set接口

1.介绍:

Set接口同样继承自Collection接口,他与Collention接口中的方法基本一致,没有对其进行扩充功能,只是更加严格,Set接口是无序的,并且都会以某种规则保证存入的元素不会重复。

2.HashSet:

HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的,它的底层其实试一个HashMap支持。

HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此就有良好的存取和查找性能,保证元素的唯一性的方式依赖于Hashcode和equals方法

例:

Set<Integer>set = new HashSet<>();

set.add(1);

set.add(2);

set.add(1);


//遍历循环获取Set集合中的元素
for(int i:set){
    System.out.println(i);
}

遍历输出打印它只会得到两个值,1和2

3.哈希表

在jdk1.8之前哈希表底层采用数组加链表实现,即使用链表处理冲突,同一哈希值的链表都存储在一个链表中,当时位于一个桶中的元素较多,即哈希值相等的元素较多时,通过key值一次查找的效率较低,而在jdk1.8中哈希表存储采用了数组+链表+红黑树实现,当链表长度超过阈值时,江连彪转换为红黑树,这样大大减少了查找的时间。

简单说,哈希表是有数组+链表—+红黑树实现的

java 集合结构图 java集合概述_java

 

5.Collections

1.常用功能

它是一个集合工具类,可以用来添加元素,打乱集合顺序,将集合中元素按照默认规则排序,和按照制定规则进行排序

①.public static <T> boolean addAll(Collection<T> c,T...elements);添加元素

②.public static void shuffle(List<?> list);打乱集合

③.public static <T> sort(List<T> list);按照默认顺序排序

④.public static <T> sort(List<T> list,Comparator<? super T>);制定规则排序。

三.Map

1.介绍:

Map用于保存具有映射关系的数据,Map里保存着两组数据,一个key,一个是value,他们可以使用任何引用类型的数据,但key不能重复。所以通过Key就能取得指定的value,使用时最好不要改变Key的值。

2.组成

1.HashMap

线程不安全。HashMap中最多允许一个Key为null,但是可以有无数多个value为null,性能好,可以通过调整初始容量和负载因子提高性能,根据需求进行修改,默认值为初始容量为16,负载因子为0.75。

2.HashTable

线程安全, HashTable不可以放入空值,性能差。

3.共同点

用作key的对象必须实现hashCode和equals方法,不能保证其中的键值对的顺序,尽量不能使用可变对象作为他们的key

4.TreeMap

实现SortMap接口,有他的特殊方法

Map.Entry forstEntry();返回最小Key对应的键值对,如Map为空则返回null;

Object firstKey 返回最小值Key,若为空返回null

Map.Entry lastEtry()返回最大key对应的键值对,若map为空,则返回null

Object lastKey 返回最大key,若为空返回null。

Map.Entry heigherEntry(Object key)返回位于key后一位的键值对,若为空返回null

Map.Entry lowerEntry(Object key)返回key前一位的键值对,若为空返回null。

Object lowerKey(Object key)返回位于key前一位key值,若为空返回null

 

总结:

1. 线程安全性:

集合中线程安全有Vertor,HashTable,StringBuffer

线程不安全的有LinkedList、ArrayList、HashSet、HashMap、StringBuilder

2. 数据结构:

Array:底层数据结构是数组,查询快,增删慢

Linked:底层数据结构是链表,查询慢,增删快

Hash:底层数据结构是哈希表,依赖hashcode和equals;

Tree:底层数据结构是二叉树。有自然排序和比较器排序。