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());

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章