JAVA之list使用

1.定义和初始化

(1)创建空list,然后逐一添加

List<Integer> list=new ArrayList<>();
list.add(1);list.add(2);

如果不规定List的类型,是可以添加不同的元素的,但是会使代码可读性下降。

List list=new ArrayList<>();
list.add(1);list.add("str");list.add(false);
System.out.println(list);
//>[1, str, false]

(2)双大括号法(匿名内部类法)

List<Integer> list1=new ArrayList(){{
	add(1);add(2);
}};

List list2=new ArrayList(){{
    add(1);add("str");add(false);
}};

(3)Arrays.asList

List<Integer> list=Arrays.asList(1,2,3);

这里有一个问题:
Arrays.asList返回的不是List,也不是ArrayList,而是Arrays.ArrayList。
Arrays重写了ArrayList,里面没有add、insert、remove等方法,返回的是一个定长数组。如果调用add、insert、remove等方法会报错。

List<Integer> list= Arrays.asList(1,2,3);
list.add(5);
//>>Exception in thread "main" java.lang.UnsupportedOperationException
//这个异常来自于Arrays.ArrayList继承的AbstractList

改善的方法如下,用ArrayList再包装一层,这样最后获得的就是ArrayList了

List<Integer> list1=new ArrayList<>(Arrays.asList(1,2,3));
List<String> list2=new ArrayList<>(Arrays.asList("a,b,c".split(",")));

还有一个问题:
List指定的类型只能是引用类型或包装类型,比如List<Integer>、List<String>等,所以当用Arrays.asList给List赋值时不能用基础类型,因为类型不对等。

int[]arr={1,2,3};
List<Integer> list= Arrays.asList(arr);
//会报错,编译不过

Integer[] arr=new Integer[]{(Integer)1,(Integer)2};
List<Integer> list=Arrays.asList(arr);
//这样才对,但很麻烦,仍然是一个不可变长的list

String[] arr=new String[]{"a","b","c"};
List<String> list=Arrays.asList(arr);
//这也是对的,但仍然是一个不可变长的list

当然如果List不指定类型的话,这样编译可以通过,但是出来的结果很吊诡。

int[] arr=new int[]{1,2,3};
List L=Arrays.asList(arr);
System.out.println(L);
//>[[I@71bc1ae4]
System.out.println(L.size());
//>1
System.out.println(L.get(0));
//>[I@71bc1ae4
System.out.println(L.get(0).getClass().toString());
//>class [I

如果用ArrayList再包一层出来的结果也是一样的

int[] arr=new int[]{1,2,3};
List<Integer> L=new ArrayList(Arrays.asList(arr));
System.out.println(L);
//>[[I@71bc1ae4]
System.out.println(L.size());
//>1

所以如果是基本类型要赋值给list的话,只能一个一个逐一添加。

int[] arr={4,5,6};
List<Integer> L=new ArrayList<>();
for(int i:arr){
	L.add(i);
}

如果要赋值给引用类型,就可以用ArrayList再包一层,就是正常的ArrayList了

Integer[] arr1=new Integer[]{(Integer)1,(Integer)2};
String[] arr2 = new String[]{"a", "b", "c"};
List<Integer> list1=new ArrayList<>(Arrays.asList(arr1));
List<String> list2 = new ArrayList<>(Arrays.asList(arr2));
list1.add(3);
System.out.println(list1);
//>[1, 2, 3]
list2.add("d");
System.out.println(list2);
//>[a, b, c, d]

(4)list.addAll
List除了add函数还有addAll函数,可以一次添加整个容器进来

int[] arr=new int[]{1,2,3};
Integer[] arr2=new Integer[]{(Integer)1,(Integer)2};
List<Integer> list1=new ArrayList<>();
list1.addAll(arr);
//>报错,编译不通过
list1.addAll(arr2);
//>报错,编译不通过

List<Integer> list2=new ArrayList(Arrays.asList(1,2,3));
Set<Integer> set1=new HashSet(){{
	add(4);add(5);
}};
list1.addAll(list2);
System.out.println(list1);
//>[1, 2, 3]
list1.addAll(set1);
System.out.println(list1);
//>[1, 2, 3, 4, 5]

(5)Collections.addAll
可以利用Collections工具包添加,但使用很有限

List<Integer> list1=new ArrayList();
List<Integer> list2=new ArrayList(Arrays.asList(1,2,3));
int[] arr=new int[]{1,2,3};
Integer[] arr2=new Integer[]{(Integer)1,(Integer)2};
Collections.addAll(list1,list2);
//>报错,编译不通过
Collections.addAll(list1,arr);
//>报错,编译不通过
Collections.addAll(list1,arr2);
System.out.println(list1);
//>[1, 2]

String[] arr3=new String[]{"a","b","c"};
List<String> list3=new ArrayList<>();
Collections.addAll(list3,arr3);
System.out.println(list3);
//>[a, b, c]

(6)com.google.guava工具类

List<Integer> list1=Lists.newArrayList();
list1.add(1);list1.add(2);

String[] arr2=new String[]{"a","b","c"};
List<String> list2=Lists.newArrayList(arr2);
System.out.println(list2);
//>[a, b, c]
list2.add("d");
System.out.println(list2);
//>[a, b, c, d]
        
int[] arr3=new int[]{1,2,3};
List<Integer> list3 = Lists.newArrayList(arr3);
//>报错,编译不通过
List<Integer> list3 = Ints.asList(arr3);
System.out.println(list3);
//[1, 2, 3]
list3.add(4);//不可变长数组
//>Exception in thread "main" java.lang.UnsupportedOperationException

List<Integer> list3 = Lists.newArrayList(Ints.asList(arr3));
System.out.println(list3);
//[1, 2, 3]
list3.add(4);
System.out.println(list3);
//[1, 2, 3, 4]成功!!!!!

(7)stream—Java8之后

int[] arr=new int[]{1,2,3};
List<Integer> list= IntStream.of(arr).boxed().collect(Collectors.toList());
System.out.println(list);
//[1, 2, 3]
list.add(4);
System.out.println(list);
//[1, 2, 3, 4]成功!!!!!

2.新增

(1)添加到末尾

list.add("a");

(2)添加到指定位置

list.add(1,"a");
list.add(2,list2);

3.删除

(1)删除第一个匹配的元素

list.remove("a");

(2)删除指定位置的元素

list.remove(1);

这里有一个问题:
如果list里面存的本来就是Integer,那remove(1)只会删掉位置为1的元素,不会删掉数字是1的元素,如果想删掉应该这么写:list.remove((Integer)1);

4.访问元素

 list.get(1); //以下标来访问

5.查询元素

 list.indexOf("a"); //没有会返回-1

6.获取大小

 list.size();

7.清空

 list.clear();

8.判断是否为空

 list.isEmpty();

9.打印

(1)逐个遍历然后打印

for(int i=0;i<list.size();i++)
	System.out.println(list.get(i));

(2)直接打印

System.out.println(list);

10.遍历

(1)Iterator迭代器

Integer value=null;
Iterator iter=list.iterator();
while(iter.hasNext()){
	value=(Integer)iter,next();
	System.out.println(value);
 }

(2)for循环

for(int i=0;i<list.size();i++)
	System.out.println(list.get(i));

(3)foreach循环

for(Integer i:list)
	System.out.println(list);

11.排序

Integer[] arr=new Integer[]{(Integer)4,(Integer)2,(Integer)3};
List<Integer> list1=Lists.newArrayList(arr);
Collections.sort(list1);
System.out.println(list1);
//>[2, 3, 4]

12.list、数组、字符串之间的各种转换

  • 数组转list,其实也就是初始化
System.out.println("int[]转List<Integer>");
int[] arr=new int[]{1,2,3};
List<Integer> list = Lists.newArrayList(Ints.asList(arr));
//or
int[] arr=new int[]{1,2,3};
List<Integer> list= IntStream.of(arr).boxed().collect(Collectors.toList());

System.out.println("Integer[]转List<Integer>");
Integer[] arr1=new Integer[]{(Integer)1,(Integer)2,(Integer)3};
List<Integer> list1=new ArrayList<>(Arrays.asList(arr1));
//or
List<Integer> list1=new ArrayList<>();
Collections.addAll(list1,arr1);
//or
List<Integer> list1=Lists.newArrayList(arr1);

System.out.println("String[]转List<String>");
String[] arr2 = new String[]{"a", "b", "c"};
List<String> list2 = new ArrayList<>(Arrays.asList(arr2));
//or
List<String> list2 = new ArrayList<>();
Collections.addAll(list2,arr2);
//or
List<String> list2=Lists.newArrayList(arr2);
  • list转数组
//List<Integer>转[]
System.out.println("List<Integer>转Integer[]");
Integer[] arr1=list1.toArray(new Integer[]{});
System.out.println("List<Integer>转int[]");
int[] arr2=list1.stream().mapToInt(Integer::intValue).toArray(); 
System.out.println("List<Integer>转String[]");
String[] arr3=list1.stream().map(Objects::toString).toArray(String[]::new);

//——————————————————————————————————————————————————————————————————   

//List<String>转[]
System.out.println("List<String>转Integer[]");
Integer[] arr1=list2.stream().mapToInt(Integer::parseInt).boxed().toArray(Integer[]::new);
System.out.println("List<String>转int[]");
int[] arr2=list2.stream().mapToInt(Integer::parseInt).toArray();
System.out.println("List<String>转String[]");
String[] arr3=list2.toArray(new String[]{}); 
  • list转list
System.out.println("List<Integer>转List<String>");
List<String> list2=list1.stream().map(String::valueOf).collect(Collectors.toList());

System.out.println("List<String>转List<Integer>");
List<Integer> list1=list2.stream().mapToInt(Integer::parseInt).boxed().collect(Collectors.toList());
  • 数组转数组
Integer[] arr=new Integer[]{(Integer)1,(Integer)2,(Integer)3};
System.out.println("Integer[]转int[]");
int[] arr1=Arrays.stream(arr).mapToInt(Integer::intValue).toArray();
//or
int[] arr2=ArrayUtils.toPrimitive(arr);
       
System.out.println("Integer[]转String[]");
String[] arr3=Arrays.stream(arr).map(String::valueOf).toArray(String[]::new);

//——————————————————————————————————————————————————————————————————
String[] arr=new String[]{"1","2","3"};
System.out.println("String[]转int[]");
int[] arr1=Stream.of(arr).mapToInt(Integer::parseInt).toArray();
       
System.out.println("String[]转Integer[]");
Integer[] arr2=Stream.of(arr).mapToInt(Integer::parseInt).boxed().toArray(Integer[]::new);
   
//——————————————————————————————————————————————————————————————————
int[] arr=new int[]{1,2,3};
System.out.println("int[]转Integer[]");
Integer[] arr1=IntStream.of(arr).boxed().toArray(Integer[]::new);
//or
Integer[] arr2= ArrayUtils.toObject(arr);

System.out.println("int[]转String[]");
String[] arr3=Arrays.stream(arr).boxed().map(String::valueOf).toArray(String[]::new);
  • list转String
System.out.println("List<Integer>转String");
String str1=list1.toString();
System.out.println(str1);
//>[1, 2, 3]
System.out.println(str1.substring(1,str1.length()-1));
//>1, 2, 3
String str2=list1.stream().map(String::valueOf).collect(Collectors.joining());
System.out.println(str2);
//>123
     
System.out.println("List<String>转String");
System.out.println(list2.toString());
//>[a, b, c]
System.out.println(StringUtils.join(list2,""));
//>abc
  • 数组转String
System.out.println("无论什么数组都一样");
String str1=Arrays.toString(arr);
  • int、Integer、String的转换
int i=1;
System.out.println("int转Integer");
Integer I=(Integer) i;
System.out.println("int转String");
String str=String.valueOf(i);

Integer I=2;
System.out.println("Integer转int");
int i=(int)I;
//or
int i=I.intValue();
System.out.println("Integer转String");
String str=I.toString();

String str="3";
System.out.println("String转int");
int i=Integer.parseInt(str);
System.out.println("String转Integer");
Integer I=Integer.parseInt(str);

13.线程安全

list线程不安全,线程之间互相操作可能会擦除数据。解决方法有三种:
(1)改用vector
(2)继承list并重写方法,加上synchronized关键字。
(3)List<Integer> list=Collections.synchronizedList(new ArrayList());

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值