java----集合类

来源:互联网 发布:mac运行iphone应用 编辑:程序博客网 时间:2024/06/07 17:32
集合类
一、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;}elsereturn 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循环和迭代器有神马区别?
答:高级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要求必须有被遍历的目标。
建议:在遍历数组时,还是希望使用传统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时,导入的都是某一个类中所有的静态成员。
原创粉丝点击