List Set Map
几个小问题:
1、接口可以被继承吗?(可以)
2、接口可以被多个类实现吗?(可以)
3、以下两种写法有什么区别?
//List list1=new List();是错误的因为List()是一个接口,是抽象的不能被实例化
//ArrayList()在源码中是一个类(class),可以new对象
//只能用List接口里的方法,不能使用ArrayList中的方法
List list1=new ArrayList();
//可以使用ArrayList里的所有方法,因为ArrayList实现1ist接口,所以可以调用的方法比第一种要多,还可以使用List接口里面没有的方法
ArrayList list2=new ArrayList();
4、通常List添加元素:
List list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
当所添加元素确定时,可以这样写:
List list1 = Arrays.asList("aaa","bbb");
当List内元素确定时,这样写性能较高,没有扩容操作
但是如果想再向list1中添加元素时会报错,原因是上述写法执行时JVM会自动申请两块(只有两块)连续的内存空间,再add会报错。
List list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
System.out.println(list); //[aaa,bbb,ccc,ddd]
String str = list.get(3);
System.out.println(str);//ccc
String old = list.set(0, "1");
System.out.println(list);//[1,bbb,ccc,ddd]
System.out.println(old);//aaa
在第index个位置添加新的值e,原来这个位置及其后面的元素都向后移一位。
//list集合为:[aaa,bbb,ccc,ddd]
list.add(1,"2");
System.out.println(list);
//[aaa,2,bbb,ccc,ddd]
删除第index数,返回的是被删除的那个数;每次只能删除一个数
String str = list.remove(1);
System.out.println(list);//[aaa,bbb,ccc,ddd]
System.out.println(str);//2
List list = new ArrayList<>();
//这里插入4个aaa
list.add("aaa");
list.add("aaa");
list.add("aaa");
list.add("aaa");
//遍历删除
for(int i=0;i
发现这样的遍历删除并不能删除干净。
原因:每当删除一个元素,下一个元素就会向前顶一个位置,会使原本index为1的元素变为为0,且 i 在执行后会自增,导致一半元素无法删除。
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("aaa");
list.add("aaa");
list.add("aaa");
list.add("aaa");
//倒序遍历删除
for(int i=list.size()-1;i>=0;i--){
if("aaa".equals(list.get(i))){
list.remove(i);
}
}
System.out.println(list);
}
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("aaa");
list.add("aaa");
list.add("aaa");
list.add("aaa");
// 使用迭代器删除
Iterator iterator = list.iterator();
while(iterator.hasNext()) {
String s = iterator.next();
if ("aaa".equals(s)) {
iterator.remove();
}
}
System.out.println(list);
}
public static void main(String[] args) {
List list = new ArrayList<>();
list.add("aaa");
list.add("aaa");
list.add("aaa");
list.add("aaa");
// 使用 jdk8 新方法
list.removeIf(item -> "aaa".equals(item));
System.out.println(list);
}
List list=new ArrayList<>();
system.out.print(list==null); //false
list数组是new出来的,判断一定为false
依赖
cn.hutool
hutool-all
5.8.11
工具类判空
List list = new ArrayList<>();
//写法错误,当list定义为List list=null;会出现空指针
list.get(1).equals(list.get(2));
//正确写法
boolean equals=StrUtils.equals(list.get(1),list.get(2));
1)继承Thread类创建线程
2)实现Runnable接口创建线程
3)使用Callable和Future创建线程
4)使用线程池例如用Executor框架
public class ListDemo {
public static void main(String[] args) {
ArrayList list = new ArrayList<>();
MyThread m1=new MyThread(list);
MyThread m2=new MyThread(list);
new Thread(m1).start();
new Thread(m2).start();
System.out.println(list);
}
}
public class MyThread implements Runnable{
ArrayList arr;
public MyThread(ArrayList arr) {
this.arr = arr;
}
@Override
public void run() {
for(int i=0;i<100;i++){
arr.add("arr"+i);
System.out.println(Thread.currentThread().getName()+"在第"+i+arr.get(i));
}
}
}
两个线程操作同一个List导致线程不安全。