java----集合类

集合类
一、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 循环和迭代器有神马区别?
答:高级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时,导入的都是某一个类中所有的静态成员。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值