------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;
}
}
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);
}
写法:
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月