简单介绍
Java类库(包)
Java 的应用程序接口 (API) 以包的形式来组织,每个包提供了大量的相关类、接口和异常处理类,这些包的集合就是 Java 的类库。
- 包名以 Java 开始的包是 Java 核心包 (Java Core Package) ;
- 包名以 Javax 开始的包是 Java 扩展包 (Java Extension Package) ,例如 javax.swing 包;
常用核心包介绍
- java.lang Java 编程语言的基本类库
- java.applet 创建 applet 需要的所有类
- java.awt 创建用户界面以及绘制和管理图形、图像的类
- java.io 通过数据流、对象序列以及文件系统实现的系统输入、输出
- java.net 用于实现网络通讯应用的所有类
- java.util 集合类、时间处理模式、日期时间工具等各类常用工具包
- java.sql 访问和处理来自于 Java 标准数据源数据的类
- java.test 以一种独立于自然语言的方式处理文本、日期、数字和消息的类和接口
- java.security 设计网络安全方案需要的一些类
- java.beans 开发 Java Beans 需要的所有类
- java.math简明的整数算术以及十进制算术的基本函数
- java.rmi 与远程方法调用相关的所有类
常用的Java扩展包
- javax.accessibility 定义了用户界面组件之间相互访问的一种机制
- javax.naming.* 为命名服务提供了一系列类和接口
- javax.swing.* 提供了一系列轻量级的用户界面组件,是目前 Java 用户界面常用的包
Java类
Java类也大部分都是继承超类object的子类 有着不同的用法。jdk中提供了字符串、时间、数字、文件、网络、异常等相关处理的类。
字符串处理类
String、StringBuilder、StringBuffer
String
String声明为final的,不可被继承,代表不可变的字符序列;底层使用final char[]存储;实现了Serializable接口:表示字符串是支持序列化的。
使用注意:String的每次改变都会生成一个新的对象,需要用String对象去接收。
常用方法:见String类的API文档
StringBuilder
可变的字符序列。底层使用char[]存储。线程不安全,效率高。
常用方法:见StringBuilder类的API文档
StringBuffer
可变的字符序列;线程安全的 sychronized,效率低;底层使用char[]存储。
常用方法:见StringBuffer类的API文档
StringBuffer 与 StringBuilder 的扩容问题
如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。默认情况下,扩容为原来容量的2倍+ 2,同时将原有数组中的元素复制到新的数组中。
指导意义:开发中建议大家使用: StringBuffer(int capacity) 或StringBuilder(int capacity)
包装类
Java中的基本数据类型没有方法和属性,而包装类就是为了让这些拥有方法和属性,实现对象化交互。
包装类与对应基本数据类型关系如下图:
包装类和基本数据类型之间的转换
装箱:基本数据类型转换为包装类;
拆箱:包装类转换为基本数据类型。
每一个包装类转换的方法和下述中的基本一致:
- 通过包装类Integer.toString()将整型转换为字符串;
- 通过Integer.parseInt()将字符串转换为int类型;
- 通过valueOf()方法把字符串转换为包装类然后通过自动拆箱。
数学计算类
和数学计算相关的除了基本数据类型除外,还有Math、BigDecimal、BigInteger等类。
Math
java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回值类型一般为double型
常用方法:见Math类的API文档
BigInteger
java.math包的BigInteger可以表示不可变的任意精度的整数。 BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。
常用方法:见BigInteger类的API文档
BigDecimal
用于商业计算中,要求数字精度比较高,用java.math.BigDecimal类, 它支持不可变的、任意精度的有符号十进制定点数。
常用方法:见BigDecimal类的API文档
时间相关的类
jdk中提供了很多时间操作的类,可以获取时间、对时间进行增减、格式化等操作。时间操作类分为jdk8之前和jdk8及之后的版本的时间类。
jdk8之前时间操作类
Date
java.util.Date类表示特定的瞬间,精确到毫秒(查看API文档)
java.sql.Date对应着数据库中的日期类型的变量(查看API文档)
SimpleDateFormat
java.text.SimpleDateFormat类 :一个不与语言环境有关的方式来格式化和解析日期的具体类。可以实现Date和String类型的相互转化(查看API文档)
Calendar
java.util.Calendar(日历)类:Calendar是一个抽象基类,主用用于完成日期字段之间相互操作(例如时间加减操作、获取指定年、月、日的信息)的功能。(查看API文档)
- 获取月份时: 一月是0,二月是1,以此类推, 12月是11
- 获取星期时: 周日是1,周二是2 , 。 。。。周六是7
jdk8时间操作类
LocalDate
LocalDate代表IOS格式(yyyy-MM-dd) 的日期,可以存储生日、纪念日等日期。(查看API文档)
LocalTime
LocalTime表示一个时间, 而不是日期。(查看API文档)
LocalDateTime
LocalDateTime是用来表示日期和时间的,这是一个最常用的类之一。(查看API文档)
DateTimeFormatter
用于格式化或解析日期、时间
LocalDate、LocalTime、LocalDateTime 三个类中都有format(DateTimeFormatter dateTimeFormatter)方法来格式化时间。
比较器
ava实现对象排序的方式有两种:自然排序: java.lang.Comparable 和 定制排序: java.util.Comparator
Comparable
- java.lang.Comparable接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。默认从小到大
- 实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即通过 compareTo(Object obj) 方法的返回值来比较大小。
- 如果当前对象this大于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj, 则返回负整数,如果当前对象this等于形参对象obj, 则返回零。
- 实现Comparable接口的对象列表(和数组)可以通过 Collections.sort 或Arrays.sort进行自动排序。实现此接口的对象可以用作有序映射中的键或有序集合中的元素,无需指定比较器。
- 对于类 C 的每一个 e1 和 e2 来说,当且仅当 e1.compareTo(e2) == 0 与1.equals(e2) 具有相同的 boolean 值时,类 C 的自然排序才叫做与 equals一致。 建议(虽然不是必需的) 最好使自然排序与 equals 一致。
Comparable 的典型实现: (默认都是从小到大排列的)
6. String:按照字符串中字符的Unicode值进行比较
7. Character:按照字符的Unicode值来进行比较
8. 数值类型对应的包装类以及BigInteger、 BigDecimal:按照它们对应的数值大小进行比较
9. Boolean: true 对应的包装类实例大于 false 对应的包装类实例
10. Date、 Time等:后面的日期时间比前面的日期时间大
public class Person implements Comparable<Person>{
private String name;
private int age;
//构造方法
//set、get代码...
public int compareTo(Person p) {
// TODO Auto-generated method stub
if (this.age == p.age) {
return this.name.compareTo(p.name);
} else {
return this.age - p.age;
}
}
}
Comparator
当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码,或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那么可以考虑使用 Comparator 的对象来排序, 强行对多个对象进行整体排序的比较。查看API文档
重写compare(Object o1,Object o2)方法,比较o1和o2的大小:
- 如果方法返回正整数,则表示o1大于o2;如果返回0,表示相等;返回负整数,表示o1小于o2。
- 可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。
- 还可以使用 Comparator 来控制某些数据结构(如有序 set或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。
对集合中的对象排序代码案例如下:
// 排序
Collections.sort(formInfoList, new Comparator<FormInfo>() {
@Override
public int compare(FormInfo o1, FormInfo o2) {
//按类型排序
int flag = o1.getType().compareTo(o2.getType()); //这是升降,前面为升序 o2.getName().compareTo(o1.getName()) ---》这是降序 (下面同理)
//按标题排序
if (flag == 0) {
flag = o1.getFormName().compareTo(o2.getFormName());
}
//按部门排序
if (flag == 0) {
flag = o1.getDepartment().compareTo(o2.getDepartment());
}
//按员工编码排序
if (flag == 0) {
flag = o1.getEmployee().compareToIgnoreCase(o2.getEmployee());
}
/* //按工资排序
if(flag==0) {
flag=(int)(o1.getSal()-o2.getSal());
}*/
return flag;
}
});
// 先以价格(升序)、后再速度(升序)
list.sort(Comparator.comparingInt(Computer::getPrice).thenComparingInt(Computer::getSpeed));
// 先以速度(降序)、后再价格(升序)【reversed方法:返回一个比较器,它强制执行此比较器的反向排序。】
list.sort(Comparator.comparingInt(Computer::getSpeed).reversed().thenComparingInt(Computer::getPrice));
总结
-
Comparable是一个内部比较接口,通常对象需要内部排序时直接实现
-
Comparator是一个外部比较接口,通常在对象中没有实现排序接口而有需要进行排序时实现
-
Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小
-
Comparator接口属于临时性的比较。
System
系统级的很多属性(例如:系统名称、jvm版本、)和控制方法都放置在该类的内部。该类位于java.lang包。查看API文档
构造器是私有的,无法实例化该类。其内部的成员变量和成员方法都是static的
成员变量
System类内部包含in、 out和err三个成员变量,分别代表标准输入流(键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。
Random
Random类是一个专门用来生成一个伪随机数的类,这个类提供了两个构造函数,一个使用默认的种子,另一个需要程序员显示传入一个long型整数的种子。与Math类中的random方法生成的伪随机数不同的是,Math的random方法生成的伪随机数取值范围是[0,1.0),Random类不仅可以生成浮点数的伪随机数,还可以生成整数类型的伪随机数,还可以指定伪随机数的范围非常好用。查看API文档
常用方法
public int nextInt(int n)
该方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n。