第10篇 Java中的常用工具类
整理下这一周的最后一些内容。虽然东西不多,但以后也可以常回来看看。
个人感觉还是代码最好表达自己想要记忆的东西,不够的话再把注释加上。乱七八糟的概念百度上大同小异,只有代码是属于你自己的,是唯一的,也是你应该留下的。
包装类
我们所使用的一般数据类型,又称为值类型。这种数据类型存储在栈中,不属于对象的范畴。但Java是一门面向对象的语言,万物皆对象,自然不能把这些值类型排除在外,所以有了包装类。
所谓包装类,就是把我们所用到的值类型变量进行一个包装,使我们能通过对象的方式对其进行操作,让其有自己的属性和方法。把值类型数据包装成引用数据类型的这一过程又称为装箱,而这一逆过程则称之为拆箱。
包装类的对应关系:
一般情况,我们的编译器会对数据进行自动装箱拆箱:
1 int aInt = 0; 2 Integer aInteger = aInt; //自动装箱 3 int aI2i = aInteger; //自动拆箱
常用的一些方法及与字符串之间的相互转换(以Integer为例)
static int
parseInt(String s) 将字符串转成相应int数据类型的数static
Integer
valueOf(int i) 装箱方法
同样,String类提供了各基本数据类型转换成String的相应方法:static String
valueOf(int i)
日期工具类
1、类 Date
常用的方法:
Date(long date) 默认无参构造函数就不说了,其获取的是系统当前时间。这个带参构造函数传入一个long类型的值,代表着时间戳,即1970.1.1开始计算的毫秒数
after(Date when) 跟另外一个Date对象比较,返回是否在when之后。
before(Date when) 跟另外一个Date对象比较,返回是否在when之前。
getTime() 返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
Date类的操作方法十分之少,主要是由于Calendar类和DateFormat类的出现,使其只作为一个很鸡肋的存在,除了获取毫秒数,基本没有别的功能,对Date对象的操作都交由DateFormat来处理。
2、类 SimpleDateFormat
从名字我们就可以看出,这是一个对时间进行格式化处理的类,通过该类我们可以指定Date对象以特定的格式显示,也可以使特定格式的字符串转成一个Date对象。
一些模式字母:
- y 年
- M 月
- d 天
- w 年中的周数
- W 月中的周数
- E (星期中的天数)星期
- H 小时(0~23)
- h 小时(1~12)
- s 秒数
- S 毫秒数
常用到的方法:
SimpleDateFormat() 用默认的模式和默认语言环境的日期格式符号构造
SimpleDateFormat
。SimpleDateFormat(String pattern) 用给定的模式和默认语言环境的日期格式符号构造
SimpleDateFormat
。applyPattern(String pattern) 将给定模式字符串应用于此日期格式。
format(Date date) 将日期格式化成日期/时间字符串。(jdk1.8)
parse(String text) 从给定字符串的开始解析文本以生成日期。(jdk1.8)
1 Date date = new Date(); 2 //实例化SimpleDateFormat对象并传入特定格式 3 SimpleDateFormat spdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss E"); 4 //将date格式化后转成字符串 5 String nowDateString = spdf.format(date); 6 //打印格式化日期字符串 7 System.out.println(nowDateString);
1 2018-07-22 20:20:24 星期日
1 //将spdf应用新的格式 2 spdf.applyPattern("yyyy-MM"); 3 try { 4 //将特定格式字符串转成Date对象,抛出ParseException 5 Date str2Date = spdf.parse("2018-9"); 6 //获取转换后的时间戳 7 long str2DateMills = str2Date.getTime(); 8 System.out.println(str2DateMills); 9 } catch (ParseException e) { 10 System.out.println("日期格式错误!"); 11 }
1 1535731200000
3、类 Calendar(abstract)
日历类比日期类功能要丰富很多,它提供了很多对时间字段的获取和操作方法,但它不能被SimpleDateFormat操作,所以只能自己写算法实现对其时间的格式输出和与字符串之间的相互转换。
一些事件字段(静态常量,在get、set等方法中被使用):
DATE 指示一个月中的某天。
DAY_OF_MONTH 指示一个月中的某天。
DAY_OF_YEAR 指示当前年中的天数。
HOUR 指示上午或下午的小时(1~12)。
HOUR_OF_DAY 指示一天中的小时(0~23)。
YEAR 年
MONTH 月
DAY_OF_WEEK 指示一个星期中的某天。
常用方法:
add(int field, int amount) 对某个时间字段进行增减操作
get(int field) 返回给定日历字段的值
getActualMaximum(int field) 返回给定时间字段的当前最大值
getActualMinimum(int field) 返回给定时间字段的当前最小值
getInstance() 返回一个Calendar实例。由于Calendar是抽象类,不能被实例化,所以只能通过该方法来获取实例
getTime() 返回一个与当前Calendar对象时间相同的Date对象
getTimeInMillis() 返回时间戳
set(int field, int value) 将给定的日历字段设置为给定值
setTime(Date date) 使用给定的
Date
设置此 Calendar 的时间setTimeInMillis(long millis) 用给定的 long 值设置此 Calendar 的当前时间值
使用比较简单,这里只演示一个将字符串转换为Calendar格式方法: 先通过SimpleDateFormat将字符串转成Date对象,再通过setTime方法来对Calendar进行设置。
1 System.out.println("请输入一个日期(xxxx-xx-xx):"); 2 String str = scanner.next(); 3 try { 4 //字符串转Date并通过Date设置Calendar 5 calendar.setTime(sdf.parse(str)); 6 } catch (ParseException e) { 7 System.out.println("时间格式错误!"); 8 return; 9 }
Arrays 工具类
常用方法
binarySearch(byte[] a, byte key) 使用二分搜索法来搜索指定的 byte 型数组,以获得指定的值。
binarySearch(byte[] a, int fromIndex, int toIndex, byte key)
使用二分搜索法来搜索指定的 byte 型数组的范围,以获得指定的值。copyOf(byte[] original, int newLength)
复制指定的数组,截取或用 0 填充(如有必要),以使副本具有指定的长度。copyOfRange(boolean[] original, int from, int to)
将指定数组的指定范围复制到一个新数组。equals(byte[] a, byte[] a2)
如果两个指定的 byte 型数组彼此相等,则返回 true。fill(byte[] a, byte val)
将指定的 byte 值分配给指定 byte 节型数组的每个元素。sort(byte[] a)
对指定的 byte 型数组按数字升序进行排序。sort(byte[] a, int fromIndex, int toIndex)
对指定 byte 型数组的指定范围按数字升序进行排序。toString(byte[] a) 返回指定数组内容的字符串表示形式。
在使用Arrays工具类的二分法查找时,由于二分法的原理(先将数组一分为二,再与其中间元素进行对比,按对比结果判断要查找的元素在哪一半,直到找到该元素,返回下标),所以必须先将该数组进行排序,否则所找到的结果并无意义。
public int myBinarySearch(int[] arr, int obj) { //查找长度 int len = arr.length; //要进行比较的元素 int index = (len-1)/2; //数组边界(元素所在位置为arr[bound, arr.length - 1]) int bound = 0; while (true) { if (arr[index]<obj) { //例如查找的元素为5, 而arr[index] = 3,arr[index + 1] = 6,说明5并不存在数组中 if(arr[index+1]>obj) { return -1; } bound = index; index = len - index; index /= 2; index = bound + index; } else if (arr[index]>obj) { //与arr[index]<obj情况相同 if(arr[index-1]<obj) { return -1; } index /= 2; } else { //判断元素是否重复,重复则找到第一个出现的元素 while (arr[index-1]==obj) { index--; } return index; } //判断查找范围是否越界 if (index<0 || index>arr.length-1) { return -1; } //判断元素首部和尾部是否为该元素,是则返回index if (index==0 || index==arr.length-1) { if(arr[index]==obj) { return index; } else { return -1; } } } }
Collections 工具类
常用方法
addAll(Collection<? super T> c, T... elements) 将所有指定元素添加到指定 collection 中。
binarySearch(List<? extends Comparable<? super T>> list, T key) 使用二分搜索法搜索指定列表,以获得指定对象(实现Comparable接口)。
binarySearch(List<? extends T> list, T key, Comparator<? super T> c) 使用二分搜索法搜索指定列表,以获得指定对象(传入Comparator比较器)。
copy(List<? super T> dest, List<? extends T> src) 将所有元素从一个列表复制到另一个列表。
fill(List<? super T> list, T obj) 使用指定元素替换指定列表中的所有元素。
max(Collection<? extends T> coll) 根据元素的自然顺序,返回给定 collection 的最大元素。
max(Collection<? extends T> coll, Comparator<? super T> comp) 根据指定比较器产生的顺序,返回给定 collection 的最大元素。
min(Collection<? extends T> coll) 根据元素的自然顺序 返回给定 collection 的最小元素。
min(Collection<? extends T> coll, Comparator<? super T> comp)
根据元素的自然顺序 返回给定 collection 的最小元素。reverse(List<?> list) 反转指定列表中元素的顺序。
sort(List<T> list) 根据元素的自然顺序 对指定列表按升序进行排序。
sort(List<T> list, Comparator<? super T> c) 根据元素的自然顺序 对指定列表按升序进行排序。
swap(List<?> list, int i, int j) 在指定列表的指定位置处交换元素。
由于Collection集合所存元素皆为对象,所以要进行比较,必须实现Comparable接口或者传入Comparator比较器,否则无法进行比较。进行二分法查找时,同样需要现将集合进行排序后再进行查找,否则查找结果无意义。