集合框架中的工具类:
其一:collections
将一些collection中可能用到的一些方法定义到工具类中,需要使用的时候,直接调用方法就可以了。
但要注意工具类中的方法都是静态的。
这种思想很关键,当我们开发的时候也可以将一些方法定义在一个工具类中,
需要时只需要调用就行了。
有空翻翻java.util中的工具类collections 与Arrays 两个类。
public class Collectionsextends Object
此类完全由在 collection 上进行操作或返回 collection 的静态方法
组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器
返回由指定 collection 支持的新 collection,以及少数其他内容。
例如:
replaceAll(List<T> list, T oldVal, T newVal)
使用另一个值替换列表中出现的所有某一指定值。
reverseOrder()
返回一个比较器,它强行逆转实现了 Comparable 接口的对象 collection 的自然顺序。
addAll(Collection<? super T> c, T... elements)
将所有指定元素添加到指定 collection 中
在collections中有一类很重要的方法,可以直接将指定的集合加锁,
将其变成同步的支持同步的集合。
例如:
static <T> List<T>
synchronizedList(List<T> list)
返回指定列表支持的同步(线程安全的)列表
其二:Allays
Arrays:集合框架的工具类。里面的方法都是静态的。
重点方法:List asList(数组)将数组转成集合。
* 好处:其实可以使用集合的方法操作数组中的元素。
* 注意:数组的长度是固定的,所以对于集合的增删方法是不可以使用的
* 否则会发生UnsupportedOperationException
例如:判断数组中是否有某一元素。
重点方法:集合转成数组
方法:
使用的就是Collection接口中的toArray方法。
String[] arr = list.toArray(new String[list.size()]);
好处:
集合转成数组:可以对集合中的元素操作的方法进行限定。不允许对其进行增删。
特点:
toArray方法需要传入一个指定类型的数组。长度该如何定义呢?
如果长度小于集合的size,那么该方法会创建一个同类型并和集合相同size的数组。如果长度大于集合的size,那么该方法就会使用指定的数组,存储集合中的元素,其他位置默认为null。所以建议,最后长度就指定为,集合的size。
String[] arr = list.toArray(new String[list.size()]);
java.lang 接口 Iterable<T>
高级for可以在对集合元素进行取出操作时,可以替代迭代器Iterator
例如:
Iterator<String> it = list.iterator();
while(it.hasNext())
System.out.println(it.next());
而现在:
for(String s : list){ //最大好处:简化书写。
System.out.println(s);
传统for和高级for的区别?
传统for可以完成对语句执行很多次,因为可以定义控制循环的增量和条件。
* 例如:我想打印对象string“hello world”一百遍,就无法用高级for。
* 高级for是一种简化形式。
* 它必须有被遍历的目标。该目标要是数组,要么是Collection单列集合。
*高级for用处:
* 对数数组的遍历如果仅仅是获取数组中的元素,可以使用高级for。
* 如果要对数组的角标进行操作建议使用传统for。
for(String s : list){ //简化书写。
System.out.println(s);
}
一些新的方法书写及其特性:
函数的可变参数。:int...
* 其实就是一个数组,但是接收的是数组的元素。
* 自动将这些元素封装成数组。简化了调用者的书写。
*
* 注意:可变参数类型,必须定义在参数列表的结尾。
public static int newAdd(int a,int... arr){int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum+=arr[i];
}
return sum;
// System.out.println(arr);
// return 0;
}
API中其他的一些类(存在于java.lang中)的用法:
System:类
System:类中的方法和属性都是静态的。
* 常见方法:
* long currentTimeMillis();获取当前时间的毫秒值。
TimeMillis:毫秒值。
//获取系统的属性信息,并存储到了Properties集合中。/*
* properties集合中存储都是String类型的键和值。
* 最好使用它自己的存储和取出的方法来完成元素的操作。
*/
Properties prop = System.getProperties();
Set<String> nameSet = prop.stringPropertyNames();
for(String name : nameSet){
String value = prop.getProperty(name);
System.out.println(name+"::"+value);
}
Runtime类
Runtime:没有构造方法摘要,说明该类不可以创建对象。
* 又发现还有非静态的方法。说明该类应该提供静态的返回该类对象的方法。
* 而且只有一个,说明Runtime类使用了单例设计模式。
例如:
Runtime r = Runtime.getRuntime();
//execute: 执行。 xxx.exe exe是应用程序的后缀名。
// 可以利用Java程序打开指定程序
Process p = r.exec("notepad.exe");打开notepad程序。
但是注意必须要书写程序所在的绝对地址值,例如:
r.exec("c:\\abc\\QQ.exe")打开c盘abc目录下的QQ.exe程序。
使用双斜线是因为:\是转意符,前一个转意符可以将后一个转意符转回其本意。
进而得到c:\abc\QQ.exe
r.exec("c:\\abc\\baofeng.exe d:\\aa\\video\\大圣归来.mp4")
就可以用暴风影音来打开大圣归来的电影文件。
Thread.sleep(5000);//睡觉5秒
p.destroy();
//destroy()杀掉子进程
Math类
Math:提供了操作数学运算的方法。都是静态的。
常用的方法:
* ceil():返回大于参数的最小整数。
* floor():返回小于参数的最大整数。
* round():返回四舍五入的整数。
* pow(a,b):a的b次方。
因为是静态的方法,所以可以直接用类名.方法名来调用这个方法。
Date类与DateFormat类
日期对象和毫秒值之间的转换。
* 毫秒值-->日期对象 :
日期对象-->毫秒值:
* 2,getTime方法。
* 因为可以通过具体的数值进行运算。
对日期对象进行格式化。
* 将日期对象-->日期格式的字符串。
* 使用的是DateFormat类中的format方法
将日期格式的字符串-->日期对象。
* 使用的是DateFormat类中的parse()方法。
练习:
"2012-3-17"到"2012-4-6"中间有多少天?
思路:
1. 两个日期相减就哦了,咋减呢?必须要有两个可以进行减法运算的数。
能减可以是毫秒值。如何获取毫秒值?通过date对象。
如何获取date对象呢?可以将字符串转成date对象。
实现步骤:
1,将日期格式的字符串转成Date对象。
2,将Date对象转成毫秒值。
2, 相减,在变成天数
DateFormat dateFormat = DateFormat.getDateInstance();
dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date1 = dateFormat.parse(str_date1);
Date date2 = dateFormat.parse(str_date2);
long time1 = date1.getTime();
long time2 = date2.getTime();
long time = Math.abs(time1-time2);
int day = getDay(time);
System.out.println(day);