1.Collection接口
2. List接口
2.1 ArrayList
2.1.1 常用方法
增add
删remove
改set
查get
package com.qfedu.test2;
import java.util.ArrayList;
/**
* Collection
* List
* ArrayList
*
* 增add
* 删remove
* 改set
* 查get
* @author WHD
*
*/
public class TestArraysList1 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(20);
list.add('A');
list.add("abc");
list.add("中国");
System.out.println(list.size());
System.out.println(list.remove(0));
System.out.println(list.size());
System.out.println(list.set(0, "a"));
System.out.println(list.get(0));
System.out.println(list.isEmpty());
list.clear();
System.out.println(list.isEmpty());
System.out.println(list.size());
}
}
package com.qfedu.test3;
import java.util.ArrayList;
/**
* 泛型 :用于规定集合中的数据类型
* @author WHD
*
*/
public class TestArrayList1 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>(); // ctrl + shift + o
list.add("abc");
// list.add(20); 类型不匹配
list.add("hello");
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<Boolean> list2 = new ArrayList<Boolean>();
}
}
2.1.2 遍历
三种方式:
1.普通for循环遍历
2.迭代器遍历
3.增强for循环遍历
package com.qfedu.test3;
import java.util.ArrayList;
import java.util.Iterator;
/**
* 集合的遍历
* 三种方式:
* 1.普通for循环遍历
* 2.迭代器遍历
* 3.增强for循环遍历
* @author WHD
*
*/
public class TestArrayList2 {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(20);
list.add(21);
list.add(22);
list.add(23);
list.add(24);
// 方式1 普通for循环遍历
for(int i = 0;i < list.size();i++) {
System.out.println(list.get(i));
}
System.out.println("-------------------------------");
// 方式2 迭代器遍历
Iterator<Integer> it1 = list.iterator();
while(it1.hasNext()) {
System.out.println(it1.next());
}
System.out.println("-------------------------------");
// 方式3 增强for循环 底层实现依然是迭代器 是JDK1.5的新写法
for(Integer i :list) {
System.out.println(i);
}
System.out.println("-------------------------------");
int [] nums = {1,2,3,4,5};
for(int num : nums) {
System.out.println(num);
}
}
}
2.1.3 底层实现
ArrayList特点:
有序,可以重复,可以为null,线程不安全
底层实现是一个Object类型的数组
当我们调用无参构造方法,底层维护一个空数组,当我们第一次添加元素,将数组的长度改为10
扩容为原数组的1.5倍
查询,修改快,因为有下标
增加慢,因为需要扩容
删除慢,因为需要移动元素
2.2 Vector
Vector类 和ArrayList的区别?
Vector是线程安全的 JDK1.0
ArrayList线程不安全 JDK1.2
Vector调用无参构造直接初始化一个长度为10的数组
ArrayList调用无参构造初始化一个空数组
ArrayList扩容1.5倍
Vector扩容两倍
package com.qfedu.test5;
import java.util.Vector;
/**
* Vector类 和ArrayList的区别?
* Vector是线程安全的 JDK1.0
* ArrayList线程不安全 JDK1.2
* Vector调用无参构造直接初始化一个长度为10的数组
* ArrayList调用无参构造初始化一个空数组
* ArrayList扩容1.5倍
* Vector扩容两倍
*
* @author WHD
*
*/
public class TestVector {
public static void main(String[] args) {
Vector<Double> v1 = new Vector<Double>();
v1.add(2.2);
v1.add(2.3);
v1.add(2.5);
v1.add(20.1);
System.out.println(v1.size());
System.out.println(v1.remove(0));
v1.set(0, 220.2);
System.out.println(v1.get(0));
System.out.println(v1.isEmpty());
v1.clear();
System.out.println(v1.isEmpty());
// 遍历方法 和ArrayLis相同 有三种
}
}
2.3 LinkedList
2.3.1 常用方法
LinkedList 基于双向链表实现的集合
除了与ArrayList相同的增删改查方法以外
还单独提供了用于操作头部和尾部的方法
package com.qfedu.test6;
import java.util.LinkedList;
/**
* LinkedList 基于双向链表实现的集合
* 除了与ArrayList相同的增删改查方法以外
* 还单独提供了用于操作头部和尾部的方法
* @author WHD
*
*/
public class TestLinkedList {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<String>();
list.add("a");
list.add("b");
list.addFirst("hello");
list.addFirst("C");
list.addLast("xyz");
System.out.println(list.size());
System.out.println(list.getFirst());
System.out.println(list.getLast());
System.out.println(list.get(2));
System.out.println(list.remove(0));
System.out.println(list.set(0, "HELLO"));
System.out.println(list.removeFirst());
System.out.println(list.removeLast());
list.clear();
System.out.println(list.isEmpty());
}
}
2.3.2 遍历
LinkedList三种遍历方式
1.普通for循环
2.迭代器
3.增强for循环
package com.qfedu.test6;
import java.util.Iterator;
import java.util.LinkedList;
/**
* LinkedList三种遍历方式
* 1.普通for循环
* 2.迭代器
* 3.增强for循环
* @author WHD
*
*/
public class TestLinkedList1 {
public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// 方式1
for(int i = 0;i < list.size();i++) {
System.out.println(list.get(i));
}
System.out.println("-----------------------------");
// 方式2
Iterator<Integer> it = list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
System.out.println("-----------------------------");
// 方式3
for(Integer i : list) {
System.out.println(i);
}
}
}
2.3.3 底层实现
LinkedList特点:
有序的,允许重复,允许为null,线程不安全
根据下标查询,修改慢,因为不能直接查询到某个元素,必须先查询到相邻元素
增加和删除快,因为不需要扩容,不需要移动元素
get()方法优化:当我们根据下标查找LinkedList元素的时候
先对下标进行判断,如果下标是小于集合总长度中间值的 ,从前往后查询
否则,从后往前找
鉴于LinkedList数据结构特点,不要使用普通for循环遍历