黑马程序员——集合框架的工具类
2016-07-06 14:31
253 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
一.Collections:集合框架的工具类。里面定义的都是静态方法。
1.Collections.sort(list);//list集合进行元素的自然顺序排序。
结果为:
2.Collections.sort(list,new ComparatorByLen());//按指定的比较器方法排序。
结果:
3.Collections.max(list); //返回list中字典顺序最大的元素。
结果:
注意:如果先对集合进行长度的排序,再使用Collections.max(list)方法是不能获得最大长度的字符串。只有使用Collections.max(list,new CompareByLen())才可以。
4.int index = Collections.binarySearch(list,”zz”);//二分查找,返回角标。
结果为:
注意:当所找的元素不存在时,会返回元素所插入的位置的负数减1。即-1-position,-1表示不存在。
如果元素本身不具有比较性或者按照指定性质比较,可以自定义比较器。本身具有比较性的是实现了Comparable接口使用的是CompareTo()方法,自定义的比较器是实现了Comparator接口,比较使用Compare()方法。
5.Collections.reverseOrder();//逆向反转排序。
结果为:
注意:Collections.reverse(List) 反转指定列表中元素的顺序。
Collections.reverseOrder()反转默认比较器所操作元素的顺序。
Collections.reverseOrder(Comparator)反转指定比较器所操作元素的顺序。
6.Collections.shuffle(list);//随机对list中的元素进行位置的置换。
7.将非同步集合转成同步集合的方法:Collections中的 XXX synchronizedXXX(XXX);
List synchronizedList(list);
Map synchronizedMap(map);
原理:定义一个类,将集合所有的方法加同一把锁后返回。
8.Collections和Collection有什么区别?
Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。
它有两个常用的子接口,
List:对元素都有定义索引。有序的。可以重复元素。
Set:不可以重复元素。无序。
Collections是集合框架中的一个工具类。该类中的方法都是静态的
提供的方法中有可以对list集合进行排序,二分查找等方法。
通常常用的集合都是线程不安全的。因为要提高效率。
如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。
二.Arrays:用于操作数组对象的工具类,里面都是静态方法。
将数组转换成集合,有什么好处呢?用aslist方法,将数组变成集合;
可以通过list集合中的方法来操作数组中的元素:isEmpty()、contains、indexOf、set;
注意(局限性):数组是固定长度,不可以使用集合对象增加或者删除等,会改变数组长度的功能方法。比如add、remove、clear。(会报不支持操作异常UnsupportedOperationException);
如果数组中存储的引用数据类型,直接作为集合的元素可以直接用集合方法操作。
如果数组中存储的是基本数据类型,asList会将数组实体作为集合元素存在。
集合变数组:用的是Collection接口中的方法:toArray();
如果给toArray传递的指定类型的数据长度小于了集合的size,那么toArray方法,会自定再创建一个该类型的数据,长度为集合的size。
如果传递的指定的类型的数组的长度大于了集合的size,那么toArray方法,就不会创建新数组,直接使用该数组即可,并将集合中的元素存储到数组中,其他为存储元素的位置默认值null。
所以,在传递指定类型数组时,最好的方式就是指定的长度和size相等的数组。
将集合变成数组后有什么好处?限定了对集合中的元素进行增删操作,只要获取这些元素即可。
一.Collections:集合框架的工具类。里面定义的都是静态方法。
1.Collections.sort(list);//list集合进行元素的自然顺序排序。
package review; import java.util.*; public class CollectionsDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("aaa"); list.add("kk"); list.add("abcd"); list.add("z"); list.add("qq"); list.add("zz"); System.out.println(list); Collections.sort(list); System.out.println(list); } }
结果为:
[aaa, kk, abcd, z, qq, zz] [aaa, abcd, kk, qq, z, zz]
2.Collections.sort(list,new ComparatorByLen());//按指定的比较器方法排序。
package review; import java.util.*; class CompareByLen implements Comparator<String> { public int compare(String s1,String s2) { return new Integer(s1.length()).compareTo(new Integer(s2.length())); } } public class CollectionsDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("aaa"); list.add("kk"); list.add("abcd"); list.add("z"); list.add("qq"); list.add("zz"); System.out.println(list); Collections.sort(list,new CompareByLen()); System.out.println(list); } }
结果:
[aaa, kk, abcd, z, qq, zz] [z, kk, qq, zz, aaa, abcd]
3.Collections.max(list); //返回list中字典顺序最大的元素。
package review; import java.util.*; class CompareByLen implements Comparator<String> { public int compare(String s1,String s2) { return new Integer(s1.length()).compareTo(new Integer(s2.length())); } } public class CollectionsDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("aaa"); list.add("kk"); list.add("abcd"); list.add("z"); list.add("qq"); list.add("zz"); System.out.println(list); System.out.println(Collections.max(list)); System.out.println(Collections.max(list,new CompareByLen())); } }
结果:
[aaa, kk, abcd, z, qq, zz] zz abcd
注意:如果先对集合进行长度的排序,再使用Collections.max(list)方法是不能获得最大长度的字符串。只有使用Collections.max(list,new CompareByLen())才可以。
4.int index = Collections.binarySearch(list,”zz”);//二分查找,返回角标。
package review; import java.util.*; public class CollectionsDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("aaa"); list.add("kk"); list.add("abcd"); list.add("z"); list.add("qq"); list.add("zz"); Collections.sort(list); System.out.println(list); //int index = Collections.binarySearch(list,"z"); int index = halfSearch(list,"aaaa"); System.out.println(index); } //如果元素没有比较性,自定义比较器 public static int halfSearch_1(List<String> list,String s,Comparator<String> cmp) { int max,min,mid; max=list.size()-1; min=0; while(min<=max) { mid=(min+max)>>1; String str = list.get(mid); int num = cmp.compare(str, s); if(num>0) b970 max=mid-1; else if(num<0) min=mid+1; else return mid; } return -1-min; } //二分查找的原理 public static int halfSearch(List<String> list,String s) { int max,min,mid; max=list.size()-1; min=0; while(min<=max) { mid=(min+max)>>1; String str = list.get(mid); int num = str.compareTo(s); if(num>0) max=mid-1; else if(num<0) min=mid+1; else return mid; } return -1-min; } }
结果为:
[aaa, abcd, kk, qq, z, zz] -2
注意:当所找的元素不存在时,会返回元素所插入的位置的负数减1。即-1-position,-1表示不存在。
如果元素本身不具有比较性或者按照指定性质比较,可以自定义比较器。本身具有比较性的是实现了Comparable接口使用的是CompareTo()方法,自定义的比较器是实现了Comparator接口,比较使用Compare()方法。
5.Collections.reverseOrder();//逆向反转排序。
package day17; import java.util.*; class StrComparator implements Comparator<String> { public int compare(String s1,String s2) { int num = s1.compareTo(s2); if(num > 0) return -1; if(num < 0) return 1; return num; //return s2.compareTo(s1); } } public class CollectionsDemo3 { public static void main(String[] args) { // TODO 自动生成的方法存根 orderDemo(); } public static void orderDemo() { TreeSet<String> ts = new TreeSet<String>(Collections.reverseOrder(new StrLenComparator())); ts.add("abcde"); ts.add("aaa"); ts.add("kk"); ts.add("c"); Iterator<String> it = ts.iterator(); while(it.hasNext()) { System.out.println(it.next()); } } }
结果为:
abcde aaa kk c
注意:Collections.reverse(List) 反转指定列表中元素的顺序。
Collections.reverseOrder()反转默认比较器所操作元素的顺序。
Collections.reverseOrder(Comparator)反转指定比较器所操作元素的顺序。
6.Collections.shuffle(list);//随机对list中的元素进行位置的置换。
7.将非同步集合转成同步集合的方法:Collections中的 XXX synchronizedXXX(XXX);
List synchronizedList(list);
Map synchronizedMap(map);
原理:定义一个类,将集合所有的方法加同一把锁后返回。
8.Collections和Collection有什么区别?
Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。
它有两个常用的子接口,
List:对元素都有定义索引。有序的。可以重复元素。
Set:不可以重复元素。无序。
Collections是集合框架中的一个工具类。该类中的方法都是静态的
提供的方法中有可以对list集合进行排序,二分查找等方法。
通常常用的集合都是线程不安全的。因为要提高效率。
如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。
二.Arrays:用于操作数组对象的工具类,里面都是静态方法。
asList方法:将数组转换成list集合。 String[] arr = {"abc","kk","qq"}; List<String> list = Arrays.asList(arr);//将arr数组转成list集合。
将数组转换成集合,有什么好处呢?用aslist方法,将数组变成集合;
可以通过list集合中的方法来操作数组中的元素:isEmpty()、contains、indexOf、set;
注意(局限性):数组是固定长度,不可以使用集合对象增加或者删除等,会改变数组长度的功能方法。比如add、remove、clear。(会报不支持操作异常UnsupportedOperationException);
如果数组中存储的引用数据类型,直接作为集合的元素可以直接用集合方法操作。
如果数组中存储的是基本数据类型,asList会将数组实体作为集合元素存在。
集合变数组:用的是Collection接口中的方法:toArray();
如果给toArray传递的指定类型的数据长度小于了集合的size,那么toArray方法,会自定再创建一个该类型的数据,长度为集合的size。
如果传递的指定的类型的数组的长度大于了集合的size,那么toArray方法,就不会创建新数组,直接使用该数组即可,并将集合中的元素存储到数组中,其他为存储元素的位置默认值null。
所以,在传递指定类型数组时,最好的方式就是指定的长度和size相等的数组。
将集合变成数组后有什么好处?限定了对集合中的元素进行增删操作,只要获取这些元素即可。
相关文章推荐
- [转]为什么程序员总是写糟糕的代码?这3个原因
- 苦闷的程序员
- .NET面试题系列
- 面试题18:树的子结构
- 两个栈实现队列&&两个队列实现栈
- 面试必备:常用的设计模式总结
- 数据库面试常问概念
- 安卓面试题
- [伪]观察者设计模式(适用于像我这样看不太懂真正的观察者设计模式又想用观察者设计模式的小程序员)
- 安卓面试题
- 20.01.程序员实习过程中应该掌握的问问题技巧
- 常见面试题之一
- 10个帮程序员减压放松的网站
- 程序员培训 如何构建个人品牌
- 如何用O(1)的时间复杂度求栈中最小元素
- 剑指Offer:面试题13——在O(1)时间删除链表结点
- .NET面试题系列[2] - .NET框架基础知识(2)
- 给独立程序员の建议
- 剑指Offer:面试题12——打印1到最大的n位数(java实现)
- 面试题17:合并两个排序的链表