给公司做网站需要什么,给自己的网站做代言,仙居做网站的,商标logo设计软件 免费List Set Map
一、List
几个小问题#xff1a;
1、接口可以被继承吗#xff1f;#xff08;可以#xff09;
2、接口可以被多个类实现吗#xff1f;#xff08;可以#xff09;
3、以下两种写法有什么区别#xff1f;
//List list1new List();是错误的因为List()…List Set Map
一、List
几个小问题
1、接口可以被继承吗可以
2、接口可以被多个类实现吗可以
3、以下两种写法有什么区别
//List list1new List();是错误的因为List()是一个接口是抽象的不能被实例化
//ArrayList()在源码中是一个类(class)可以new对象
//只能用List接口里的方法不能使用ArrayList中的方法
List list1new ArrayList();//可以使用ArrayList里的所有方法因为ArrayList实现1ist接口所以可以调用的方法比第一种要多,还可以使用List接口里面没有的方法
ArrayList list2new ArrayList();
第一种写法是List接口new的对象只能用接口中的方法第二种是new一个类对象就像Student stuentnew Student()这样所以可以使用ArrayList中的方法又因为ArrayList实现了List接口所以也能用List中的方法
4、通常List添加元素
ListString list new ArrayList();
list.add(aaa);
list.add(bbb); 当所添加元素确定时可以这样写
ListString list1 Arrays.asList(aaa,bbb);
当List内元素确定时这样写性能较高没有扩容操作
但是如果想再向list1中添加元素时会报错原因是上述写法执行时JVM会自动申请两块只有两块连续的内存空间再add会报错。 List中的api
1、添加元素 add()
ListString list new ArrayList();
list.add(aaa);
list.add(bbb);
list.add(ccc);
list.add(ddd);System.out.println(list); //[aaa,bbb,ccc,ddd]
2、获取指定下标元素 get(int index)
String str list.get(3);
System.out.println(str);//ccc
3、设置指定元素更改为新值 set(int index,E e)
String old list.set(0, 1);
System.out.println(list);//[1,bbb,ccc,ddd]
System.out.println(old);//aaa
4、指定位置添加新元素 add(int index,E e)
在第index个位置添加新的值e原来这个位置及其后面的元素都向后移一位。
//list集合为[aaa,bbb,ccc,ddd]
list.add(1,2);
System.out.println(list);
//[aaa,2,bbb,ccc,ddd]
5、删除指定位置元素 remove(int index)
删除第index数返回的是被删除的那个数每次只能删除一个数
String str list.remove(1);
System.out.println(list);//[aaa,bbb,ccc,ddd]
System.out.println(str);//2
6、删除全部元素
错误示例遍历删除
ListString list new ArrayList();
//这里插入4个aaa
list.add(aaa);
list.add(aaa);
list.add(aaa);
list.add(aaa);//遍历删除
for(int i0;ilist.size();i){if(aaa.equals(list.get(i))){list.remove(i);}
}System.out.println(list); //[aaa,aaa] 发现这样的遍历删除并不能删除干净。 为什么遍历list删不干净
原因每当删除一个元素下一个元素就会向前顶一个位置会使原本index为1的元素变为为0且 i 在执行后会自增导致一半元素无法删除。 删除的三种方法
倒序删除
public static void main(String[] args) {ListString list new ArrayList();list.add(aaa);list.add(aaa);list.add(aaa);list.add(aaa);//倒序遍历删除for(int ilist.size()-1;i0;i--){if(aaa.equals(list.get(i))){list.remove(i);}}System.out.println(list);}
迭代器删除
public static void main(String[] args) {ListString list new ArrayList();list.add(aaa);list.add(aaa);list.add(aaa);list.add(aaa);// 使用迭代器删除IteratorString iterator list.iterator();while(iterator.hasNext()) {String s iterator.next();if (aaa.equals(s)) {iterator.remove();}}System.out.println(list);}
lambada删除
public static void main(String[] args) {ListString 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判空
ListString listnew ArrayList();
system.out.print(listnull); //false
list数组是new出来的判断一定为false 使用 hutool 工具类判空
依赖
!--hutool工具类--
dependencygroupIdcn.hutool/groupIdartifactIdhutool-all/artifactIdversion5.8.11/version
/dependency
工具类判空
ListString list new ArrayList();//写法错误当list定义为ListString listnull;会出现空指针
list.get(1).equals(list.get(2));//正确写法
boolean equalsStrUtils.equals(list.get(1),list.get(2)) list不是线程安全的 创建线程的四种方式 1继承Thread类创建线程 2实现Runnable接口创建线程 3使用Callable和Future创建线程 4使用线程池例如用Executor框架 多线程操作List实例
public class ListDemo {public static void main(String[] args) {ArrayListString list new ArrayList();MyThread m1new MyThread(list);MyThread m2new MyThread(list);new Thread(m1).start();new Thread(m2).start();System.out.println(list);}
}
public class MyThread implements Runnable{ArrayListString arr;public MyThread(ArrayListString arr) {this.arr arr;}Overridepublic void run() {for(int i0;i100;i){arr.add(arri);System.out.println(Thread.currentThread().getName()在第iarr.get(i));}}
} 两个线程操作同一个List导致线程不安全。