一、数组与集合之间的相互转换
(1)数组转换为集合
通过工具类Arrays的静态方法asList可以将一个数组转换为List集合
String[] array=new String[]{"one","two","three"};
//数组转换为集合,但是对象还是同一个队形
List<String> list=Arrays.asList(array);
list.set(0,"1");//将下标为0的元素该为1
//对集合元素的操作就是对原数组的操作
System.out.println("源数组"+Arrays.toString(array));
不能直接添加或者删除元素,会导致数组扩容或者缩容,这样是不被支持(list.add(“five”)或者list.remove(“three”);如果需要添加时,可以选择复制集合的方式来添加。
List<String> list2 = new ArrayList<String>(list);
list2.add("five");
System.out.println("list2集合:"+list2);
(2)集合转换为数组
Collection 提供了一个方法,toArray,可以将当前集合转换为数组
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("five");
//把集合转化为数组
String[] s=new String[0];
String[] str=list.toArray(s);
for(String st:str){
System.out.println(st);
}
}
二、集合排序
排序集合可以使用集合的工具类
java.untl.Collections
其定义很多静态方法,用于操作集合,其中sort()方法是对list集合进行自然排序(升序)
1)对list集合进行升序排列
List<Integer> list=new List<Integer>();
for(int i=0;i<10;i++){
list.add((int)(Math.Random()*100));
}
System.out.println(list);
//对集合进行升序排列
Collections.sort(list);
System.out.println(list);
}
2)使用比较器进行自定义比较
推荐的排序方式
当遇到排序自定义类型元素,或者集合元素自身的比较规则不满足排序时,都建议使用下面的方式排序。自定义排序方式。
该sort方法要求额外传入一个比较器规则比较集合元素并进行排序,因此排序方法不要求集合实现Comparable接口。
List<Point2> list = new ArrayList<Point2>;
list.add(new Point2(2,8));
list.add(new Point2(4,8));
list.add(new Point2(5,5));
list.add(new Point2(7,8));
list.add(new Point2(3,1));
list.add(new Point2(9,4));
System.out.println("原集合"+list);
Collection.sort(list,Comparator<String>(){
public int compare(Point2 o1,Point2 o2){
int len=o1.getX()*o1.getX()+o1.getY()*o1.getY();
int olen=o2.getX()*o2.getX()+o2.getY()*o2.getY();
return olen-len;
}
});
System.out.println(list);
三、遍历集合
java.util.List线性表
List的特点:可重复并且有序,可以通过下标操作元素。
常用实现类:
ArrayList:内部由数组实现,查询快,增删慢;
LinkedList:内部有链表实现,查询蛮,增删快;
对于不是极端苛刻的情况下,通常使用ArrayList,含头不含尾。
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("one");
list.add("two");
list.add("three");
System.out.println(list);
//获取指定位置对应的元素
//E get(int index);
String str = list.get(2);
System.out.println(str);
//使用传统的for循环遍历list集合
for(int i=0;i<list.size();i++){
String s=list.get(i);
System.out.println(s);//获取集合中每一个元素的下标返回下标所对应的元素
}
//使用增强for循环遍历list集合
for(String ss:list){
System.out.println(ss);
}
//用迭代器遍历list集合
Iterator<String> it=list.iterator();
while(it.hasNext()){
String s=it.next();
}
//替换元素
//E set(int index,E e)
//将指定元素设置到指定位置上,返回原来指定位置上的元素
String ss=list.set(1, "2");
System.out.println(ss);
//删除元素操作
//E remove(int index)
String old=list.remove(1);
System.out.println(old);
}
四、list集合中套用list集合
public static void main(String[] args) {
//热门推荐
List<String> list1=new ArrayList<String>();
list1.add("iphone");
list1.add("honor");
list1.add("vivo");
List<String> list2=new ArrayList<String>();
list2.add("5G手机");
list2.add("华为");
list2.add("小米");
List<String> list3=new ArrayList<String>();
list3.add("营业厅");
list3.add("宽带");
List<List<String>> itemize = new ArrayList<List<String>>();
itemize.add(list1);
itemize.add(list2);
itemize.add(list3);
for(List<String> li:itemize){
for(String l:li){
System.out.println(l);
}
}
}
五、截取指定范围的子集
List subList(int fromIndex,int toIndex);
含头不含尾
//随机生成10个整数并存储到list集合中
//参与集合中的泛型类型必须是包装类型,因此在这里参与集合的int类型必须是它的包装类型Integer类型
public static void main(String[] args) {
List<Integer> list=new ArrayList<Integer>();
Random random=new Random();
for(int i=0;i<10;i++){
int num=random.nextInt(101);
list.add(num);
}
System.out.println(list);
//截取集合中的下标为3到8的元素
List<Integer> sublist=list.subList(3, 8);
System.out.println("截取后的集合子串为:"+sublist);
//截取元素的同时并将元素扩大10倍
List<Integer> sublist2=list.subList(2, 7);
for(int i=0;i<sublist2.size();i++){
int s=sublist2.set(i, sublist.get(i)*10);
}
System.out.println(sublist2);
//对子集元素操作,就是对原集合对应元素的操作
//删除list元素第3个到第7个
list.subList(3, 8).clear();
}
六、线程安全的集合:
常用的集合实现类:ArrayList,LinkedList,HashSet他们都不是线程安全的,多线程情况下使用会出现并发问题。
Collections提供了将集合转换为线程安全的方法。
List<String> list=new ArrayList<String>
list.add("one");
list.add("two");
list.add("three");
list.add("four");
//将线程转换为线程安全的
list=Collections.synchronizedList(list);
Set<String> set=new HashSet<String>();
set=Collections.synchronizedList(set);