Demo1:常用方法
//自定义比较器,按长度排序,短的在前面
class StrLenComparator implements Comparator<String> {
public int compare(String s1,String s2) {
if(s1.length()>s2.length())
return 1;
if(s1.length()<s2.length())
return -1;
return s1.compareTo(s2);
}
}
public class CollectionsDemo {
public static void main(String[] args) {
sortDemo(); //sort排序
binarySearchDemo(); //binarySearch二分查找
fillAndReplaceAllDemo(); //fill全部替换,replaceAll,替换某个元素
shuffleDemo(); //shuffle打乱排序
reverseOrderDemo(); //reverseOrder按原来的顺序倒序排序
}
public static void sortDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
//原来的顺序
System.out.println(list); //[abcd, aaa, zz, kkkkk, qq, z]
//自然顺序排序
Collections.sort(list);
System.out.println(list); //[aaa, abcd, kkkkk, qq, z, zz]
//根据自定义的比较器排序,按长度排序
Collections.sort(list, new StrLenComparator());
System.out.println(list); //[z, qq, zz, aaa, abcd, kkkkk]
}
public static void binarySearchDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
Collections.sort(list);
System.out.println(list); //[aaa, abcd, kkkkk, qq, z, zz]
//binarySearch如果有返回该对象的索引
int index = Collections.binarySearch(list, "abcd");
System.out.println(index); //1
//binarySearch如果找不到,返回要查找对象在原集合中插入位置的索引的负数再减1
//aaac在原集合中应该在1位置插入,返回-1再减1,也就是-2
int index2 = Collections.binarySearch(list, "aaac");
System.out.println(index2); //-2
//binarySearch也可以按我们自定义顺序排好后再查找
Collections.sort(list, new StrLenComparator());
System.out.println(list); //[z, qq, zz, aaa, abcd, kkkkk]
int index3 = Collections.binarySearch(list, "abcd",new StrLenComparator());
System.out.println(index3); //4
}
public static void fillAndReplaceAllDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("aaa");
list.add("kkkkk");
list.add("qq");
list.add("z");
//replaceAll,将指定元素替换
System.out.println(list); //[abcd, aaa, zz, aaa, kkkkk, qq, z]
Collections.replaceAll(list, "aaa", "pp");
System.out.println(list); //[abcd, pp, zz, pp, kkkkk, qq, z]
//fill,整个集合都替换
Collections.fill(list, "xx");
System.out.println(list); //[xx, xx, xx, xx, xx, xx, xx]
}
public static void shuffleDemo() {
List<String> list = new ArrayList<String>();
list.add("abcd");
list.add("aaa");
list.add("zz");
list.add("kkkkk");
list.add("qq");
list.add("z");
//shuffle将集合顺序打乱,随机排列,每次运行结果会不一样
System.out.println(list); //[abcd, aaa, zz, kkkkk, qq, z]
Collections.shuffle(list);
System.out.println(list); //[kkkkk, qq, aaa, zz, z, abcd]
}
public static void reverseOrderDemo() {
TreeSet<String> ts = new TreeSet<String>();
ts.add("abcde");
ts.add("aaa");
ts.add("k");
ts.add("cc");
Iterator it = ts.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
/*原来按自然顺序排列
aaa
abcde
cc
k
*/
TreeSet<String> ts2 = new TreeSet<String>(Collections.reverseOrder());
ts2.add("abcde");
ts2.add("aaa");
ts2.add("k");
ts2.add("cc");
Iterator it2 = ts2.iterator();
while(it2.hasNext()) {
System.out.println(it2.next());
}
/*Collections.reverseOrder()按自然顺序倒着排列
k
cc
abcde
aaa
*/
TreeSet<String> ts3 = new TreeSet<String>(Collections.reverseOrder(new StrLenComparator()));
ts3.add("abcde");
ts3.add("aaa");
ts3.add("k");
ts3.add("cc");
Iterator it3 = ts3.iterator();
while(it3.hasNext()) {
System.out.println(it3.next());
}
/*Collections.reverseOrder(new StrLenComparator())
* 按自定义比较器倒序排(原来是从短到长)
abcde
aaa
cc
k
*/
}
}
public class ArrayToList {
public static void main(String[] args) {
String[] arr = {"abc", "cc", "kkkk"};
List<String> list = Arrays.asList(arr);
System.out.println(list); //[abc, cc, kkkk]
/*
* 把数组变成list集合有什么好处?
* 可以使用集合的思想和方法来操作数组中的元素。
* 比如要查找数组中是否存在某个元素,就可以用集合的方法
*/
System.out.println("contains:" + list.contains("cc")); //contains:true
/*
* 注意:将数组变成集合,不可以使用集合的增删方法。
* 否则会抛出UnsupportedOperationException异常
*/
// list.add("qq"); //抛出异常
/*
* 如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。
* 如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
*/
int[] nums = {2, 4, 5};
List<int[]> li = Arrays.asList(nums);
System.out.println(li); //[[I@2f0f94a0]
Integer[] nums2 = {2,4,5};
List<Integer> li2 = Arrays.asList(nums2);
System.out.println(li2); //[2, 4, 5]
}
}
Demo3:集合转换成数组
public class CollectionToArray {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
/*
1,指定类型的数组到底要定义多长呢?
当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。
当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。
所以创建一个刚刚好的数组最优。
2,为什么要将集合变数组?
为了限定对元素的操作。不需要进行增删了。
*/
String[] arr = al.toArray(new String[0]);
System.out.println(Arrays.toString(arr)); //[abc1, abc2, abc3]
String[] arr1 = al.toArray(new String[al.size()]);
System.out.println(Arrays.toString(arr1)); //[abc1, abc2, abc3]
String[] arr2 = al.toArray(new String[5]);
System.out.println(Arrays.toString(arr2)); //[abc1, abc2, abc3, null, null]
}
}