第五章 Java中的常用类
5.1 String类与StringBuffer类
都位于Java.lang包中,不需要导包就可以直接使用
5.1.1 String类的初始化
-
使用字符串常量直接初始化一个String对象
String 变量名 = 字符串;
-
使用String的构造方法初始化字符串对象
String 变量名 = new String(字符串);
String 类的常用构造方法
方法声明 | 功能描述 |
---|---|
String() | 创建一个内容为空的字符串 |
String(String value) | 根据指定的字符串内容创建对象 |
String(char[] value) | 根据指定的字符数组创建对象 |
连接字符串可以通过运算符+来实现,在Java中,如果+的两边操作数有一个为String类型,那么+就表示字符串连接运算符。
5.1.2 String类的常见操作
字符串的基本操作
方法声明 | 功能描述 |
---|---|
int length() | 返回此字符串的长度 |
char charAt(int index) | 返回字符串中index位置上的字符,其中index的取值范围是:0~(字符串长度-1) |
int indexOf(int ch) | 返回指定字符在此字符串中第一次出现处的索引 |
int lastIndexOf(int ch) | 返回指定字符在此字符串中最后一次出现处的索引 |
int indexOf(String str) | 返回指定子字符串在此字符串中第一次出现处的索引 |
int lastIndexOf(String str) | 返回指定子字符串在此字符串中最后一次出现处的索引 |
字符串的转换操作
方法声明 | 功能描述 | |
---|---|---|
String toLowerCase() | 使用默认语言环境的规则将String中的所有字符都转换为小写 | |
String toUpperCase() | 使用默认语言环境的规则将String中的所有字符都转换为大写 | |
static String valueOf(int i) | 返回int参数的字符串表示形式 | |
char[] toCharArray() | 将此字符串转换为一个字符数组 |
字符串的替换和去除空格操作
方法声明 | 功能描述 | |
---|---|---|
String trim() | 返回一个新字符串,它去除了原字符串首尾的空格 | |
String replace(CharSequence oldstr,CharSequence newstr) | 返回一个新的字符串,它是通过用newstr替换字符串中出现的所有oldstr得到的 |
trim()方法只能去除两端的空格,不能去除中间的空格。若想去除字符串中间的空格,则可以通过String类的replace()方法来实现。
字符串的判断操作
方法声明 | 功能描述 | |
---|---|---|
boolean startsWith(String prefix) | 判断此字符串是否以指定的字符串开始 | |
boolean endsWith(String suffix) | 判断此字符串是否以指定的字符串结尾 | |
boolean contains(CharSequence cs) | 判断此字符串中是否包含指定的字符序列 | |
boolean isEmpty() | 当且仅当字符串长度为0时返回true | |
boolean equals(Object anObject) | 将此字符串与指定的字符串比较 |
在程序中可以用==和equals()两种方式对字符串进行比较,但两者有区别。equals()方法用于比较两个字符串中的字符值是否相等,==方法用于比较两个字符串对象的内存地址是否相同。
字符串的截取和分割
方法声明 | 功能描述 | |
---|---|---|
String[] split(String regex) | 根据参数regex(regex是一个正则表达式,用来限定分隔规则)将字符串分割为若干个子字符串 | |
String substring(int beginIndex) | 返回一个新字符串,它包含从指定的beginIndex起始角标处开始,直到此字符串末尾的所有字符 | |
String substring(int beginIndex,int endIndex) | 返回一个新字符串,它包含从指定的beginIndex起始角标处开始,直到索引endIndex-1角标处的所有字符 |
5.1.3 StringBuffer类
在Java中,由于String类型是final类型的,所以使用String定义的字符串是一个常量,它一旦创建,其内容和长度是不可改变的。StringBuffer类(字符串缓存区)类似于一个字符容器,当在其中添加或删除字符时,所操作的都是这个字符容器,并不会产生新的StringBuffer对象。
方法声明 | 功能描述 | |
---|---|---|
StringBuffer append(char c) | 添加字符到StringBuffer对象中末尾 | |
StringBuffer insert(int offset,String str) | 在StringBuffer对象中的offset位置插入字符串str | |
StringBuffer deleteCharAt(int index) | 移除StringBuffer对象中指定位置的字符 | |
StringBuffer delete(int start,int end) | 删除StringBuffer对象中指定范围的字符或字符串 | |
StringBuffer replace(int start,int end,String s) | 将StringBuffer对象中指定范围的字符或字符串用新的字符串s进行替换 | |
void setCharAt(int index,char ch) | 修改指定位置index处的字符 | |
String toString() | 返回StringBuffer缓冲区中的字符串对象 | |
StringBuffer reverse() | 将此StringBuffer对象用其反转形式取代 |
StringBuffer对象的delete()方法用于删除指定位置的字符,包含起始索引,不包含结束索引。
StringBuffer类和String类的区别:
- String类定义的字符串是常量,一旦创建后,内容和长度无法更改。StringBuffer表示字符容器,其内容和长度可以随时更改。
- String类重写了Object类的equals()方法,而StringBuffer类没有重写Object类的equals()方法。
- String类对象可以用操作符+进行连接,而StringBuffer对象之间不能
StringBuilder与StringBuffer功能相似,但StringBuffer是线程安全的,而StringBuilder没有实现线程安全功能,所以性能略高。
5.2 System类与Runtime类
5.2.1 System类
System类定义了一些与系统相关的属性和方法,它所提供的属性和方法都是静态的,想要引用这些属性和方法可以直接调用System类。
System类的常用方法:
方法声明 | 功能描述 | |
---|---|---|
static void exit(int status) | 该方法用于终止当前正在运行的Java虚拟机,其中参数status表示状态码,若状态码非0,则表示异常终止 | |
static void gc() | 运行垃圾回收器,并对垃圾进行回收 | |
static native long currentTimeMillis() | 返回以毫秒为单位的当前时间 | |
static void arraycopy(Object src,int srcPos,Object dest,int destPos,int length) | 从src引用的指定原数组拷贝到dest引用的数组,拷贝从指定的位置开始,到目标数组的指定位置结束 | |
static Properties getProperties() | 取得当前的系统属性 | |
static String getProperty(String key) | 获取指定键描述的系统属性 |
-
getProperties()方法
获取当前系统的全部属性,包括虚拟机版本号、用户的国家、操作系统的版本等
-
currentTimeMillis()
返回一个long类型的值,该值表示当前时间与1970年1月1日0点0分0秒之间的时间差,单位是毫秒,通常也称为时间戳
-
arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
将一个数组中的元素快速拷贝到另一个数组
- src:原数组
- dest:目标数组
- srcPos:表示原数组中拷贝元素的起始位置
- destPos:表示拷贝到目标数组的起始位置
- length:拷贝元素的个数
5.2.2 Runtime类
-
Runtime类用于表示Java虚拟机运行时的状态,它用于封装 Java虚拟机进程。每次使用java命令启动Java虚拟机时都会对应一个Runtime实例,并且只有一个实例,应用程序会通过该实例与其运行时的环境相连。应用程序不能创建自己的Runtime实例,若想在程序中获得一个Runtime实例,可以通过getRuntime()方法获取与之相关的Runtime对象。具体方式如下:
Runtimert=Runtime.getRuntime();
-
通过该实例对象调用availableProcessors()方法、freeMemory()方法和maxMemory()方法,可以将当前虚拟机的处理器个数、空闲内存数和可用最大内存数的信息打印出来。
-
Runtime类中提供了一个exec()方法,该方法用于执行一个DOS命令,从而实现和在命令行窗口中输入DOS命令同样的效果。它会返回一个Process对象,该对象表示操作系统的一个进程,通过该对象可以对产生的新进程进行管理,如关闭此进程只需调用destroy()方法即可。
-
Thread类的静态方法sleep(long millis)可以使程序休眠。
5.3 Math类与Random类
5.3.1 Math类
Math类中的所有方法都是静态方法,可以直接通过类名调用round()方法用于对某个小数进行四舍五入,此方法将小数点后的数字全部忽略,返回一个int类型的数,而ceil()方法(向上取整)和floor()方法(向下取整)返回的都是double类型的数,这个数在数值上等于一个整数。
5.3.2 Random类
在JDK的java.util包中,有一个Random类,它可以在指定的取值范围内随机产生数字。
Random的构造方法
方法声明 | 功能描述 | |
---|---|---|
Random() | 用于创建一个随机数生成器,每次实例化Random对象会生成不同的随机数 | |
Random(long seed) | 使用一个long型的seed(种子)创建伪随机数生成器,当seed相同时,每次实例化Randon对象会生成相同的随机数 |
Random的常用方法
方法声明 | 功能描述 | |
---|---|---|
boolean nextBoolean() | 随机生成boolean类型的随机数 | |
double nextDouble() | 随机生成double类型的随机数 | |
float nextFloat() | 随机生成float类型的随机数 | |
int nextInt() | 随机生成int类型的随机数 | |
int nextInt(int n) | 随机生成[0,n)之间int类型的随机数 | |
long nextLong() | 随机生成long类型的随机数 |
5.4 包装类
包装类可以将基本数据类型的值包装为引用数据类型的对象。
基本类型对应的包装类
基本数据类型 | 对应的包装类 | 基本数据类型 | 对应的包装类 | |
---|---|---|---|---|
byte | Byte | long | Long | |
char | Character | float | Float | |
int | Integer | double | Double | |
short | Short | boolean | Boolean |
包装类和基本数据类型在进行转换时,引入了自动装箱和自动拆箱的概念,其中自动装箱是指将基本数据类型的变量赋给对应的包装类变量;反之,拆箱是指将包装类对象类型直接赋给一个对应的基本数据类型变量。
-
通过引用数据类型字符串String类的valueOf()方法可以将8种基本数据类型转换为对应的字符串类型
-
通过8种包装类的静态方法valueOf()既可以将对应的基本数据类型转换为包装类,也可以将变量内容匹配的字符串转换为对应的包装类(Character包装类除外)
-
通过8种包装类的有参构造方法同样既可以将对应的基本数据类型转换为包装类,也可以将变量内容匹配的字符串转换为对应的包装类(Character包装类除外)
-
通过8种包装类的静态方法parseXxx()可以将变量内容匹配的字符串转换为基本数据类型
-
包装类都重写了Object类中的toString()方法,以字符串的形式返回被包装的基本数据类型的值
- 除了Character外,包装类都有valueOf(String s)方法,可以根据String类型的参数创建包装类对象,但参数字符串s不能为null,而且字符串必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运行时会报错。
- 除了Character外,包装类都有parseXxx(String s)的静态方法,将字符串转换为对应的基本类型的数据。参数s不能为null,而且同样必须是可以解析为相应基本类型的数据,否则虽然编译通过,但运行时会报错。
5.5 日期与时间类
5.5.1 Date类
Date():用来创建当前日期时间的Date对象
Date(long date):用于创建指定时间的Date对象,其中date参数表示1970年1月1日0时0分0秒(称为历元)以来的毫秒数,即时间戳。
5.5.2 Calendar类
Calendar类是一个抽象类,不可以被实例化,在程序中需要调用其静态方法getInstance()来得到一个Calendar对象,然后才能调用其相应的方法,具体示例如下:
Calendar calendar=Calendar.getInstance();
Calendar的常用方法
方法声明 | 功能描述 | |
---|---|---|
int get(int field) | 返回指定日历字段的值 | |
void add(int field,int amount) | 根据日历规则,为指定的日历字段增加或减去指定的时间量 | |
void set(int field,int value) | 为指定日历字段设置指定值 | |
void set(int year,int month,int date) | 设置Calendar对象的年、月、日三个字段的值 | |
void set(int year,int month,int date,int hourOfDay,int minute,int second) | 设置Calendar对象的年、月、日、时、分、秒六个字段的值 |
-
Calendar.MONTH字段,月份的起始值是从0开始的
-
Calendar有两种解析日历字段的模式:容错模式(lenient)与非容错模式(non-lenient)。
5.5.3 JDK8 的日期与时间类
JDK8 的日期、时间常用类
类名 | 功能描述 | |
---|---|---|
Clock | 用于获取指定时区的当前日期、时间 | |
DayOfWeek | 枚举类,定义了一周七天周一到周日的枚举值 | |
Duration | 表示持续时间。该类提供的ofXxx()方法用于获取指定的时间的小时、分钟、秒数等 | |
Instant | 表示一个具体时刻,可以精确到纳秒。该类提供了静态的now()方法来获取当前时刻,提供了静态的now(Clock clock)方法来获取clock对应的时刻。同时还提供了一系列的plusXxx()方法来获取当前时刻基础上加上一段时间,以及一系列的minusXxx()方法在当前时刻基础上减去一段时间 | |
LocalDate | 表示不带时区的日期,如2018-01-27.该类提供了静态的now()方法来获取当前日期,提供了静态的now(Clock clock)方法来获取clock对应的日期。同时还提供了一系列的plusXxx()方法在当前时间基础上加上几年、几月、几日等,以及一系列的minusXxx()方法在当前时间基础上减去几年、几月、几日等 | |
LocalTime | 表示不带时区的时间,如14:20:49.该类提供了静态的now()方法来获取当前时间,提供了静态的now(Clock clock)方法来获取clock对应的时间。同时还提供了一系列的plusXxx()方法在当前时间基础上加上几小时、几分、几秒等,以及一系列的minusXxx()方法在当前年份基础上减去几小时、几分、几秒等 | |
LocalDateTime | 表示不带时区的日期、时间。该类提供了静态的now()方法来获取当前日期、时间,提供了静态的now(Clock clock)方法来获取clock对应的日期、时间。同时还提供了一系列的plusXxx()方法在当前年份基础上加上几年、几月、几日、几小时、几分、几秒等,以及一系列的minusXxx()方法在当前年份、时间基础上减去几年、几月、几日、几小时、几分、几秒等 | |
Month | 枚举类,定义了一月到十二月的枚举值 | |
MonthDay | 表示月日,如—01-07.该类提供了静态的now()方法来获取当前月日,提供了静态的now(Clock clock)方法来获取clock对应的月日 | |
Year | 表示年,如2018.该类提供了静态的now()方法来获取当前年份,提供了静态的now(Clock clock)方法来获取clock对应的年份。同时还提供了plusYears()方法在当前年份基础上增加几年,以及minusYears()方法在当前年份基础上减去几年 | |
YearMonth | 表示年月,如2018-01.该类提供了静态的now()方法来获取当前年月,提供了静态的now(Clock clock)方法来获取clock对应的年月。同时还提供了plusXxx()方法在当前年月基础上增加几年、几月,以及minusXxx()方法在当前年月基础上减去几年、几月 | |
ZoneId | 表示一个时区 | |
ZonedDateTime | 表示一个时区化的日期、时间 |
5.6 格式化类
5.6.1 DateFormat类
是一个抽象类。
DateFormat的常用方法
方法声明 | 功能描述 | |
---|---|---|
static DateFormat getDateInstance() | 用于创建默认语言环境和格式化风格的日期格式器 | |
static DateFormat getDateInstance(int style) | 用于创建默认语言环境和指定格式化风格的日期格式器 | |
static DateFormat getDateTimeInstance() | 用于创建默认语言环境和格式化风格的日期/时间格式器 | |
static DateFormat getDateTimeInstance(int dateStyle,int timeStyle) | 用于创建默认语言环境和指定格式化风格的日期/时间格式器 | |
String format(Date date) | 将一个Date格式化为日期/时间字符串 | |
Date parse(String source) | 将给定字符串解析成一个日期 |
四个常量值:FULL、LONG、MEDIUM、SHORT
FULL常量用于表示完整格式;LONG常量用于表示长格式;MEDIUM常量用于表示普通格式;SHORTL常量用于表示短格式
5.6.2 SimpleDateFormat类
是DateFormat类的子类,可以使用new关键字创建实例对象,用于格式化日期、解析字符串。
5.6.3 DateTimeFormatter类
功能相当于DataFormat和SimpleDateFormat的合体,它不仅可以将日期、时间对象格式化成字符串,还能将特定格式的字符串解析成日期、时间对象。
获取DateTimeFormatter对象的3种方式:
- 使用静态常量创建DateTimeFormatter格式器
- 使用不同风格的枚举值来创建DateTimeFormatter格式器
- 根据模式字符串创建DateTimeFormatter格式器
完成日期、时间格式化
-
调用DateTimeFormatter的format(TemporalAccessor temporal)方法执行格式化,其中参数temporal是一个TemporalAccessor类型接口,其主要实现类有LocalDate、LocalDateTime
-
调用LocalDate、LocalDateTime等日期、时间对象的format(DateTimeFormatter formatter)方法执行格式化
解析字符串
通过parse(CharSequence text,DateTimeFormatter formatter)方法来实现