黑马程序员_集合框架工具类、JDK1.5新特性及其他对象

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、Collections

概述

是集合框架的工具类,这个类不能创建对象,里面的方法都是静态的


Collections和Collection有什么区别?

Collection是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。它有两个常用的子接口List和Set。

Collections是集合框架中的一个工具类。该类中的方法都是静态的提供的方法中有可以对list集合进行排序,二分查找等方法。通常常用的集合都是线程不安全的。因为要提高

效率。如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。


常见操作

Collections.sort(list);//list集合进行元素的自然顺序排序

Collections.sort(list,new CompartorByLen());//按指定的比较器方法排序

class ComparatorByLen implements Comparator<String> {
	public int compare(String s1,String s2) {
		int temp = s1.length()-s2.length();
		return temp == 0?s1.compareTo(s2):temp;
	}
}


Collections.max(list);//返回list中字典顺序最大的元素

int index=Collections.binarySearch(list,"zz");二分查找,返回角标

Collections.reverseOrder()逆向反转排序

static<T> Comparator<T> reverseOrder();//返回一个比较器,它强行逆转实现了Comparable 接口的对象 collection 的自然顺序。

Collections.shuffle(list);//随机对list中的元素进行互换


将非同步的集合转成同步集合的方法

List synchronizedList(list);

Map synchronizedMap(map);

原理:定义一个类,将集合所有方法加同一把锁后返回


二、Arrays

概述

用于操作数组对象的工具类,里面都是隐藏方法


重点方法

List asList方法:将数组转换成list集合

asList方法的好处:可以使用集合的方法操作数组,比如isEmpty()、contains、indexOf、set

//将arr数组转成list集合
String[] arr = {"abc","kk","qq"};
List<String>list = Arrays.asList(arr);

注意!(局限性)

数组是固定长度,不可以使用集合对象增加或者删除,会改变数组长度的功能方法

比如isEmpty()、contains、indexOf、set。否则会报不支持操作异常UNsupportedOperationException。

如果数组中储存的类型是基本数据类型,asList会将数组整体作为集合中单个元素的存在。

因此如果存入int类型应该这么存。

int[] arr = {2,3,4};
List<int[]> list = Arrays.asList(arr);
//或者
Integer[] arr = {2,3,4};
List<Integer> list = Arrays.asList(arr);

集合转成数组

使用的是Collection接口中的方法toArray();

如果给toArray传递的指定类型的数据长度小于了集合的size,那么toArray方法,会再创建一个该类型数据,长度为集合的size

如果传递的指定类型的数组长度大于了集合的size,那么toArray方法,就不会创建新的数组,直接使用该数组即可,并将集合中的元素存储到数组中,其他储存元素的位置默认值为null。

所以,在传递指定类型的数组时,最好的方式就是指定的长度和size相等的数组。

将集合变成数组后有什么好处

限定对集合中元素进行增删操作,只要获取这些元素即可。

class {
	public static void main(String[] args) {
		ArrayList<String> al = new ArrayList<String>();
		al.add("a");
		al.add("s");
		al.add("d");
		//集合转成数组
		String[] arr = al.toArray(new String[al.size()]);
		System.out.println(Arrays.toString(arr));//利用Arrays操作数组的方法,打印数组的元素
	}
}

三、JDK1.5新特性

概述

Collection在JDK1.5以后,有了一个父接口Iterable,这个接口的出现将Iterator方法进行抽取,提高了扩展性。


1、增高级for循环

格式:

for(元素类型变量名:被遍历的集合Collection集合&数组){

...

}

对集合进行遍历:只能获取集合中的元素,但是不能对集合进行操作。

迭代器除了遍历,还可以进行remove集合中元素的操作

如果是用ListIterator,还可以在遍历过程中对集合元素进行增删查改


高级for和传统for的区别

高级for必须要有明确的遍历的目标。

在遍历数组的时候建议使用传统for,因为传统for可以定义角标。

代码示例:

import java.util.*;

class ForEachDemo {
	public static void main(String[] args) {
		//定义一个ArrayList集合
		ArrayList<String> al = new ArrayList<String>();
		al.add("abc1");
		al.add("abc2");
		al.add("abc3");
		//高级for语句遍历a1集合
		for(String s : al) {
			System.out.println(s);
		}

		System.out.println(al);

		int[] arr = {3,5,1};
		//传统for遍历数组
		for(int x=0; x<arr.length; x++) {
			System.out.println(arr[x]);
		}
		//高级for遍历数组
		for(int i : arr) {
			System.out.println("i:"+i);
		}
		//定义HashMap集合
		HashMap<Integer,String> hm = new HashMap<Integer,String>();

		hm.put(1,"a");
		hm.put(2,"b");
		hm.put(3,"c");
		//keySet取出方式和高级for遍历
		Set<Integer> keySet = hm.keySet();
		for(Integer i : keySet) {
			System.out.println(i+"::"+hm.get(i));
		}
		//entrySet取出方式和高级for遍历
		for(Map.Entry<Integer,String> me : hm.entrySet()) {
			System.out.println(me.getKey()+"------"+me.getValue());
		}
	}
}

2、可变参数

如果一个函数要传入多个参数,且参数个数不确定,就可以使用这个方式。


可变参数特点

不用每次都手动建立数组对象

主要将操作的元素作为参数传递即可

隐式将这些参数封装成数组


注意!

可变参数一定要定义在参数列表的末尾


代码示例

public static void main(String[] args) {  
	show("haha",1,3,5,7,9);  
}  
public static void show(String str,int... arr) {
	//...表示可变参数,定义在末尾
	System.out.println(arr.length);  
}  


3、静态导入

写法:

import static ava.util.Arrays.*;//导入的是Arrays这个类中的所有以静态成员。

import static java.lang.System.*//导入了Ssytem类中所以静态成员。

没加static导入的是类,加上static导入的全是某一个类中所以的静态成员。这样写在调用该类的静态方法时可以不用再写类名。

如:System.out.println("haha");就可以直接写 out.println("haha");


注意

当导入的两个类中有同名成员时,需要在成员前加上相应的类名。

当类名重名时,需要指定具体的包名。当方法重名时,指定具体所属的对象或者类。


代码示例

import static java.util.Arrays.*;//导入Arrays和System中所有的静态成员
import static java.lang.System.*;

class  StaticImport {
	public static void main(String[] args) {
		out.println("haha");//使用System方法可以直接省略书写System.
		int[] arr = {3,1,5};

		sort(arr);//使用Arrays工具类的方法sort时就可以省略书写Array.

		int index = binarySearch(arr,1);//二分查找可以省略书写Array.
		out.println("Index="+index);

		 //当没有指定继承时,所以类默认继承了Object,
	   //因为Object和Arrays中都有toString方法,所以为了区分,必须写上具体调用者
	   out.println(Arrays.toString(arr));
	}
}


四、其他对象类

1、System

概述

System是描述系统一些信息的类,类中的属性和方法都是静态的。不能被实例化,没有提供构造函数。

字段摘要

out:标准输出流。默认是控制台。

in:标准输入流。默认是键盘。


方法

long currentTimeMillis();//返回当前时间毫秒值

exit();//退出虚拟机

Properties getProperties();//获取当前系统的属性信息

System.setProperty("myname");//给系统属性信息集添加具体的属性信息


通过命令:java -D<name>=<value>可以设置特有的系统属性信息


示例代码:

import java.util.*;
class SystemDemo 
{
	public static void main(String[] args) 
	{

		Properties prop = System.getProperties();
		
		//在系统中自定义一些特有信息
		System.setProperty("mykey","myvalue");

		//获取指定属性信息。
		String value = System.getProperty("os.name");
		System.out.println("value="+value);

		String v = System.getProperty("haha");
		System.out.println("v="+v);

2、Runtime

概述

每个java应用程序都有一个Runtime类实例,使用应用程序能与其中运行的环境相连接,应用程序不能创建自己的Runtime类的实例,是由系统底层自己创建的。

该类没有构造方法,不能创建对象。

但是存在非静态的方法,说明该类定义好了对象并且可以通过一个static方法获取这个对象。用这个对象来调节非静态方法。这个方法就是static Runntime getRuntime();

这个Runtime其实是使用单例设计模式进行设计。


代码示例

class {
	public static void main(String[] args) throws Exception {
		Runtime r = Runtime.getRuntime();
		
		//启动程序和杀掉子进程
		Process p = r.exec("E:\\SogouExplorer\\SogouExplorer.exe");
		Thread.sleep(4000);
		p.destroy();
	}
}

3、Math

概述

用于数学运算的工具类,属性和行为都是静态的。该类是final不允许继承的。


方法

static double ceil(double a);//返回大于指定数值的最小整数

static double floor(double a);//返回小于指定数值的最大整数

static long round(double a);//四舍五入成整数

static double pow(double a,double b);//a的b次幂

static double random();//返回0~1的伪随机数


代码示例

public static void main(String[] args) {
		Random r = new Random();
		for(int x = 0;x<10;x++) {
		//随机取出10个包含10不包含包0的整数
		//int d=(int)(Math.random()*10+1);
		int d=r.nextInt(10)+1;
		System.out.println(d);
		}
}

4、Date

System.currentTimeMillis();//获取毫秒值

SimpleDateFormat("yyyy/MM/dd");//作为可以指定用户自定义的格式来完成格式化


示例代码

import java.text.SimpleDateFormat;
import java.util.Date;

public class DateDemo {
	public static void main(String[] args) {
		Date d = new Date();
		System.out.println(d);
		// 打印的看不懂,希望有些格式

		// 将自定义格式封装到SimpleDateFormat对象中
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
		SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年MM月dd日E hh:mm:ss");
		// 调用format方法让模式格式化指定Date对象
		String time = sdf.format(d);
		String time1 = sdf1.format(d);

		System.out.println(time);
		System.out.println(time1);
	}
}

5、Calendar日历类

概述

Calendar是一个抽象类,它为特定瞬间与一组诸如YEAR、MONTH、DAY_OF_MONTH、HOUR等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下

星期的日期)提供了一些方法。


最好使用查表法。当数据个数确定,而且有对应关系。如果对应关系的一方是数字,而且可以作为角标,那么可以通过数组作为表。


方法

c.add (Calendar.YEAR);//获取年份

c.add(Calendar.MONTH);//获取月份

c.add(Calendar.DAY_OF_MONTH);//获取日期

c.add(Calendar.DAY_OF_WEEK);//获取星期

c.add(Calendar.HOUR_OF_DAY);//获取小时

c.add(Calendar.MINUTE);//获取分钟

c.add(Calendar.SECOND);//获取秒数

c.add(Calendar.DAY_OF_MONTH,-1);//往前推一天

c.set(2015,8,19);//2015年9月19号,0~11表示1~12月







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值