【Java基础篇】Java 工具类
1. Collections
- 工具类,提供了对集合的常用操作
- 对集合进行查找
- 取出集合中的最大值,最小值
- 对List集合进行排序
-
集合框架的工具类。
Collections:集合框架的工具类。里面定义的都是静态方法。 -
Collections和Collection有什么区别?
Collection
是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。它有两个常用的子接口
- List:对元素都有定义索引。有序的。可以重复元素。
- Set:不可以重复元素。无序。
Collections
是集合框架中的一个工具类。该类中的方法都是静态的 - 提供的方法中有可以对list集合进行排序,二分查找等方法。
- 通常常用的集合都是线程不安全的。因为要提高效率。
- 如果多线程操作这些集合时,可以通过该工具类中的同步方法,将线程不安全的集合,转换成安全的。
- 指定类型的数组到底要定义多长呢?
- 当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。
- 当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。
- 所以创建一个刚刚好的数组最优。
- 为什么要将集合变数组?
- 为了限定对元素的操作。不需要进行增删了
2. Arrays
- 工具类,提供了对数组的常用操作
- 将数组转成List集合
- 对数组进行排序
- 对数组进行二分查找
- 将数组转为字符串显示形式
Arrays
:用于操作数组的工具类。里面都是静态方法。asList:将数组变成list集合
2.1 把数组变成list集合有什么好处?
可以使用集合的思想和方法来操作数组中的元素。
注意:将数组变成集合,不可以使用集合的增删方法。因为数组的长度是固定。只能使用查询的方法
- contains。
- get
- indexOf()
- subList();
注意:
如果你增删。那么会反生UnsupportedOperationException,
如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。
如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。
3. System类
- 静态属性in为标准输入流,属于InputStream类型,read方法返回一个字节
- 静态属性out为标准打印流,属于PrintStream类型,print方法打印字符
- 可以用set方法修改属性in和out
- System.exit()方法退出Java虚拟机
- System.gc()垃圾回收
- System.getProperties()方法获得系统属性
因为Properties是Hashtable的子类,也就是Map集合的一个子类对象。那么可以通过map的方法取出该集合中的元素。该集合中存储都是字符串。没有泛型定义。
4. Runtime类
- 表示系统运行时状态
- exec方法执行命令
4.1 Runtime对象
该类并没有提供构造函数。说明不可以new
对象。那么会直接想到该类中的方法都是静态的。发现该类中还有非静态方法。说明该类肯定会提供了方法获取本类对象。而且该方法是静态的,并返回值类型是本类类型。由这个特点可以看出该类使用了单例设计模式完成。该方式是static Runtime getRuntime();
5. Date时间类
- 使用new Date()创建时间对象代表当前系统时间
- 需要使用SimpleDateFormat类来进行格式化,才能显示想符合习惯的格式
public class Demo02 {
public static void main(String[] args) throws ParseException {
//把时间对象按照 "格式字符串指定的格式" 转成相应的字符串
DateFormat df=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //按指定格式进行转换
String format = df.format(new Date()); //将时间转换为字符串
System.out.println(format);
//把字符串对象按照 "格式字符串指定的格式" 转成相应的时间
DateFormat sf1 = new SimpleDateFormat("yyyy-MM-dd hh-mm-ss");
Date parse = sf1.parse("2019-7-6 12-13-12");
System.out.println(parse);
}
}
Calendar类
- 使用该类对时间进行操作比较方便
- 通过常量来表示时间的各种值,如一年中的某一天,一个月的某一天等
- 将对应的常量作为形参来调用相应的get、add、set方法来操作对象
jodatime工具类
<!--日期时间工具-->
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
创建日期
JDK的日期是Date:
Date date = new Date();
Joda-Time的日期是DateTime:
DateTime dateTime = new DateTime();
DateTime在创建的时候还可以轻松的指定特定的日期和时间:
DateTime dateTime2 = new DateTime(2016, 10, 01, 8, 00, 00);
日期格式化
JDK使用的是SimpleDateFormat来进行日期的格式化:
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String dateStr = sdf.format(date);
乍看之下用起来也不麻烦,但是SimpleDateFormat是非线程安全的。也就是说,如果在并发环境下,必须对SimpleDateFormat对象做同步处理,比如用synchronized,比如用ThreadLocal;或者每次都new一个新的SimpleDateFormat对象,缺点显而易见,就是浪费资源。
而Joda-Time中的DateTime本身就有格式化的方法,对象直接调用即可:
DateTime dateTime = new DateTime();
String dateTimeStr = dateTime.toString("yyyy-MM-dd HH:mm:ss");
当然,如果要用转换器,Joda-Time也提供了DateTimeFormatter:
DateTimeFormatter dtf = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss");
String dateTimeStr2 = dtf.print(dateTime);
而且DateTimeFormatter是不可变的,所以是线程安全的
SimpleDateFormat和DateTimeFormatter都可以将字符串转换成日期:
String dateStr = "2016-10-01";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date = sdf.parse(dateStr);
} catch (ParseException e) {
e.printStackTrace();
}
日期计算
个人在Joda-Time使用中,最喜欢的是它的日期计算。
比如要得到40天前的日期,在JDK中,计算日期相当复杂,必须借助日历Calendar来完成:
Date today = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(today);
calendar.add(Calendar.DAY_OF_MONTH, -40);
Date beforeDay = calendar.getTime();
System.out.println(beforeDay);
Joda-Time中,日期自带日期计算功能,非常直观:
DateTime todayDateTime = new DateTime();
DateTime beforeDateTime = todayDateTime.minusDays(40);
System.out.println(beforeDateTime);
如果要计算两个日期相差的天数,使用JDK是这样实现的:
int diffDays = (int)(today.getTime() - beforeDay.getTime())/(24 * 60 * 60 * 1000);
Joda-Time提供了相关的方法来处理:
int diffDays2 = Days.daysBetween(beforeDateTime, todayDateTime).getDays();
除了天数,月数、年数计算起来都非常方便,比如月数:
int diffMonths = Months.monthsBetween(beforeDateTime2, todayDateTime).getMonths();
兼容JDK日期
Joda-Time另一个使用起来非常方便的地方就是与JDK日期类的互相转换。因为很多现成的接口可能是用JDk的日期作为入参或者出参,如果Joda-Time不能兼容,那很多方便就不复存在了。
//Date to DateTime
Date date = new Date();
DateTime dateTime = new DateTime(date);
//DateTime to Date
Date date2 = dateTime.toDate();
//Calendar to DateTime
Calendar calendar = Calendar.getInstance();
DateTime dateTime2 = new DateTime(calendar);
//DateTime to Calendar
Calendar calendar2 = dateTime2.toCalendar(Locale.CHINA);
Math—Random类
static double ceil(double d) 返回大于d的最小整数 注意 d = 12.3时,结果:13
d = -12.3 结果:-12
static double floor(double a) 返回小于a的最大整数,
static long round(double a) 返回a的四舍五入的整数
Math.random()与Random.NextInt(int n)的使用;