List和Set均继承了Collection的全部方法(均为接口)
package testingDate;
import java.util.*;
/*
*
* 测试Collection接口中的方法
*
*
*
* */
public class TestList {
public static void main(String[] args) {
Collection<String> c = new ArrayList();
//实现了List接口,List继承Collection接口,打开声明可以看出需要对泛型进行定义
//c.size();
//返回元素数
System.out.println(c.size());
System.out.println(c.isEmpty());
//isEmpty()判断是否为空
c.add("栈");
c.add("堆");
//add方法添加元素,由于已经定义为字符串类型所以只能添加字符串进来
System.out.println(c);
System.out.println(c.size());
Object[] objs = c.toArray();
//将c转化为Object数组返回
System.out.println(c.contains("堆"));
//判断其中是否包含了“堆”
c.remove("栈");
//把对象移出容器,不是删除本身,不同于delete
System.out.println(c);
System.out.println(c.size());
c.clear();
//移除所有元素
System.out.println(c);
System.out.println(c.size());
//这些常用方法在List和Set中均得到实现
}
}
Collection接口
(对于两个集合的操作)
a.addAll(b容器)
将b中的所有元素加到a中
a.removeAll(b)
将b和a共同的元素在a中删除
a.retainAll(b)
只留下b和a的共同元素
a.containsAll(b)
返回a是否包含b全部元素的结果
List
有序,可重复的容器(底层实现就是数组)
重复指允许多个满足a.equals(b)的元素重复存在
常用实现有3个:ArrayList(数组,查询效率高,增删效率低,线程不够安全)、LinkedList(链表)和Vector(底层也是数组,线程安全)。
package testingDate; import java.util.; / * * 测试Collection接口中的方法
*/ public class TestList { public static void main(String[] args) { test01(); } public static void test01() {
List list = new ArrayList<>(); list.add(“A”);
list.add(“B”); list.add(“C”); list.add(“D”);
System.out.println(list); list.add(2,“方法区”);
System.out.println(list); //相当于创建了新的2号元素,插入到原本二号位,长度加一
list.set(3,“堆”); System.out.println(list); //替换,add是插入
list.get(3);System.out.println(list.get(3)); //获得索引位置的元素
list.get(3);System.out.println(list.indexOf(“堆”));
//返回指定的元素第一次出现的索引位置,没找到的时候返回-1}
}
ArrayList是可以存放任意数量对象长度不受限制的
采用数组扩容的思想,当检测到不能储存了,定义一个长度更大的数组 同时把前十个内容拷贝到新数组,每次检测到满再扩容
package testingDate;
/*
* 尝试复刻一下ArrayList的内容
*
*
*
* */
public class CopyArrayLIst <E>{
private Object[] elementData;
private int size;//长度
private static final int DEFALT_CAPACITY = 10;
//默认初始大小
public CopyArrayLIst(){
elementData = new Object[DEFALT_CAPACITY];
}
public CopyArrayLIst(int capacity){
elementData = new Object[capacity];
}
public void add(E element) {
elementData[size++]= element;
//添加element的同时增长size
}
//为了打印时直观可以重写toString方法
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i=0;i<size;i++) {
//只打印有内容部分
sb.append(elementData[i]+",");
}
sb.setCharAt(sb.length()-1,']');
//最后一个位置不需要逗号,将该字符改为后中括号
return sb.toString();
}
public static void main(String[] args) {
CopyArrayLIst s1 = new CopyArrayLIst(20);
s1.add("aa");
s1.add("bb");
System.out.print(s1);
}
}摘自b站教程
修改数组扩容版本:
package testingDate;
public class CopyArrayLIst <E>{
private Object[] elementData;
private int size;//长度
private static final int DEFALT_CAPACITY = 10;
//默认初始大小
public CopyArrayLIst(){
elementData = new Object[DEFALT_CAPACITY];
}
public CopyArrayLIst(int capacity){
elementData = new Object[capacity];
}
public void add(E element) {
/*什么时候扩容
* 怎么扩容
*
*
*
* */
//添加element的同时增长size
if(size==elementData.length) {
Object[] newArray = new Object[elementData.length+(elementData.length>>1)];
//>>1右移一位相当于除以2
System.arraycopy(elementData, 0, newArray,0, elementData.length);
//K拷贝老数组内容到新数组,arraycopy方法在之前数组中学过
elementData = newArray;
}
elementData[size++]= element;
}
//为了打印时直观可以重写toString方法
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for(int i=0;i<size;i++) {
//只打印有内容部分
sb.append(elementData[i]+",");
}
sb.setCharAt(sb.length()-1,']');
//最后一个位置不需要逗号,将该字符改为后中括号
return sb.toString();
}
public static void main(String[] args) {
CopyArrayLIst s1 = new CopyArrayLIst(20);
s1.add("aa");
s1.add("bb");
for (int i=0;i<50;i++) {
s1.add("mm"+i);
}
System.out.print(s1);
}
}
编写的时候记得时刻提防索引越界情况