List是Collection常用的子接口,是一个可重复集合并且有序,其单独提供了一套可以通过下标操作元素的方法。
1.添加元素
add()方法用于向list集合中添加元素
List<String> list = new ArrayList<>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("five");
System.out.println(list);//[one, two, three, four, five]
2.获取指定下标的元素
get(int index);用于获取下标为index的元素
String str = list.get(3);
System.out.println(str);//four
3.设置指定位置元素为新的值
set(int index,E e);用于更改下标为index为新的e,这个方法返回的是原来下标为index的元素值
String old = list.set(0, "1");
System.out.println(list);//[1, two, three, four, five]
System.out.println(old);//one
4.在指定位置添加新的元素
add(int index,E e);在第index个位置添加新的值e,原来这个位置及其后面的元素都向后移一位。
//list集合为:[one, two, three, four, five]
list.add(1,"2");
System.out.println(list);
//[one, 2,two, three, four, five]
5.删除指定位置的元素
remove(int index);删除第index数,返回的是被删除的那个数。每次只能删除一个数
String str = list.remove(1);
System.out.println(list);//[one, two, three, four, five]
System.out.println(str);//2
6.集合转字符串
集合的toArray()方法,可以将集合转成字符串,以前的版本中返回的是一个Object[ ]类型数组,这样的话原本集合的泛型就得不到传承。
现在可以返回一个和集合泛型一样的数组。但是要传入一个参数
toArray(new Object[int length])
//传入的数组长度可以小于等于原来集合的长度,也可以大于集合的长度。
Collection<String> c = new ArrayList<>();
c.add("one");
c.add("two");
c.add("three");
c.add("four");
//Object[] o = c.toArray();//用Objcet接收,这样泛型就没有得到传承
String[] str = c.toArray(new String[10]);
//new的新字符串的长度可以是原数组长度,可以更长,更短的时候默认是数组原长
System.out.println(str.length);//10
System.out.println(Arrays.toString(str));
7.数组转集合
借助数组工具类Arrays,有一个asList()方法
String[] array = {"one","two","three","four"};
List<String> list = Arrays.asList(array);
System.out.println(list.size());//4
System.out.println(list);
但是转成的集合list不能做增删操作,主要是因为是由数组转过来的,数组是定长的。
list.add("five");
list.remove(2);
/*
* 数组不支持这个操作,会报UnsupportedOperationException异常
* 因为数组是定长的 ,不支持随意增删元素,但是修改元素值可以
*/
此时修改集合或数组中元素的值,原数组或集合的值也会被改变。
list.set(1, "2");
System.out.println(list);//[one, 2, three, four]
System.out.println(Arrays.toString(array));
//[one, 2, three, four]
array[0]="1";
System.out.println(Arrays.toString(array));//[1, 2, three, four]
System.out.println(list);//[1, 2, three, four]
8.获取集合的子集
subList(int a,int b);获取下标a-b的子集,返回值也是集合,包含a不包含b
List<Integer> list = new ArrayList<>();
for(int i=0;i<10;i++){
list.add(i);
}
System.out.println(list);//[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
List<Integer> subList = list.subList(3, 8);//[3, 4, 5, 6, 7]
现在对这个子集合操作,也会改变原集合中的值
System.out.println(subList);
for(int i=0;i<subList.size();i++){
Integer s = subList.get(i);
subList.set(i, s*10);
}
System.out.println(subList);//[30, 40, 50, 60, 70]
System.out.println(list);//[0, 1, 2, 30, 40, 50, 60, 70, 8, 9]
// 删除list集合中的2-8
list.subList(2, 9).clear();
System.out.println(list);//[0,1,9]
9.集合排序
集合的工具类:java.util.Collections
- Collection是所有集合的接口
- Collections是集合的工具类
- 其提供了很多便于操作集合的方法,其中有一个sort方法,用来对List集合进行自然排序(从小到大)
List<Integer> list = new ArrayList<>();
Random ran = new Random();
//给数组赋1-100的随机数
for(int i=0;i<10;i++){
Integer index = ran.nextInt(100);
list.add(index);
}
System.out.println(list);
//从小到大
Collections.sort(list);
System.out.println(list);
//乱序
Collections.shuffle(list);
System.out.println(list);
一般可以排序的集合泛型都实现了Comparator接口,对于没有实现Comparator接口的自定义类,我们可以重写排序规则进行排序,例如:
//Point类是自定义的一个类,表现形式为数轴上的两个点
List<Point> list = new ArrayList<>();
list.add(new Point(1,2));
list.add(new Point(3,4));
list.add(new Point(5,6));
list.add(new Point(1,6));
list.add(new Point(3,2));
Collections.sort(list,new Comparator<Point>(){
public int compare(Point o1, Point o2) {
//排序规则为,点到原点的距离,从小到大排
int len1 = o1.getX()*o1.getX()+o1.getY()*o1.getY();
int len2 = o2.getX()*o2.getX()+o2.getY()*o2.getY();
return len1-len2;
}
});
- Collections提供了一个重载的sort方法:
- void static sort(List list,Comparator c)
该方法要求我们再传入一个参数,是一个比较器。此方法会利用这个比较器来比较集合元素并按照比较结果从小到大排序。
也可以利用这个方法对原来的排序规则进行修改喔。