您的位置:首页 > 职场人生

黑马程序员——集合框架的工具类

2016-07-06 14:31 253 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一.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相等的数组。

将集合变成数组后有什么好处?限定了对集合中的元素进行增删操作,只要获取这些元素即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: