Java -- List 及其实现类
Collection(集合)接口
- Collection 接口时在整个java类集合中保存单值的最大操作父接口,里面每次操作都只能保存一个对象的数据。定义在java.util包中
- 常用的子接口:List(有序集合) 、Set
List
ArrayList
-
ArrayList 是 List 下的一个实现类
-
ArrayList :使用的是数组结构,对于增加 删除 慢,查找快
-
构造方法如下:
ArrayList() -- jdk 上是这样解释的:构造一个初始值为10的空列表
实际的创建过程是这个样子的:首先创建一个长度为0 的列表
底层源码:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
当添加内容时(即 调用 .add() 方法)
源码:
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}
ps:调用.add()方法,返回的一定是 true
当列表大小不够时 一次扩容到原来的1.5倍
ArrayList(int initialCapacity) 构造具有指定初始容量的空列表
- 基本操作:add(), add(index ,element), remove() , get() ,clear()
public static void main(String[] args) {
//使用的是数组结构,对于增删改查慢,查找快
//<>必须传包装类
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(100);
arrayList.add(50);
arrayList.add(180);
arrayList.add(1);
arrayList.add(70);
System.out.println(arrayList.get(0)); //获取指定位置的元素
System.out.println(arrayList); // 默认调用 .toString()方法
arrayList.add(0,10); // 指定位置添加元素
System.out.println(arrayList);
arrayList.remove(0); // 删除指定位置的元素
//arrayList.clear(); // 清空整个ArrayList集合
System.out.println(arrayList);
}
LinkedList
- LinkedList 是List的一个实现类
- 使用双向链表结构,对于增加 删除块,查找慢
- 继承List的方法,并有自己新添加的方法:
- addFirst() removeFirst() 等
LinkedList<Integer> data = new LinkedList<>();
// 最基础的添加方法,注意看顺序
data.add(1);
data.add(2);
data.add(3);
System.out.println(data.get(1));
System.out.println(data);
- 模拟栈结构 addLast()
//从首部添加,模拟栈结构
data.addFirst(100);// 类似于压栈
data.addFirst(200);
System.out.println("模拟压栈:"+data);
//从首部获取 并删除元素
Integer i = data.removeFirst();
System.out.println("从首部获取 并删除元素"+i);
System.out.println("查看删除后的集合"+data);
//从尾部添加
data.addLast(300);
System.out.println("从尾部添加"+data);
Integer i2 = data.removeFirst();
System.out.println("查看删除后的集合:"+data);
- 栈结构 push() pop()
// 压栈
data.push(110);
data.push(220);
System.out.println("显示压栈后的内容:"+data);
// 弹栈
Integer i3 = data.pop();
System.out.println(i3);
System.out.println("显示弹栈后的内容:"+data);
迭代器(Iterator)
/*迭代器*/
//Iterator,只能作用在 Collection的实现类上
//ListIterator 只能作用在 LinkedList上
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(100);
arrayList.add(50);
arrayList.add(180);
arrayList.add(1);
arrayList.add(70);
Iterator<Integer> iterator = arrayList.iterator();
while (iterator.hasNext()){ // (数组)指针首先指向 -1 的位置,hasNext 向下走一次,判断是否有下一个内容 并回到原来的位置
Integer i = iterator.next(); //让指针向下移动一位
System.out.println(i);
}
// 以下代码放在 遍历之后会报错。原因 上边的代码已经将指针指向 ArrayList 的最后一个元素,再往下为空,会报错。可以把上边 遍历注释后查看效果
/* iterator.next();
iterator.remove();
System.out.println(arrayList);*/ //结果见第二张图片
foreach
- 用于迭代 数组 或集合
- 语法:for(数据类型 变量名:集合或数组){}
int[] arr = {6,5,4,1,2,8};
for (int i:arr) {
System.out.print(i+" ");
}
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("明日明日明日明日");
arrayList.add("明日明日明日何其");
arrayList.add("明日明日明日何其多");
for(String s :arrayList){
System.out.println(s);
}
System.out.println();
LinkedList <Integer> nums = new LinkedList<>();
nums.add(5);
nums.add(2);
nums.add(2);
nums.add(3);
for(Integer i:nums){
System.out.println(i);
}