黑马程序员java学习笔记——Collections、Arrays工具类和其他对象

时间:2023-02-24 23:25:29
------- android培训java培训、期待与您交流! ----------

今天的内容主要是操作集合框架的工具类、JDK1.5的一些新特性以及其他常用对象。

    Collections类  

    概述

    Collections是对集合进行操作的工具类,这个类的出现是有原因的,就比如说我们在往集合中存数据时,要求不需要保证元素的唯一,那么可以用List集合来存储,但是我们又想要对集合中的元素进行排序,而List中并没有封装直接对元素进行排序的方法,java就给我提供了一个工具类来进行这些操作,这个工具类就是Collections。

    Collections里边的方法全是静态的,不需要创建对象,直接被类名调用,类上也没定义泛型,泛型定义在方法上了。  

    常用方法

    排序:

        sort(List<T> list):对集合进行排序,这个T必须具备比较性,必须是

        comparable的子类;
        sort(List<T> list,Comparator<? super E> c)这个如果传进来的元素不具备

        比较性,也可以在其中加上一个比较器;

        要注意的是这个方法只能对List进行排序。

    获取最大值:
        max(Collection<? extends T> coll) ;
        max(Collection<? extends T> coll, Comparator<? super T> comp):按照集

        合的排序方式,获取集合的最大值;

        要取最大值就要保证这个集合中的元素具备比较性。

    二分法查找:
        binarySearch(List<? extends T> list, T key, Comparator<? super T> c):

        二分法查找,返回一个int类型值;
        binarySearch(List<? extends Comparable<? super T>> list, T key):如果

        要找的元素不存在,返回的是:-插入点-1;

        二分法查找涉及到角标,所以只能对List使用这个方法,而且要保证这个集合中

        的元素是有序的。

    替换:
        fill(list<T>,t):替换指定列表中的所有元素;
        replaceAll(list<T>,x,y):将所有的x转换成y。

    反转:
        reverse(list):把list集合中的元素进行反转;

        reverseOrder():返回的是一个比较起,和reverse不同,它强行逆转了对象的

        自然顺序;

        reverseOrder(Comparator<T> cmp);可以逆转指定比较器的顺序。

    同步:
        synchronizedList,synchronizedMap,synchronizedSet:把这些集合变成同步

        的,这个方法非常重要。

    置换:
        swap(list,x,y):对list集合中的x和y的位置进行互换;

    随机置换:
        shuffle(list):随机置换集合中的元素。

    Collection和Collections的区别:首先Collection是一个接口,而Collections是一个类,Collection里边放的是集合中的共性方法,提供了对集合对象操作的通用的方法,它是集合体系的顶层,而Collections是java给我们提供的对集合进行操作的工具类,它里边的方法全是静态的,直接通过类名调用,它是为Collection框架服务的。

    Arrays

    概述

    Arrays是用于操作数组的工具类,里面也全都是静态方法,里边的方法直接通过类名调用。   

    常用方法

    将集合变数组:asList(T...a),返回的是一个数组,a是支持列表的数组。

    把数组变成集合有什么好处?

    可以使用集合的思想或方法操作数组中的元素。

    注意:将数组变成集合,不能使用集合的增加删除方法,因为数组的长度是固定的,如果增删会发生不支持操作异常,如果我们转换的是基本数据类型的数组,那么被转换的集合会把这个数组作为元素存在集合中,这个集合中只有一个元素,如果转换的是基本数据类型对象包装类对象的数组,转换后的集合会把里边的每一个对象当成一个元素存到集合中。而且在写泛型是也是不同的,比如int型的,泛型就要写<int[]>,而Integer就要写<Integer>。

    将数组变集合:Collection接口中的toArray方法。

    指定类型的数组要定义多长呢?

    当指定类型的数组长度小于集合size,该方法内部会创建一个心的数组,长度为集合的size,大于集合的size时,就不会创建新的数组,所以创建一个最好的数组最优:String[] arr = al.toArray(new String[al.size()])。

    为什么要将集合变数组?

    为了限定对元素的操作,不需要进行增删。

    其他的还有sort排序,toString将数组中的元素变成字符串,toBinarySearch二分法查找元素,equals比较两个数组中的内容是否相同,deepEquals深度比较,数组里边还能放容器,我们还可以对这个容器进行比较。


    JDK1.5的一些新特性

    增强for循环

    格式:for(数据类型 变量名 :被遍历的集合或数组){ }

    特点:增强for循环只能对集合中的元素进行取出,不能修改,这是它的局限性,对集合的操作,iterator除了遍历,还能进行remove动作,如果使用列表迭代器还能在遍历过程中进行增删操作。

    高级for循环和传统for循环的区别:高级for循环有一个局限性,必须要有被遍历的目标,建议遍历数组时还是使用传统for循环,因为可以定义角标。

    接下来我们用一个Map集合来对高级for循环的使用进行演示:

import java.util.*;
class ForEachDemo
{
public static void main(String[] args)
{
forEach();
}
public static void forEach()
{
HashMap<Integer,String> hm = new HashMap<Integer,String>();
hm.put(1,"abc1");
hm.put(2,"abc2");
hm.put(3,"abc3");
hm.put(4,"abc4");
/*
Set<Integer> keySet = hm.keySet();
for(Integer i : keySet)
{
System.out.println(i+"::"+hm.get(i));
}
*/
Set<Map.Entry<Integer,String>> entrySet = hm.entrySet();
for(Map.Entry<Integer,String> me : entrySet)
{
System.out.println(me.getKey()+"::::"+me.getValue());
}
}
}

    运行结果是:

    黑马程序员java学习笔记——Collections、Arrays工具类和其他对象


    可变参数

    当要把一个数组作为一个方法的参数时,调用方法是都要新建一个数组,太麻烦;所以就引入可变参数int... arr;这样,每次只需要将元素传进来即可;隐式的将这些元素封装成一个数组。

    需要注意的是:可变参数一定要定义在参数列表的最后。

    静态导入

    静态导入就是导包的时候在import后加上static会导入这个类中的所有静态成员,没写就导入的全是类。

    注意:当有重名方法时,调用前必须要加上类名;
          有重名类时,创建类是要加上包名。

    

    其他对象

    这部分内容主要是为了学会怎么去查阅API,怎么使用API中的对象。


    System类

    概述

    作用:描述系统的一些信息,它里边的方法都是静态的,可以直接被类名调用。
    IO相关:setIn(input),setOut(output);properities类---Map集合的子类对象,继承HashTable。
    in:标准输入,默认是键盘。
    out:标准输出,默认是控制台。
    

    常用方法    

    获取系统的属性信息:Properities getProperties(),Properities这个类没有定义

                        泛型;    

    在系统中自定义一些特有信息:setProperty(key,value);  

    获取指定属性信息:getProperty(key)。

    动态加载指定值:java -Dkey=value 类名


    Runtime类

    概述  

    每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。

    该类中没有提供构造函数,该类中的方法应该都是静态的,但是该类中还有非静态方法,所以该类一定会有一个方法以便获取对象,而且该方法一定是静态的,由此看出该类使用了单例设计模式。    

    常用方法

    获取本类实例对象:static Runtime getRuntime();   

    exec:execute的简写,就是执行的意思,此方法返回的Process对象,Process是抽象的,不能创建对象,也没有子类,这个方法不仅能打开一个程序,还能用这个程序取代开一个文件。    

    destory():这个方法是Process类中的方法,作用是杀掉子进程,秒杀,但是它只能杀exec方法开启的进程。


    Date类

    概述

    作用:对日期或时间进行描述,这个类在java text包中。    

    使用方式

    建立时间Date对象,获取这个瞬间的时间,然后建立SimpleDateFormat的对象,将自己需要的格式存到SimpleDateFormat的构造函数中;再用这个对象调用他的格式化方法:format(),将日期作为参数传递给这个方法,进行格式化操作;

    我们用一个小程序来对这个类的功能进行展示:

import java.text.*;
import java.util.Date;
class DateDemo
{
public static void main(String[] args)throws Exception
{
dateDemo();
}
public static void dateDemo()
{
//建立Date对象,表示特定的瞬间
Date d = new Date();
System.out.println(d);//这不是想要的格式
//将格式封装到SimpleDateFormat对象中,
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 星期W hh:mm:ss");
//调用格式化方法format();
String time = sdf.format(d);
System.out.println(time);
}
}

    运行结果是:

    黑马程序员java学习笔记——Collections、Arrays工具类和其他对象


    Calendar类

    概述

    Calendar这个类提供了获取设置日期等方法,它是一个抽象类,不能直接创建对象,要获取这个类的对象可以通过这个类的一个静态方法getInstance()来获取Calendar对象。

    常用方法

    字段:都是静态的,可以直接通过类名调用;

    getInstance():会返回一个Calendar对象;

    get(字段):能获取该字段的对应时间(年,月<一月到十二月,对应数字0~11>,日,

    星期<星期日~星期六 对应数字1~7>);

    set(字段,修改的时间):将给定的字段设置为指定的值;

    set(年,月,日...):设置年、月、日.....的值;

    add(字段,增加或者减少的时间数量):加上或减去指定的时间量,就是对时间量的

    偏移。

    例子:查表法获取对应的年,月,日,星期。

import java.text.*;
import java.util.Date;
import java.util.*;
import java.text.*;
/*
查表法获取对应的年,月,日,星期。
*/
class CalendarDemo
{
public static void main(String[] args)throws Exception
{
Calendar c = Calendar.getInstance();
calendarDemo(c);
}
public static void calendarDemo(Calendar c)
{
String[] mons = {"一月","二月","三月","四月",
"五月","六月","七月","八月",
"九月","十月","十一月","十二月"};

String[] weeks = {"","星期日","星期一","星期二",
"星期三","星期四","星期五","星期六"};

int index = c.get(Calendar.MONTH);
int index1 = c.get(Calendar.DAY_OF_WEEK);
System.out.println(c.get(Calendar.YEAR)+"年");
//System.out.println((c.get(Calendar.MONTH)+1)+"月");
System.out.println(mons[index]);
System.out.println(c.get(Calendar.DAY_OF_MONTH)+"日");
//System.out.println("星期"+c.get(Calendar.DAY_OF_WEEK));
System.out.println(weeks[index1]);//这里从1角标开始查,所以可以在数组中0角标位添加一个其它元素,或者在这里角标减一。
}
}

    运行结果是:

    黑马程序员java学习笔记——Collections、Arrays工具类和其他对象

    

    Math类

    概述

    Math类中放的是用于执行基本数学运算的方法,该类全为静态方法,不需要创建对象,直接用类名调用,它在lang包中,使用时不需要导包。

    常用方法

    abs():返回绝对值;

    ceil():返回大于指定数据的最小整数,如:ceil(12.25),返回13;

    floor(double d):返回小于指定数据的最大整数,如:floor(12.25),返回12;

    round(double d):四舍五入,round(12.25),返回12,round(12.65),返回13;

    pow(double d1,double d2):d1是底数,d2是指数,返回d1的d2次方,

    如:Math(2,3),返回8;

    random方法:返回带正号的double值,该值大于等于0且小于1,返回的是一个为随机选择的数,第一次调用它时,它将创建一个伪随机数生成器。


for(int x=0;x<10;x++)
{
int d = (int)(Math.random()*10+1);//random得到的是double值,我们转成int类型的;
System.out.println(d);
}


    这个代码的结果是:打印1到10的随机数。

    Random类:它是一个专门用于生成随机数的类,里边定义了生成随机数的方法,其实它和Math的random方法是一样的,我们可以通过建立这个类的对象,然后再调用它生成随机数的方法nextInt(int n),这个方法生成的是0到n的随机数,包含0不包含n。

    我通过代码来进行演示:

import java.util.Random;
class RandomDemo
{
public static void main(String[] args)throws Exception
{
Random r = new Random();//建立Random对象;
for(int x=0;x<6;x++)
{
int d = r.nextInt(6) + 1;//调用nextInt方法,生成1到6之间的随机数;
System.out.println(d);
}
}
}


    运行结果是:

    黑马程序员java学习笔记——Collections、Arrays工具类和其他对象