集合类
一、Collections集合工具类
Collection里的方法都是静态的,没有特有方法,是专门对集合类进行操作的工具类。可以对List进行排序sort。
例:对ArrayList进行排序。
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abcd");
al.add("aaa");
al.add("z");
al.add("kkkkk");
al.add("qq");
System.out.println(al);
Collections.sort(al);
System.out.println(al);
}
}
如果想要对字符串的长度进行排序,查阅Api文档,发现
static <T> void sort(List<T> list, Comparator<? super T> c);根据指定比较器产生的顺序对指定列表进行排序。
可以传入比较器进行排序操作。
例:排序
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abcd");
al.add("aaa");
al.add("z");
al.add("kkkkk");
al.add("qq");
System.out.println(al);
Collections.sort(al,new myCom());//排序
System.out.println(al);
}
}
class myCom implements Comparator<String>
{
public int compare(String t1,String t2){
int num = new Integer(t1.length()).compareTo(new Integer(t2.length()));
if(num == 0)
return t1.compareTo(t2);
return num;
}
}
例:获取最长字符串。
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abcd");
al.add("aaa");
al.add("z");
al.add("kkkkk");
al.add("qq");
System.out.println(al);
Collections.sort(al,new myCom());
System.out.println(al);
String max = Collections.max(al,new myCom());//获取最长字符串
System.out.println("max:"+max);
}
}
class myCom implements Comparator<String>
{
public int compare(String t1,String t2){
int num = new Integer(t1.length()).compareTo(new Integer(t2.length()));
if(num == 0)
return t1.compareTo(t2);
return num;
}
}
例:二分查找法
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abcd");
al.add("aaa");
al.add("z");
al.add("kkkkk");
al.add("qq");
System.out.println(al);
Collections.sort(al,new myCom());
System.out.println(al);
String max = Collections.max(al,new myCom());
System.out.println("max:"+max);
int index = Collections.binarySearch(al,"aaa",new myCom());//二分查找
System.out.println("index:"+index);
}
}
class myCom implements Comparator<String>
{
public int compare(String t1,String t2){
int num = new Integer(t1.length()).compareTo(new Integer(t2.length()));
if(num == 0)
return t1.compareTo(t2);
return num;
}
}
二分查找回忆:
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abcd");
al.add("aaa");
al.add("z");
al.add("kkkkk");
al.add("qq");
System.out.println(al);
Collections.sort(al,new myCom());
System.out.println(al);
String max = Collections.max(al,new myCom());
System.out.println("max:"+max);
int index = My.binarySearch(al,"aaa");
System.out.println("index:"+index);
}
}
class myCom implements Comparator<String>
{
public int compare(String t1,String t2){
int num = new Integer(t1.length()).compareTo(new Integer(t2.length()));
if(num == 0)
return t1.compareTo(t2);
return num;
}
}
class My //二分查找
{
public static int binarySearch(ArrayList<String> al,String key){
int max = al.size()-1;
int min = 0;
int mid = 0;
while(min<max){
mid = (max+min)>>1;
String str = al.get(mid);
int num = str.compareTo(key);
if(num>0){
max = mid-1;
}
else if(num<0){
min = mid+1;
}
else
return mid;
}
return -min-1;
}
}
fill():将集合中的元素全部替换。
static <T> void fill(List<? super T> list, T obj);使用指定元素替换指定列表中的所有元素。
练习:fill方法可以将list集合中所有元素替换成指定元素。将list集合中部分元素替换成指定元素。
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("java");
al.add("java");
al.add("java");
al.add("java");
al.add("java");
al.add("java");
al.add("java");
show(al);
myfill(al,3,6,"CCC");
show(al);
}
public static void myfill(ArrayList<String> al,int start,int end,String value){
List<String> list = al.subList(start,end);
Collections.fill(list,value);
}
public static <T> void show(T t){
System.out.println(t);
}
}
replaceAll():替换值。
static <T> boolean replaceAll(List<T> list, T oldVal, T newVal);使用另一个值替换列表中出现的所有某一指定值。
reverse():反转。static void reverse(List<?> list);反转指定列表中元素的顺序。
练习:倒序操作(反转比较器)
static <T> Comparator<T> reverseOrder();返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。
static <T> Comparator<T> reverseOrder(Comparator<T> cmp);返回一个比较器,它强行逆转指定比较器的顺序。
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abcd");
al.add("aaa");
al.add("z");
al.add("kkkkk");
al.add("qq");
System.out.println(al);
Collections.sort(al,Collections.reverseOrder(new myCom()));
System.out.println(al);
}
}
class myCom implements Comparator<String>
{
public int compare(String t1,String t2){
int num = new Integer(t1.length()).compareTo(new Integer(t2.length()));
if(num == 0)
return t1.compareTo(t2);
return num;
}
}
同步功能:传入不同步的集合,返回一个同步的集合。
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。
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abcd");
al.add("aaa");
al.add("z");
al.add("kkkkk");
al.add("qq");
List<String> al2 = Collections.synchronizedList(al);
System.out.println(al2);
}
}
交换元素:
static void swap(List<?> list, int i, int j);在指定列表的指定位置处交换元素。
例:
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
al.add("java05");
System.out.println(al);
Collections.swap(al, 3, 4);
System.out.println(al);
}
}
随机排列:
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("java01");
al.add("java02");
al.add("java03");
al.add("java04");
al.add("java05");
System.out.println(al);
Collections.shuffle(al);
System.out.println(al);
}
}
二、Arrays数组工具类
Arrays:用于操作数组的工具类,里面都是静态方法。
详情参考Api文档。
asList():将数组变成List集合。
例:
import java.util.*;
class Demo
{
public static void main(String []args){
String []s = {"abcd","ab","cccc","ghj"};
List<String> al = Arrays.asList(s);
System.out.println(al);
}
}

答:可以使用集合的思想和方法来操作数组中的元素。
import java.util.*;
class Demo
{
public static void main(String []args){
String []s = {"abcd","ab","cccc","ghj"};
List<String> al = Arrays.asList(s);
System.out.println(al.contains("cccc"));//判断是否含有"cccc"
}
}
注:将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定的。可用方法:contains(),get(),indexOf(),subList()。
import java.util.*;
class Demo
{
public static void main(String []args){
String []s = {"abcd","ab","cccc","ghj"};
List<String> al = Arrays.asList(s);
al.add("cdef");//尝试添加元素
System.out.println(al.contains("cccc"));
}
}
发生了UnsupportedOperationException不支持操作异常。
import java.util.*;
class Demo
{
public static void main(String []args){
int []nums = {2,4,5}
List<int []> li = Arrays.asList(nums);
System.out.println(li);
}
}
import java.util.*;
class Demo
{
public static void main(String []args){
int []nums = {2,4,5};
List li = Arrays.asList(nums);
System.out.println(li);
}
}
注:如果数组中的元素都是对象,那么变成集合时数组中的元素就直接转成集合中的元素。如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
集合变数组:
<T> T[] toArray(T[] a);按适当顺序(从第一个到最后一个元素)返回包含此列表中所有元素的数组;返回数组的运行时类型是指定数组的运行时类型。
例:
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
String []arr = al.toArray(new String[0]);
System.out.println(Arrays.toString(arr));
}
}
例:
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
String []arr = al.toArray(new String[5]);
System.out.println(Arrays.toString(arr));
}
}

答:当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size。当指定类型的数组长度大于了集合的size,就不会新创建数组了。所以创建一个刚刚好的数组最优。
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
String []arr = al.toArray(new String[al.size()]);
System.out.println(Arrays.toString(arr));
}
}

答:为了限定对元素的操作,不需要进行增删了。
三、高级for循环

答:高级for循环对集合进行遍历,只能获取元素,但不能对集合进行操作。而迭代器除了能遍历数组,还可以进行remove集合中元素的操作。如果使用ListIterator,还可以在遍历过程中对集合进行增删改查的动作。
格式:
for(数据类型 变量名:被遍历的Collection集合或数组){
方法体;
}
例:
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
for(String s : al){
System.out.println(s);
}
}
}
注:高级for循环不能改变数组或集合里元素的值。
import java.util.*;
class Demo
{
public static void main(String []args){
ArrayList<String> al = new ArrayList<String>();
al.add("abc1");
al.add("abc2");
al.add("abc3");
for(String s : al){
s = "kk";
}
for(String s : al){
System.out.println(s);
}
}
}
import java.util.*;
class Demo
{
public static void main(String []args){
String []al = {"abc1","abc2","abc3"};
for(String s : al){
s = "kk";
}
for(String s : al){
System.out.println(s);
}
}
}

答:高级for要求必须有被遍历的目标。
建议:在遍历数组时,还是希望使用传统for。因为传统for可以定义角标。
练习:Map进行for循环遍历
import java.util.*;
class Demo
{
public static void main(String []args){
HashMap<String,String> map = new HashMap<String,String>();
map.put("01","java01");
map.put("02","java02");
map.put("03","java03");
map.put("04","java04");
//方法一
//show_01(map);
//方法二
show_02(map);
}
public static void show_01(HashMap<String,String> map){
for(String s : map.keySet()){
String key = s;
String value = map.get(s);
System.out.println(key+"..."+value);
}
}
public static void show_02(HashMap<String,String> map){
for(Map.Entry<String,String> me : map.entrySet()){
String key = me.getKey();
String value = me.getValue();
System.out.println(key+"..."+value);
}
}
}
四、可变参数
可变参数:JDK1.5版本出现的新特性。
import java.util.*;
class Demo
{
public static void main(String []args){
show(2,3,4,5,6);
show(2,3,4,5,6,4,2,35,9);
}
public static void show(int ...arr){
for(int i : arr)
System.out.print(i+" ");
System.out.println("len:"+arr.length);
}
}
好处:不用每一次都手动的建立数组对象。只要将操作的元素作为参数传递即可。隐式的将这些参数封装成了数组。
例:
import java.util.*;
class Demo
{
public static void main(String []args){
show("haha",2,3,4,5,6);
}
public static void show(String s,int ...arr){
System.out.println(s);
for(int i : arr)
System.out.print(i+" ");
System.out.println("len:"+arr.length);
}
}
注:在使用时要注意,可变参数一定要定义在参数列表最后面。
五、静态导入
静态导入:StaticImport
例:
import java.util.*;
class Demo
{
public static void main(String []args){
int []arr = {3,1,5};
Arrays.sort(arr);
int index = Arrays.binarySearch(arr,1);
System.out.println(Arrays.toString(arr));
System.out.println(index);
}
}
静态导入后:
import java.util.*;
import static java.util.Arrays.*;
class Demo
{
public static void main(String []args){
int []arr = {3,1,5};
sort(arr);
int index = binarySearch(arr,1);
System.out.println(toString(arr));
System.out.println(index);
}
}

答:因为对象的父类Object中也有个toString()方法,这时需要指明调用的具体是哪一个toString()方法。
注:当类名重名时,需要指定具体的包名。当方法重名时,需要指定具体所属的对象或者类。
import java.util.*;
import static java.util.Arrays.*;
class Demo
{
public static void main(String []args){
int []arr = {3,1,5};
sort(arr);
int index = binarySearch(arr,1);
System.out.println(Arrays.toString(arr));
System.out.println(index);
}
}
补充:import后面跟static时,导入的都是某一个类中所有的静态成员。