您的位置:首页 > 职场人生

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

2015-05-07 14:48 447 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

一、集合工具类——collections
1、概述
Collection和colletions有什么区别?
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排序,set有treeSet,就可以达到排序的效果。
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,打开process的api文档描述,是一个抽象类。创建一个本机进程,返回一个process子类的实例。
因为是抽象类,所以构造方法是给子类使用的。里面的方法也都是抽象的,这时候,我们想到,这个类应该有子类可以被我们使用,但是我们查阅后,发现,它没有子类。为什么?
因为应用程序一被执行,就已经产生进程了,这个进程不是我们创建的,是调用底层资源创建的。所以它定义了抽象方法,却没有子类,因为底层在帮它做实现操作。 这个创建进程的方法,在某些机器平台上还不一定适用。

2)abstract 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++调用windows的API。这样,我们就知道了,任务管理器中的结束进程按钮这么无敌,就是调用了底层结束进程的方法。现在,系统有保护的,要结束进程,是不被允许的。



五、其他对象——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(“yyyy年MM月dd日”);
调用format方法让模式格式化指定date对象
具体步骤:
1)创建Date对象
2)将时间模式封装到SimpleDateFormat对象中
3)调用format方法让格式化模式指定Date对象



六、其他对象——Calendar
1、概述
1)Calendar是一个抽象类。
2)Calendar可以对年月日等时间进行获取。并提供了相应的子段值。
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);
设置日历字段 YEAR、MONTH和DAY_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)某一年的九月一日
2 定义一个计数器,判断指定时间是否是星期六或者星期日,不是则计数加1
3 日期偏移量1天,直到判断到这个月的最后一天







七、其他对象——Math类

1、概述
Math 类包含用于执行基本数学运算的方法,如初等指数、对数、平方根和三角函数。该类方法都是静态方法。
2、常用方法
doubleceil(double d);//返回大于指定数据的最小整数
doublefloor(double d);//返回小于指定数据的最大整数
double pow(doublea,double b);//返回a的b次方
long round(doubleb);//返回b四舍五入的值
doublerandom();//返回正号的double值,是一个大于等于0.0且小于1.0的随机数
3、Random类
用于获取随机数。与Math中的random方法是一样的,不过这个类有自身的方法,可以将相应的随机数强转为指定基本数据类型。
练习:
给定一个小数,保留该小数的后n位
思路:1先把给定小数乘以10的n次方,四舍五入保留整数部分
2 再把该整数除以10的n次方。




------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐