黑马程序员——Java基础——集合工具类Collecions、Arrays、其他对象System类、Runtime类、Date类、Calendar类、Math类等操作

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

一、集合工具类——collections

1、概述

 Collectioncolletions有什么区别?

Collection是定义为接口的集合类型。Collections是集合的工具类。

  Collections的方法都是静态的,不需要创建对象,没有封装特有数据。在Collections工具类中大部分方法是用于对List集合进行操作的,如比较,二分查找,随机排序等。

    比如需求:一堆数据,不需要唯一,用list就可以存储,但是需要排序,这时候,不能再转为treeList了,这时候,集合就为我们提供了工具类,用来实现各种对集合进行操作的功能。

比如:

static <T extends Comparable<? super T>>  void   sort(List<T> list) 

          根据元素的自然顺序 对指定列表按升序进行排序。 

static <T> void  sort(List<T> list, Comparator<? super T> c) 

          根据指定比较器产生的顺序对指定列表进行排序。

不能给set排序,settreeSet,就可以达到排序的效果。

2、常见方法

      1)查找

        static <T extends Object & Comparable<? super T>>T  max(Collection<? extends T> coll) 

          根据元素的自然顺序,返回给定 collection 的最大元素。 

        static <T> T  max(Collection<? extends T> coll, Comparator<? super T> comp) 

          根据指定比较器产生的顺序,返回给定 collection 的最大元素。

        static <T> int  binarySearch(List<? extends Comparable<? super T>> list, T key) 

          使用二分搜索法搜索指定列表,以获得指定对象。 

         使用前提:必须有序

         如果没有这个元素,则返回值是    —(插入点-1.

     2)替换

        voidfill(List<? super T> list, T obj);//list集合中的全部元素替换成指定对象obj

        booleanreplaceall(List<T> lsit,T oldVal,T newVal);//newVal替换集合中的oldVal

        void swap(Listlist,int i,int j);/在指定列表的指定位置处交换元素

    3)排序:

        void shuffle(List<?> list);//使用默认随机源对list集合中的元素进行随机排序

        void sort(Lsit<T> list);//根据自然顺序对list集合中的元素进行排序

        voidsort(List<T> lsit,Comparator<? super T> c);//根据指定比较器c的排序方式对list集合进行排序

    4)反转

        reverse(List<?> list);//反转list集合中元素的顺序

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

        ComparatorreverseOrder(Comparator<T> cmp);//返回一个比较器,强行逆转了指定比较器的顺序

   5)同步的集合

        List<T>synchronizedList(List<T> list);//返回支持的同步(线程安全的)List集合

        Map<K,V>synchronizedList(Map<K,V> m);//返回支持的同步(线程安全的)Map集合

 

 3、代码 

  二分法搜索

   

 

如果元素没有比较性,用比较器

static <T> int  binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 

          使用二分搜索法搜索指定列表,以获得指定对象。 

 

  

二、集合工具类——Arrays

     1、概述

          Arrays:用于操作数组的工具类。里面都是静态方法。

     2、优点

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

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

如果定义为数组时,假如我们想要判断一个元素在数组中是否存在,我们通常需要遍历数组,才能判断。这往往要我们自己完成功能。但是如果变为集合后,我们可以这么做

System.out.println(List.contains(cc));

数组是一个对象,它封装的方法比较少。

     3、常见方法

        1)数组变为集合

         static <T> List<T>  asList(T... a) 

          返回一个受指定数组支持的固定大小的列表。 

     举例:

 String[]arr={abc,cc,kkkk};

List<String> list=Arrays.asList(arr);

System.out.println(list);

     注意:

    A 将数组变为集合,不可以使用集合的增删方法。否则会发生java.lang.UnsupportedOperationException不支持的操作异常。因为数组的长度是固定的。可以使用contains get 、 indexOf 、 sublist 等方法, 就是不能增删,如果增删,就会发生不支持操作异常。

特殊实例

      Int []arr={2,4,50};

List li=Arrays.asList(nums);

   B 如果数组中的元素都是对象,那么变成集合时,数组中的元素就直接转成集合中的元素。

如:字符串数组。

   C 如果数据中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

如果改为  Integer[] arr={2,4,5};就可以。

        2)集合转成数组

       <T> T[]  toArray(T[] a) 

   返回包含此 collection 中所有元素的数组;返回数组的运行时类型与指定数组的运行时类型相同。 

Collection接口中的toArray()方法

Object[] toArray() 返回包含此 collection 中所有元素的数组。

 

 

 

如果定义为小于3,则结果是[abc1,abc2,abc3]

原因:

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

当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组,长度为集合的size

当指定类型的数组长度大于了集合的size,就不会新创建数组,而是使用传递进来的数组。

所以,创建一个刚刚好的数组最优。

String[] arr=al.toArray(new String[al.size()]);

II为什么要将集合变数组呢?

为了限定对元素的操作。当集合是可变长度的,不断操作,然后把集合返回给对象。对方就可以对集合进行增删。但是我们不需要对集合进行增删。

 这时候,我们就把集合转成数组返回去,就不可以增删了。

三、其他对象——System

   1、概述

      第一个类System。包名java.lang.

  System类不能被实例化,Sysetem类中的方法和属性都是静态的

  Out:标准输出,默认是控制台。

  Int :标准输入,默认是键盘。  

System可以描述系统环境

  2、系统属性类——properties

1)获取系统属性信息

到底虚拟机启动的时候,都加载什么呢?描述系统一些信息。

方法:static Properties getProperties()  确定当前的系统属性 

打开properties,发现,它是一个类,是HashTable的子类。HashTable虽然被替代了,但是它的子类还可以被使用。因为这是一个属性类。它里面的一些特有方法,是和IO相关的。  它是Map集合成员中的一员。所以它可以调用Map集合中的方法,比如取出该集合中的元素,该集合中存储的都是字符串,没有泛型定义。

 

 

  2)获取指定属性信息 

     可以通过Sysetm类中的方法实现。

     static String getProperty(String key)   获取指定键指示的系统属性

  3)设置自定义系统属性信息

      static String setProperty(String key, String value)  设置指定键指示的系统属性。

        

     

   

 

 

   我们经常会遇到,当我们下载某一个软件时,软件名后有for windowsXP windows vista 不支持win7,那么我们如果在win7系统上装的时候,就会报错。因为软件在安装的时候,就会调用系统的属性信息。 

String v=System.getProperty(haha);

System.out.println(value=+v);//value=null没有这个键。

4)在jvm启动时,加载一些属性信息

现在我们有了这个想法:以前我们都是固定设置某一些属性值,是不可变的。那么我们能不能在jvm启动时,动态加载一些指定的属性信息呢?

Jvm启动的时候,需要调用java这个命令,

在命令行中打开java命令的信息

-d <name>=<value>

Set a system property

可以设置系统属性信息

命令行输入:java -Dhaha=qqqqq  SystemDemo 回车

Value=qqqqq

这样,我们就可以在启动jvm的时候,传进一些参数信息

应用:

服务器中一些批处理的程序就用到这些参数了。

四、其他对象——Runtime

   1、概念及其特点

 Runtime类, 位于java.lang包中,是运行时的意思。

  public  class  Runtime   extends  Object

     每个 Java 应用程序都有一个 Runtime 类实例,使应用程序能够与其运行的环境相连接。可以通过 getRuntime 方法获取当前运行时。Runtime是一个类,这个类没有构造函数,是不可以被直接创建对象的。

但它有方法摘要,按理说不能被直接创建对象的类中的方法都应该是静态的,可查阅api发现,这里的方法都不是被static修饰的。它们需要用对象调用。

它一给我们提供一个方法使我们可以获取一个该类的对象,而且该方法是静态的。

它就是:

static Runtime getRuntime()  返回与当前 Java 应用程序相关的运行时对象。 

 这个对象是不需要我们建立的,java程序一运行,它自动就生成了。

由这些特点可以看出该类使用了单例设计模式完成。

2、方法

     1) Process exec(String command)  在单独的进程中执行指定的字符串命令。 

  返回值是一个进程process,打开processapi文档描述,是一个抽象类。创建一个本机进程,返回一个process子类的实例。

   因为是抽象类,所以构造方法是给子类使用的。里面的方法也都是抽象的,这时候,我们想到,这个类应该有子类可以被我们使用,但是我们查阅后,发现,它没有子类。为什么?

    因为应用程序一被执行,就已经产生进程了,这个进程不是我们创建的,是调用底层资源创建的。所以它定义了抽象方法,却没有子类,因为底层在帮它做实现操作。 这个创建进程的方法,在某些机器平台上还不一定适用。

 

     2abstract  void destroy()  杀掉子进程。

      演示:

   

注意:public Process exec(String command) throws IOException如果出现错误,抛出IO异常

   应用:

 我们还记得,环境变量的设置,到path变量中,将值取出,里面有system32目录,如果在该盘下找不到,就会到这个目录下找执行文件,如果这个目录下也没有,就会编译失败。

qq.exe放里面,也会执行。

注意:写目录时,要多加一个\,因为java会把\当成反义字符读。

格式:R.exec(c:\\program Files\\fenglei\\fenglei.exe);

    我们到网吧时,发现,很多聊天工具在桌面上,为了方便应用,在桌面上建立一个图标,双击打开图标,就有qq聊天,msn聊天,泡泡,旺旺,很多按钮。当点击qq聊天,就打开qq窗口。

原理就是这样。当点击按钮,就触发调用本机上的qq.exe程序。

 

   注意:只能秒杀这个对象启动的进程,别的秒杀不了。要想秒杀别的进程,需要用c++调用windowsAPI。这样,我们就知道了,任务管理器中的结束进程按钮这么无敌,就是调用了底层结束进程的方法。现在,系统有保护的,要结束进程,是不被允许的。

 

   

五、其他对象——Date对象

1、概述

 我们在程序中,往往会操作日期时间等。

public class Date  extends Object  implements Serializable, Cloneable, Comparable<Date>

类 Date 表示特定的瞬间,精确到毫秒。

 通过date类打印的时间不符合人们的习惯,所以会看不懂,可以通过它的子类DateFormat,来完成操作。

2、子类DateFormat

      DateFormat是一个抽象类,有一个把日期转为字符串的方法,但是怎么调用呢?通过子类SimpleDateFormat,位于java.text包可以对这个子类进行构造,构造的时候,可以传一个pattern(模式)进来。

 SimpleDateFormat(String pattern)  用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat

至于模式详细,可以参考该类描述中,“日期和时间模式”一栏。

将模式封装到SimpleDateFormat对象中。

SimpleDateFormat sdf=new SimpleDateFormat(yyyyMMdd日”)

调用format方法让模式格式化指定date对象

具体步骤:

        1)创建Date对象

        2)将时间模式封装到SimpleDateFormat对象中

        3)调用format方法让格式化模式指定Date对象

 

 

六、其他对象——Calendar

        1、概述

         1Calendar是一个抽象类。

         2Calendar可以对年月日等时间进行获取。并提供了相应的子段值。

        2、方法

           获取日期时间                  

         1)获取年份:Calendar.YEAR

        2)获取月份:Calendar.MONTH

        3)获取日期:Calendar.DAY_OF_MONTH

        4)获取星期:Calendar.DAY_OF_WEEK

        5)获取小时:Calendar.HOUR_OF_DAY

        6)获取分钟:Calendar.MINUTE

        7)获取秒数:Calendar.SECOND

      设置时间:

        1)根据日历的规则,为给定的日历字段添加或减去指定的时间量:

                void add(int field,int amount);

        2)获取指定的日历字段对应的时间值:

                int get(int field);

        3)将给定日历字段对应的时间值设置为给定值:

                void set(int field,int value);

       设置日历字段 YEARMONTHDAY_OF_MONTH的值:

                void set(int year,int month,int date);

 

       

练习一:

获取任意年的二月有多少天

 思路:根据指定年设置一个时间就是,c.set(year,2,1)某年的三月一日

C.add(Calendar.DAY_OF_MONTH,-1)三月一日往前推一天,就是二月的最后一天。

练习二:

获取前一天的现在这个时刻

思路:c.add(Calendar.DAY_OF_MONTH,-1)

练习三

计算有效上课天数,每周六周日不上课,计算任意从九月到十月的上课天数

思路:

1根据指定年数设置一个时间c.set(year,8,1)某一年的九月一日

定义一个计数器,判断指定时间是否是星期六或者星期日,不是则计数加1

日期偏移量1天,直到判断到这个月的最后一天

 

 

 

 

 

七、其他对象——Math

      

       1、概述

       Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。该类方法都是静态方法。

       2、常用方法

         doubleceil(double d);//返回大于指定数据的最小整数

        doublefloor(double d);//返回小于指定数据的最大整数

        double pow(doublea,double b);//返回ab次方

        long round(doubleb);//返回b四舍五入的值 

        doublerandom();//返回正号的double值,是一个大于等于0.0且小于1.0的随机数

      3Random

        用于获取随机数。与Math中的random方法是一样的,不过这个类有自身的方法,可以将相应的随机数强转为指定基本数据类型。

      练习:

      给定一个小数,保留该小数的后n

      思路:1先把给定小数乘以10n次方,四舍五入保留整数部分

            2 再把该整数除以10n次方。

 

   

 


------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值