ArrayList
特征:
- 底层实现是数组,数据结构是线性表(连续的元素、连续的存储空间、有首有尾)
- jdk1.8之前初始容量是10,jdk1.8之后初始容量是0(在存入第一个元素的时候,容量为10)
- 扩容为原容量的1.5倍(参考方法grow)
- 有序的、不唯一、可为null、有索引(会越界)
- 查找较快、插入删除较慢
- 线程不同步、多线程使用不安全
- 如果要同步:List list = Collections.synchronizedList(new ArrayList(…));
常用方法:
/**
* 1.构造方法
* ArrayList()
* ArrayList(int initialCapacity)(初始化给出容量)//没有经过扩容
*
* 2.添加元素
* add(E e)
* add(int index, E element) (索引值,要添加的元素):如果索引值已存在会默认把原有的元素全部后移。
*
* 3.获取元素
* get(int index) (元素的索引值):通过索引值去获得值
*
* 4.移除元素:
* remove(int index)(元素的索引值):移除固定索引的元素,返回元素内容
* remove(Object o)(元素的内容):移除相同内容的元素,返回布尔值
* removeRange(int fromIndex, int toIndex):(开始索引,结束索引):包头不包尾,删除区间内的所有元素
*
* 5.获取元素个数:
* size() :
*
* 6.清空容器:
* clear()
*
* 7.判断容器是否为空
* isEmpty()
*
* 8.判断是否包含某个元素:
* contains(Object o) (元素的内容)
*
* 9.查找指定元素的索引:
* indexOf(Object o) (元素的内容)
*
* 10.截取容器并返回新容器对象:
* subList(int fromIndex, int toIndex) (开始索引,结束索引)
*
* 11.返回包含所有元素的数组
* toArray() //返回的是Object类的对象
* toArray(T[] a) //可以返回固定类型的数数组
*
* 12.设置元素
* set(int index, E element) (要替换的索引,内容):设置内容,返回原内容
*
*
*/
集合的遍历:
ArrayList<String> list1 = new ArrayList<>();
- fori
for (int i = 0; i < list1.size(); i++) {
System.out.println(list1.get(i));
}
- foreach
for (String name : list1) {
System.out.println(name);
}
3.iterator()获取Iterator对象,然后遍历
Iterator<String> it = list1.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
4.forEach()方法
list1.forEach(x -> {
x = "name:" + x;
System.out.println(x);
});
5.stream()方法
list1.stream().filter(x -> !x.equals("任玉文")).count();
注意:list集合中只能存放引用数据类型,这里值得注意的是int类型的包装类
// list集合中只能存放引用数据类型
List<Integer> list = new ArrayList<>();
// list.add("hello");
list.add(123); // int -> Integer
list.add(666);
list.add(888);
list.add(2);
list.set(1, 777);
list.remove(2); // 按照索引删除
list.remove(new Integer(2)); // 按照元素删除
LinkedList
特征:
- 底层实现的是node节点,数据结构是双向链表,也可以作为队列(先进先出),栈(先进后出)
- 没有扩容的概念
- 有序的,可重复,可为null,有索引
- 线程不同步,多线程不安全的,如果要同步的LinkedList,List list = Collections.synchronizedList(new LinkedList(…))
常用方法
List接口的方法(与ArrayList类似)
add()\get()\remove()\set()\size()\clear()\contains()\isEmpty()\indexOf()\lastIndexOf()
Deque接口的方法
addFirst(E e)将指定元素插入到此列表的开头
addLast(E e)将指定元素插入到列表的结尾
getFirst()返回此列表的第一个元素
getLast()返回此列表的最后一个元素
removeFirst()移除并返回此列表的第一个元素
removeLast()移除并返回次列表的最后医个元素
offer(E e)将指定元素添加到此列表的末尾(最后 一个元素)
offerFirst(E e) 在此列表的开头插入指定的元素
offerLast(E e)在此列表的末尾插入指定的元素
peek()获取但不意出此列表的头(第一个元素)
peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,则返回null
peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,则返回null
poll()获取并移除系列表的头(第一个元素)
pollFirst()获取并移除此列表的第一个元素;如果次列表为空,则返回null
pollLast()获取并移除此列表的最后一个元素;如果此列表为空,则返回null
push(E e)将元素推入此列表所表示的堆栈
pop() 从此列表所表示的堆栈中弹出一个元素
执行List接口的方法:
@Test
public void test1() {
List<String> list = new LinkedList<>();
list.add("Tom");
list.add("Han");
list.add("Marry");
String name = list.get(2);
int index = list.indexOf("Marry");
System.out.println(list.get(0));
System.out.println(list.get(list.size() - 1));
}
执行Deque接口的方法:
@Test
public void test2() {
Deque<String> list = new LinkedList<>();
list.add("java");
list.add("python");
list.addFirst("hello");
list.addLast("world");
System.out.println(list);
System.out.println(list.getFirst());
System.out.println(list.getLast());
System.out.println(list.removeFirst());
System.out.println(list);
}
Vector
特征:
- 底层实现是接口,数据结构是线性表
- 默认容量是10
- 默认扩容为原容量的2倍
- 有序的、不唯一、可为null、有索引(会越界)
- 查找较快,插入删除较慢
- 线程同步的,多线程使用安全的,单线程使用效率较低
常用方法:
- 可以参考ArrarList
考点:Vector和ArrayList的异同
Stack
- 继承自Vector类
- 实现了栈的数据结构
- 线程同步的,多线程使用安全的,单线程使用效率低