Java集合

一、集合概述
1、集合、数组都是多个数据进行存储操作的结构,简称Java容器
说明:此时的存储是指内存的存储,不涉及到持久化存储
2、数组在多个数据方面的特点

  • 一旦初始化之后长度就确定了
  • 一旦定义好,其元素的数据也就确定了,我们就只能操作指定类型的数据了

3、数组在存储多个数据的缺点

  • 一旦初始化后,长度不可修改
  • 数组中提供的方法非常有限,对于添加、删除、插入等操作,非常不方便
  • 获取数组中实际元素的个数,数组没有现成的方法可用
  • 数组存储数据的特点:有序、可重复。有序、不可重复的需求,不能满足

二、集合框架
Collection接口:单列接口,用来存储一个一个对象

  • list接口:存储有序的可重复的数据 —>动态数组
    • ArrayList、LinkedList、Vector
  • set接口:存储无序的不可重复的数据 —>集合
    • HashMap、LinkedHashMap、TreeMap、Hashtable、Properties

Map接口:双列集合,用来存储一对的数据(key — value)

三、Collection接口中的方法
collection接口的实现类添加数据时,需要重写equals
@Test
public void test1(){
Collection collection = new ArrayList();

//add 将元素加入集合中
collection.add(“AA”);
collection.add(“BB”);
collection.add(“CC”);
collection.add(123);
collection.add(new String(“Tom”));
//size(获取添加的元素个数)
System.out.println(collection.size());

//addAll 将集合1的元素添加到集合
Collection collection1 = new ArrayList();
collection1.add(“qweqw”);
collection1.add(“CCCCw”);
collection.addAll(collection1);

System.out.println(collection.size());

//clear() 清空元素
//collection.clear();

//isEmpty 判断是否拥有元素
System.out.println(collection.size());

//contains 当前对象是否包含obj equals判断
boolean contains = collection.contains(123);
System.out.println(contains);
System.out.println(collection.contains(new String(“Tom”)));

//remove
collection.remove(123);
System.out.println(collection);

//removeALl 从当前集合移除之后的全部元素
//collection.removeAll(collection1);
//System.out.println(collection);

//retainAll 获取当前集合与coll1的交集,并且返回给当前集合
collection.retainAll(collection1);
System.out.println(collection);

//euqals 集合与集合元素是否相等,ArrayList有序,对比也有序

四、Iterator(迭代器)
遍历Collection中的元素
Iterator iterator = collection.iterator();

//下一个元素
System.out.println(iterator.next());

//HasNext 还有下一个 Boolean —> hasNext
while(iterator.hasNext()){
System.out.println(iterator.next());
}

五、强化for循环
//赋值给obj并且输出obj知道容器里没有元素
for(Object obj : collection){
System.out.println(obj);
}

六、List接口

  • 鉴于Java中数组用来存储数据的局限性,我们通常使用List替代数组
  • List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。
  • List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据 序号存取容器中的元素。
  • JDK API中List接口的实现类常用的有:ArrayList、LinkedList和Vector。

* list接口:存储有序的可重复的数据 —>动态数组
* ArrayList:作为list主要实现类;线程不安全、效率高;底层使用object【】 elementData存储
* LinkedList:对于频繁的插入、删除操作,效率比ArrayList高底层使用双向链表存储
* Vector:作为list的古老实现类;线程安全的,效率低;底层也是object【】elementData存储
*
*
* ArrayList源码分析
* —— JDK7
* ArrayList arrayList = new ArrayList();初始长度10
* 如果容量不够,则扩容,默认情况下扩容为1.5倍,同时将原数组中的数据复制到新的数组中
*
* 结论:尽量使用带参的构造器
*
* —— JDK8
* ArrayList arrayList = new ArrayList();初始化为{},并没有创建数组
* 第一次使用add的时候创造了一个长度为10的数组,并将123数据加到elementData
* 后续与7没有区别
*
* LinkedList源码分析
* LinkedList list = new LinkedList();内部声明了Node类型的First和Last属性,默认值为null
*
* Vector不怎么用了 区别就是扩容为2倍
* 线程安全可以使用collection的方法转换arraylist数组

ArrayList 常用方法

  • void add(int index, Object ele):在index位置插入ele元素
  • boolean addAll(int index, Collection eles):从index位置开始将eles中 的所有元素添加进来
  • Object get(int index):获取指定index位置的元素
  • int indexOf(Object obj):返回obj在集合中首次出现的位置
  • int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
  • Object remove(int index):移除指定index位置的元素,并返回此元素
  • Object set(int index, Object ele):设置指定index位置的元素为ele
  • List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex 位置的子集合

遍历方式:

  1. Iterator
  2. 强化for循环
  3. for循环

七、Set接口
* set接口:存储无序的不可重复的数据 —>集合
* HashMap:Set的主要接口,线程不安全,可以存储null值
* LinkedHashMap:作为HashSet的子类,遍历内部数据时,可以按照添加的顺序遍历
* TreeMap:可以按照添加对象的指定属性,进行排序
*
* 一、Set:存储无序的、不可重复的数据
* 1、无序性:不等于随机性,存储在底层数组的数据并非按照数组索引的顺序添加,而是根据数据的哈希值存储
*
* 2、不可重复性:保证添加的元素按照equals判断时,不能返回true 相同的元素只能添加一个
*
* 二、添加元素的过程:以HashSet为例:
* 我们向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算a的哈希值
* 此哈希值接着通过某种算法计算处在HashSet底层数组的存放位置,判断数组此位置上是否已有元素
* 如果此位置没有其他元素,a添加成功
* 如果此位置没有其他元素,需要调用a所在类的equals方法
* equals返回true a添加失败
* equals返回false a添加成功
*
* 添加成功的情况而言,a,与已存在的元素以链表的方式进行存储
* jdk7:元素a放到数组中,直向原来元素
* jdk8:原来元素在数组中,指向a
* 七上八下
*
* Set中使用的都是Collection声明过的方法
*
* 要求:1、向set添加的数据一定要重写hashcode和equals
* 2、重写的hashcode和equals要尽可能保持一致性,相等的对象需要相等的散列码
*
* HashSet底层就是HashMap
*
*
* TreeSet
* 1、向TreeSet添加数据时,数据需要是同一类的对象
* 2、两种排序方式:自然排序(compareTo)和定制排序(comparator)
*
* 3、自然排序中判断数据是否相同,compareto返回0

只读集合创建方式
List lit = Array.asList();
调用collections。unmodifiableList方法
jdk9之后 使用of方法

可以使用foreach循环来遍历集合
用大括号里的语句重写Customer接口中的accept方法
ArrayList list = new ArrayList(){};
1、list.foreach(e -> Systom.out.println(e)); //Lambda表达式

2、list.foreach(e->{
if(e.equals(a)){Systom.out.println(e)}
})

3、list.foreache(Sysout.out :: println); //方法引用