黑马程序员_Collections类的使用之学习笔记
------- android培训、java培训、期待与您交流! ----------
Collections
作用:专门用来对集合进行操作的类,如对list集合排序sort();
sort(List<T> list)
根据元素的自然顺序 对指定列表按升序进行排序。
sort(List<T> list,Comparator<? super T> c)
根据指定比较器产生的顺序对指定列表进行排序。
例子
publicclassCollectionsDemo {
/**
* @paramargs
*/
publicstaticvoidmain(String[] args) {
ArrayList<String> al = newArrayList<String>();
al.add("4");
al.add("111");
al.add("1");
al.add("3");
Collections.sort(al);
System.out.println(al);
Collections.sort(al,newMycom2());
System.out.println(al);
}
}
classMycom2implements Comparator<String>
{
publicintcompare(String o1, String o2) {
int num= o1.length()-o2.length();
if(num==0)
{
returno1.compareTo(o2);
}
return num;
}
}
输出为:
[1, 111, 3, 4]
[1, 3, 4, 111]
介绍其中几个比较重要的方法
public static<T> Comparator<T> reverseOrder()
返回一个比较器,它强行逆转实现了Comparable 接口的对象 collection 的自然顺序。
如下:
TreeSet<String>ts = newTreeSet<String>();
ts.add("2");
ts.add("1");
ts.add("4");
ts.add("8");
System.out.println(ts);
输出1,2,3,8
TreeSet<String>ts = newTreeSet<String>(Collections.reverseOrder());
ts.add("2");
ts.add("1");
ts.add("4");
ts.add("8");
System.out.println(ts);
则输出 8,3,2,1
public static<T> Comparator<T> reverseOrder(Comparator<T> cmp)
返回一个比较器,它强行逆转指定比较器的顺序。
例如:
publicclassCollectionnn {
/**
* @paramargs
*/
publicstaticvoidmain(String[] args)
{
TreeSet<String> ts = newTreeSet<String>(new Mycom());
ts.add("2");
ts.add("11");
ts.add("422");
ts.add("8888");
System.out.println(ts);
//得到 [2, 11, 422, 8888]
TreeSet<String> ts = newTreeSet<String>(Collections. reverseOrder(new Mycom()));
ts.add("2");
ts.add("11");
ts.add("422");
ts.add("8888");
System.out.println(ts);
//得到 [ 8888,422,11,2]
}
}
classMycomimplements Comparator<String>
{
publicintcompare(String o1, String o2) {
// TODOAuto-generated method stub
returno1.length()-o2.length();
}
}
下面来讨论集合中线程的不安全问题。
就使用这些方法:
static
<T> List<T>
synchronizedList(List<T> list)
返回指定列表支持的同步(线程安全的)列表。
static
<K,V> Map<K,V>
synchronizedMap(Map<K,V> m)
返回由指定映射支持的同步(线程安全的)映射。
static
<T> Set<T>
synchronizedSet(Set<T> s)
返回指定 set 支持的同步(线程安全的)set。
static
<K,V> SortedMap<K,V>
synchronizedSortedMap(SortedMap<K,V> m)
返回指定有序映射支持的同步(线程安全的)有序映射。
static
<T> SortedSet<T>
synchronizedSortedSet(SortedSet<T> s)
返回指定有序 set 支持的同步(线程安全的)有序 set。
Arrays
用于操作数组的工具类
1. 对基本数据类型的折半查找的方法。
例如
binarySearch(byte[] a, byte key)
使用二分搜索法来搜索指定的 byte 型数组,以获得指定的值。
2.对数组的复制
copyOf(boolean[] original, int newLength)
复制指定的数组,截取或用 false 填充(如有必要),以使副本具有指定的长度。
最重要的方法
将数组变成List集合
使用Arrays.asList();
String [] arre={"11","23","22"};
List<String>list = Arrays.asList(arre);
System.out.println(list);
//结果为 [11, 23, 22]
为什么将数组变为集合?
可以使用集合的思想和方法来操作数组中的元素。
数组是一个对象,但是它的功能比较少。
而集合的方法很多。
注意:将数组变成集合,不可以使用集合的增删方法
因为数组的长度是固定的。
如果使用增删,会发生UnsupportedOperationException
注意
当使用
int []arr = {1,33,3,4,5};
List list= Arrays.asList(arr);
System.out.println(list);
打印的不是元素,而是这个数组地址值。。
它是将arr作为一个集合的元素存在,而这个集合的类型就是int[]
所以当使用泛型的时候,
List<int []> list= Arrays.asList(arr);
应该这样去定义
如果数组中的元素都是对象,变成集合时候,数组中的元素就直接转成集合中的元素
比如说String,如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
当我们这样定义时候
Integer []arr ={1,33,3,4,5};
List<Integer> list= Arrays.asList(arr);
System.out.println(list);
结果为[1,33, 3, 4, 5]
上述是数组变成集合使用Arrays中的asList方法。
当集合变为数组的时候,就用到了
Collection接口中的toArray方法。
ArrayList<String>al = newArrayList<String>();
al.add("1");
al.add("2");
al.add("3");
String [] arr=al.toArray(newString[0]);
System.out.println(Arrays.toString(arr));
输出为 [1, 2, 3]
//这里指定类型的数组要定义多长呢?当指定类型数组小于集合的size,
//那么该方法内部会创建一个新的数组,长度为集合的size
//当指定类型的数组长度大于了集合的size,就不会新创建数组,而是使用
//传递进来的数组。
//所以应该这样创建。String [] arr=al.toArray(newString[al.size()]);
为什么要将集合变成数组?
是为了限定对元素的操作。当返回一个集合时候,使用者对这个集合依然可以使用增删的方法对集合进行修改。不能改变其集合的大小了