定义
集合可以看做是一种容器,用来存储对象信息。所有集合类都位于java.util包下。但支持多线程的集合类位于java.util.concurrent包下。
集合的继承结构
常用API
1.add(E e):将指定元素添加到列表的尾部 2.add(Index,e):将指定元素添加到指定位置 3.clear():移除此列表中的所有元素 4.ensureCapacity(int minCapacity):增加容器的容量 5.isEmpty():判断集合是否为空 6.remove(index):移除此列表中指定位置上的元素 7.get(index):返回此列表中的所有元素 8.toArray():按适当顺序返回包含此列表中所有元素的数组
测试常用方法
```java
public class Test3_Collection {
public static void main(String
[] args
) {
Collection
<Integer> c
= new ArrayList();
c
.add(1);
c
.add(2);
c
.add(3);
c
.add(4);
c
.add(5);
System
.out
.println(c
);
System
.out
.println(c
.contains(3));
System
.out
.println(c
.equals(5));
System
.out
.println(c
.hashCode());
System
.out
.println(c
.isEmpty());
System
.out
.println(c
.remove(2));
System
.out
.println(c
.size());
System
.out
.println( Arrays
.toString( c
.toArray() ) );
Collection
<Integer> c2
= new ArrayList();
c2
.add(9);
c2
.add(8);
c2
.add(7);
System
.out
.println(c
.addAll(c2
));
System
.out
.println(c
.containsAll(c2
))
System
.out
.println(c
.removeAll(c2
));
Iterator
<Integer> it
= c
.iterator();
while(it
.hasNext()) {
Integer i
= it
.next();
System
.out
.println(i
);
}
}
}```
List接口
概述
有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。有序,可存放重复的元素
特点
1、 数据有序 2、 允许存放重复元素
常用方法
void add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。 boolean addAll(int index, Collection<? extends E> c) 将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。
E get(int index) 返回列表中指定位置的元素。
int indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。
int lastIndexOf(Object o) 返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1。
ListIterator listIterator() 返回此列表元素的列表迭代器(按适当顺序)。
ListIterator listIterator(int index)
返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
E remove(int index)
移除列表中指定位置的元素(可选操作)。
测试常用方法
public class Test4_List {
public static void main(String
[] args
) {
List
<String> list
= new ArrayList();
list
.add("钢铁侠");
list
.add("美国队长");
list
.add("灭霸");
list
.add("蜘蛛侠");
list
.add("灭霸");
list
.add(2, "test");
System
.out
.println(list
.get(4));
System
.out
.println(list
.indexOf("灭霸"));
System
.out
.println(list
.lastIndexOf("灭霸"));
System
.out
.println(list
.remove(0));
list
.set(0, "haha");
List list2
= list
.subList(2, 4);
System
.out
.println(list
.addAll(1, list2
));
Iterator
<String> it
= list
.iterator();
while(it
.hasNext()) {
System
.out
.println( it
.next() );
}
ListIterator
<String> it2
= list
.listIterator();
while(it2
.hasNext()) {
System
.out
.println( it2
.next() );
}
for(int i
= 0 ;i
< list
.size(); i
++) {
System
.out
.println(list
.get(i
));
}
for (Object obj
: list
) {
System
.out
.println(obj
);
}
}
ArrayList
概述
存在于java.util包中。
内部用数组存放数据,封装了数组的操作,每个对象都有下标。
内部数组默认初始容量是10。如果不够会以1.5倍容量增长。
查询快,增删数据效率会降低。
测试常用方法
/测试ArrayList的api
public class Test5_ArrayList {
public static void main(String
[] args
) {
ArrayList
<String> list
= new ArrayList<String>();
list
.add("tony");
list
.add("jack");
list
.add("rose");
list
.add("lilei");
list
.add("lilei");
list
.add("lilei");
list
.add(1, "hanmeimei");
ArrayList
<String> list2
= new ArrayList<String>();
list
.addAll(list2
);
list
.addAll(1,list2
);
System
.out
.println(list
.contains("lilei"));
System
.out
.println(list
.get(2));
System
.out
.println(list
.indexOf("lilei"));
System
.out
.println(list
.lastIndexOf("lilei"));
System
.out
.println(list
.isEmpty());
System
.out
.println(list
.remove(3));
System
.out
.println(list
.remove("rose"));
System
.out
.println(list
.size());
System
.out
.println(list
.set(0,"haha"));
System
.out
.println( Arrays
.toString( list
.toArray() ) );
Iterator
<String> it
= list
.iterator();
while(it
.hasNext()) {
System
.out
.println(it
.next());
}
ListIterator
<String> it2
= list
.listIterator();
while(it
.hasNext()) {
System
.out
.println(it
.next());
}
for(int i
= 0; i
< list
.size(); i
++) {
System
.out
.println(list
.get(i
));
}
for (String s
: list
) {
System
.out
.println(s
);
}
}
LinkedList
概述
双向链表,两端效率高。底层就是数组和链表实现的。
创建对象
LinkedList()
构造一个空列表。
常用方法
void addFirst(E e) 将指定元素插入此列表的开头。 void addLast(E e) 将指定元素添加到此列表的结尾。 E element() 获取但不移除此列表的头(第一个元素)。 E getFirst() 返回此列表的第一个元素。 E getLast() 返回此列表的最后一个元素。 与ArrayList相似,但是Vector是同步的。所以说它是线程安全的动态数组。
测试常用方法
public class Test6_LinkedList {
public static void main(String
[] args
) {
LinkedList
<Integer> ll
= new LinkedList();
ll
.add(1);
ll
.add(2);
ll
.add(3);
ll
.add(4);
ll
.add(5);
ll
.addFirst(0);
ll
.addLast(9);
ll
.offerFirst(100);
ll
.offerLast(200);
System
.out
.println(ll
);
System
.out
.println(ll
.getFirst());
System
.out
.println(ll
.getLast());
System
.out
.println(ll
.peekFirst());
System
.out
.println(ll
.peekLast());
System
.out
.println(ll
.removeFirst());
System
.out
.println(ll
.removeLast());
System
.out
.println(ll
);
System
.out
.println(ll
.pollFirst());
System
.out
.println(ll
.pollLast());
System
.out
.println(ll
);
Iterator
<Integer> it
= ll
.iterator();
while(it
.hasNext()) {
System
.out
.println(it
.next());
}
for(int i
= 0 ; i
< ll
.size() ; i
++) {
System
.out
.println(ll
.get(i
));
}
}
Set接口
概述
一个不包含重复元素的 collection。 数据无序(因为set集合没有下标)。 由于集合中的元素不可以重复。 常用于给数据去重。
特点
1、 数据不允许重复 2、 数据无序 3、 HashSet:底层是哈希表 4、 TreeSet:底层是TreeMap,也是红黑树的形式,
常用方法
略,同Collection接口
HashSet
概述
底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。其中,K不许重复。此类允许使用 null 元素。
####三者之间的区别 Arraylist:底层数据结构是数组,查询快,增删慢,线程不安全,效率高,可以存储重复元素 LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高,可以存储重复元素 Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低,可以存储重复元素
Map
概述
1.可以根据键 提取对应的值 2、 键不允许重复,如果重复值会被覆盖 3、 存放的都是无序数据 4、 初始容量是16,默认的加载因子是0.75
HashMap
概述
HashMap底层是一个Entry数组,当存放数据时会根据hash算法计算数据的存放位置。