19、集合框架_Collections工具类
一、Collections工具类
Collections和Collection不同,前者是集合的操作类,后者是集合接口
Collections提供的静态方法
addAll():批量添加
sort():排序
binarySearch():二分查找
fill():替换
shuffle():随机排序
reverse():逆序
1、addall()
public class CollectionsDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("af"); list.add("bg"); list.add("acssf"); list.add("bdfsdfsd"); Collections.addAll(list,"cefsdf","cf1","cg32"); System.out.println(list); }
打印结果为:
/* [af, bg, acssf, bdfsdfsd, cefsdf, cf1, cg32] Process finished with exit code 0 */
2、sort()
public class CollectionsDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("af"); list.add("bg"); list.add("acssf"); list.add("bdfsdfsd"); Collections.addAll(list,"cefsdf","cf1","cg32"); System.out.println(list); list.sort(new Comparator<String>() { @Override public int compare(String o1, String o2) { if(o1.length()>o2.length()){ return 1; }else if(o1.length()<o2.length()){ return -1; }else{ return 0; } } }); System.out.println(list); } }
打印结果为:
/* [af, bg, acssf, bdfsdfsd, cefsdf, cf1, cg32] [af, bg, cf1, cg32, acssf, cefsdf, bdfsdfsd] Process finished with exit code 0 */
还可以
public class CollectionsDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("af"); list.add("bg"); list.add("acssf"); list.add("bdfsdfsd"); Collections.addAll(list,"cefsdf","cf1","cg32"); System.out.println(list); list.sort(new Comparator<String>() { @Override public int compare(String o1, String o2) { if(o1.length()>o2.length()){ return 1; }else if(o1.length()<o2.length()){ return -1; }else{ return 0; } } }); System.out.println(list); Collections.sort(list); System.out.println(list); Collections.sort(list,new Comparator<String>() { @Override public int compare(String o1, String o2) { if(o1.length()>o2.length()){ return 1; }else if(o1.length()<o2.length()){ return -1; }else{ return 0; } } }); System.out.println(list); } }
打印结果为:
/* [af, bg, acssf, bdfsdfsd, cefsdf, cf1, cg32] [af, bg, cf1, cg32, acssf, cefsdf, bdfsdfsd] [acssf, af, bdfsdfsd, bg, cefsdf, cf1, cg32] [af, bg, cf1, cg32, acssf, cefsdf, bdfsdfsd] Process finished with exit code 0 */
3、binarySearch()二分查找
public class CollectionsDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("af"); list.add("bg"); list.add("acssf"); list.add("bdfsdfsd"); Collections.addAll(list,"cefsdf","cf1","cg32"); System.out.println(list); //二分查找的时候需要先进行排序操作,如果没有排序的话,是找不到指定元素的 Collections.sort(list); System.out.println(Collections.binarySearch(list,"acssf")); } }
打印结果为:
/* [af, bg, acssf, bdfsdfsd, cefsdf, cf1, cg32] 0 Process finished with exit code 0 */
4、fill()填充对应元素
public class CollectionsDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("af"); list.add("bg"); list.add("acssf"); list.add("bdfsdfsd"); Collections.addAll(list,"cefsdf","cf1","cg32"); System.out.println(list); Collections.fill(list,"mashibing"); System.out.println(list); } }
打印结果为:
/* [af, bg, acssf, bdfsdfsd, cefsdf, cf1, cg32] [mashibing, mashibing, mashibing, mashibing, mashibing, mashibing, mashibing] Process finished with exit code 0 */
Arrays工具类
/** * Arrays提供了数据操作的工具类,包含很多方法 * 集合和数组之间的转换 * 数组转成list: * * */
public class ArraysDemo { public static void main(String[] args) { // int[] array = new int[]{1,2,3,4,5}; List<Integer> ints = Arrays.asList(1,2,3,4,5); //list转换成数组 Object[] objects = ints.toArray(); } }
二、面试题
1、集合不数组的比较
▪ 集合和数组的比较
– 数组不是面向对象的,存在明显的缺陷,集合弥补了数组的一
些缺点,比数组更灵活更实用,可大大提高软件的开发效率,
而且不同的集合框架类可适用不同场合。具体如下:
– 1:数组能存放基本数据类型和对象,而集合类中只能存放对象。
– 2:数组容易固定无法动态改变,集合类容量动态改变。
– 3:数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的
size()可以确切知道元素的个数
– 4:集合有多种实现方式和不同适用场合,不像数组仅采用顺序表方式
– 5:集合以类的形式存在,具有封装、继承、多态等类的特性,
通过简单的方法和属性即可实现各种复杂操作,大大提高了软件的开发效率
2、Collection和Collections的区别
– Collection是Java提供的集合接口,存储一组丌唯 一,无序的
对象。它有两个子接口List和Set。
– Java还有一个Collections类,与门用来操作集合类,它提供了
一系列的静态方法实现对各种集合的搜索、排序、线程安全化
等操作
3、ArrayList和LinkedList的联系和区别
– ArrayList实现了长度可变的数组,在内存中分配连续空间。遍
历元素和随机访问元素效率比较高。
– LinkedList采用链表存储方式。插入、删除元素效率比较高
4、Vector和ArrayList的联系和区别
– 实现原理相同,功能相同,都是长度可变的数组结构,很多时
候可以互用
– 两者的主要区别如下
▪ Vector是早期的JDK接口,ArrayList是替代Vector的新接口
▪ Vector线程安全,ArrayList重速度轻安全,线程非安全
▪ 长度需要增长时,Vector默认增长一倍,ArrayList增长50%(1.5+1)
5、HashMap和Hashtable的联系和区别
– 实现原理相同,功能相同,底层都是哈希表结构,查询速度快,
在很多情况下可以互用
– 两者的主要区别如下
▪ Hashtable是早期的JDK提供的接口,HashMap是新版的
JDK提供的接口
▪ Hashtable继承Dictionary类,HashMap实现Map接口
▪ Hashtable是线程安全,HashMap线程非安全
▪ Hashtable不允许null值,HashMap允许null值