1、集合概述
Java按照存储结构可以将集合分成两大类。一类是单链集合(Collection),一类是双链集合(Map)。
其中Collection是单链集合的根接口。在此之下还分List和Set两个集合子接口。
Map是双链集合的根接口,专门用于存放键值对(key value)的集合。
2、集合和数组的区别
(1)数组的长度是固定的,而集合的长度是可以扩容的。
(2)存储类型:数组的类型可以是基本类型,或者是引用类型;集合的类型只能是引用类型。
3、List接口
概述:List集合的特点:存放的元素有序、且元素可重复。所有的元素以线性的方式进行存储,访问可以通过索引下标的形式进行访问集合中的指定元素。
List集合的实现类:
1)、LinkList
2)、ArrayList
3)、vector(淘汰了)
3.1 ArrayList
1、概述:ArrayList集合类是Collection接口的子接口List的实现类之一,在ArrayList集合内部封装了一个长度可变的数据,当存入的元素超过数组长度时,会分配更大内存的数组来存储这些元素。
2、底层是基于数组的,需要连续的内存。
3、ArrayList扩容:扩容规则是数组长度=当前数据长度/2+当前数组长度。
采用addAll(),添加元素,由于添加的是一个集合,所以第一次扩容的时候,应该在 扩容的默认长度和元素个数,选一个较大值。
4、随机访问快,通过数组下标进行查询。
5、尾部增删数据快,其他慢。
6、访问效率高,线程不安全。
7、常用方法:
size():集合长度
add(E e):返回是否添加成功
get(index):返回指定下标的元素
set(index,new,old):修改指定下标的元素,返回旧元素
remove(E e):返回值代表是否删除成功
remove(index):返回值为删除的元素
3.2 LinkList
1、底层是一个双向链表,无需连续的内存。
2、随机访问慢(根据链表遍历)
3、头尾插入删除快
4、线程不安全,效率高。
5、主要方法:
public static void main(String[] args){
LinkedList<Integer> linkedList=new LinkedList<>();
LinkedList<Integer> linkedList1=new LinkedList<>();
linkedList1.add(3);
linkedList1.add(5);
System.out.println(linkedList.size());
// linkedList.add(20,2);
linkedList.add(3);
linkedList.addFirst(1);//添加第一个的值
linkedList.addLast(5);//添加最后的值
linkedList.add(2,30);//添加指定下标的值
int a=linkedList.set(0,22);
System.out.println("返回被修改的值(旧值):"+a);
System.out.println("返回第一个值:"+linkedList.element());
System.out.println(linkedList);
linkedList.remove();//底函数是:removeFirst()
System.out.println("remove之后的值:"+linkedList);
linkedList.remove(2);
System.out.println("remove指定下标的值:"+linkedList);
linkedList.removeAll(linkedList1);//删除该数组中同样的值
System.out.println(linkedList);
}
4、Set接口
4.1 HashSet
(1)概述:Set系列的集合添加的元素是无序,不可重复的,无索引
(2)Set实现类:HashSet,TreeSet,LinkedHashSet(继承于HashSet)
(3)方法:
遍历方法:迭代器遍历和增强for循环遍历
public static void main(String[] args){
HashSet<Integer> a=new HashSet<>();
HashSet<Integer> a1=new HashSet<>();
a1.add(12);
a1.add(22);
a1.add(32);
a.addAll(a1);
a.add(1);
a.add(2);
a.add(3);
a.add(4);
a.add(5);
a.add(6);
System.out.println(a);
Iterator it=a.iterator();
while (it.hasNext()){
int b= (int) it.next();
System.out.println(b);
}
for(Integer b:a){
System.out.println(b);
}
}
4.2TreeSet
(1)概述:不重复,无索引,可排序(按照元素的默认规则排序)
TreeSet集合底层是基于红黑树的数据结构实现排序的,增删改查性能都好
(2)默认的排序规则
数值型:默认按照从小到大的顺序进行排序
字符,字符串:按照字符在ASCII表中的数字升序进行排序
4.3 TressSet的两种比较方式
方式一:默认排序:javabean类实现Comparable接口指定比较规则
方式二: 比较器排序:创建TreeSet对象的时候,传递比较器Comparator制定规则