看到array:就要想到数组,查询快,有角标。
看到Link:就要想到链表,增删快,想到add、get、remove方法。
看到hash:就要想到哈希表,唯一性,就要想到元素需要覆盖hashCode和equals方法。
看到tree:就要想到二叉树,想到需要排序,两个接口,Comparable,Comparator。
而且通常这些常用的集合容器都是不同步的。
18-10,工具类-Collections排序
1,java.util.Collections
此类完全由在Collection上进行操作或返回Collection的静态方法组成。
2,Collections是集合框架的工作类,里面的方法都是静态的。
static
根据元素的自然排序,对指定列表进行升序排序,列表中的所有元素都必须实现Comparable接口,列表中的所有元素都必须是相互可以比较的,即类型必须相互匹配才行。
演示排序方法示例:
public static void demo_1() {
List
list = new ArrayList
(); list.add("abcde"); list.add("cba"); list.add("aa"); list.add("zzz"); list.add("cba"); list.add("nbaa"); System.out.println(list); //排序 Collections.sort(list);//String实现了Comparable接口,具备可比性 System.out.println(list); }
若要按照长度排序,可以通过sort(List
public class ComparatorByLength implements Comarator{ public int compare(String o1,String o2) { int temp = o1.length() - o2.length(); return temp == 0 o1.compareTo(o2) : temp; } }
然后调用方法Collections.sort(list,newComparatorByLength());即可。
18-11,折半&最值
1,static
这个方法是使用二进制搜索法来搜索指定列表,以获得指定对象,在进行此调用之前,必须根据列表元素的自然顺序对列表进行升序排序,其实就是二分查找法。
2,static
与上面的方法的不同之处在于,用指定的比较器对集合中的元素进行升序排序。
3,折半:
public class Demo {
public static void main(String[] args) {
List
list = new ArrayList
(); list.add("abcde"); list.add("cba"); list.add("aa"); list.add("zzz"); list.add("cba"); list.add("nbaa"); //排序 Collections.sort(list); int index = Collections.binarySearch(list,"cba");//index是2 } }
4,最大值
static T max(Collection coll)
根据元素的自然顺序,返回给定collection的最大元素,collection中的元素必须具备比较功能,该方法是依据Comparable比较的。
static T max(Collection coll,Comparator comp)
根据指定的比较器产生的顺序,返回给定collection的最大值。
例如:
String max = Collections.max(list,newComparatorByLength())
返回最长的字符串。
18-12,逆序&替换
1,static
返回一个比较器,它强行反转实现Comparable接口那些对象collection上的自然顺序,他是根据Comparable比较的。
TreeSet
这个方法强行反转比较器指定排序后的反转。
2,替换
public class Demo {
public static void main(String[] args) {
List
list = new ArrayList
(); list.add("abcde"); list.add("cba"); list.add("aa"); //将list集合中的"cba"替换成"nba" //原理:list.set(indexOf("cba"),"nba") Collections.replaceAll(list,"cba","nba"); } }
18-13,其他方法,将非同步集合转成同步集合的方法
1,fill方法,可将集合中的所有的值都重新赋值(重新初始化)
public class Demo {
public static void main(String[] args) {
List
list = new ArrayList
(); list.add("abcde"); list.add("cba"); list.add("aa"); Collections.fill(list, "cc"); System.out.println(list);//[cc,cc,cc] 将所有元素初始化为cc } }
2,Collections.shuffle(list);//将集合中的元素随机重新排列
3,static
返回一个数组列表,它按返回顺序包含指定枚举返回的元素,将枚举转换成ArrayList。
4,static
将指定集合转成枚举。
5,static
返回指定列表支持的(线程安全的)列表。
除此之外可以将Collection、Map、Set,等转成线程安全的。
实现原理:
List list = new ArrayList();//是非同步的
list = MyCollections.synList(list);//返回一个同步的list
给非同步的集合加锁:
//保证在添加时不能删除,删除时不能添加
class MyCollections {
public static List synList(List list) {