一、用户输入类Scanner
Scanner类用于获取用户输入,包含在java.util包中。
常用方法有:
详见Java基础语法学习(四、键盘输入和流程控制语句)
二、Java枚举
枚举是一个特殊的类,用于表示一组常量。使用关键字enum
。
eg.定义并访问枚举
enum Level {
LOW,
MEDIUM,
HIGH
}
Level myVar = Level.MEDIUM;
三、Java的时间与日期
1. 国际标准ISO 8601
国际标准化组织的国际标准ISO 8601是日期和时间的表示方法。
ISO 8601规定的时间日期格式如下:
日期:yyyy-MM-dd
时间:HH:mm:ss
带毫秒的时间:HH:mm:ss.SSS
日期和时间:yyyy-MM-dd’T’HH:mm:ss
带毫秒的日期和时间:yyyy-MM-dd’T’HH:mm:ss.SSS
2. 两套操作时间的API
java.util包提供了Date、Calendar、TimeZone
这几个类来处理时间,java8之后,在java.time中又引入了LocalDateTime、ZonedDateTime、ZoneId
等类来处理时间。有两套API是因为旧的API中有些许问题,因此引入新的API。
新的API包含所有旧API中的操作,并且严格区分了时刻、本地日期、本地时间和带时区的日期时间,以及对日期时间的运算更加方便。
3. LocalDateTime、LocalDate、LocalTime
(1)获取当前时间与获取自定义时间
本地日期和时间通过now()
获取到的是当前时区的时间,通过of()
函数,可以输入指定的日期和时间(分参数输入),通过parse()
函数可以将ISO 8601标准的字符串转化为时间类型。
eg. 获取本地当前日期和时间,以及两种方式为不同类赋予时间。
import java.time.*;
public class Time {
public static void main(String[] args) {
LocalDate d = LocalDate.now(); // 当前日期
LocalTime t = LocalTime.now(); // 当前时间
LocalDateTime dt = LocalDateTime.now(); // 当前日期和时间
System.out.println("当前日期为"+d); // 严格按照ISO 8601格式打印
System.out.println("当前时间为"+t); // 严格按照ISO 8601格式打印
System.out.println("当前日期和时间为"+dt); // 严格按照ISO 8601格式打印
LocalDate myD=LocalDate.of(2020,12,1);//必须把年月日都输入
LocalTime myT=LocalTime.of(23,14,15,10);//秒和毫秒为可选输入
LocalDateTime myDt=LocalDateTime.of(2020,12,11,12,20);//秒和毫秒均为可选输入
LocalDateTime myDt1=LocalDateTime.parse("2020-12-10T10:10");
System.out.println("我输入的日期为"+myD); // 严格按照ISO 8601格式打印
System.out.println("我输入的时间为"+myT); // 严格按照ISO 8601格式打印
System.out.println("我输入的日期时间为"+myDt); // 严格按照ISO 8601格式打印
System.out.println("我输入的字符串形式的日期时间为"+myDt1); // 严格按照ISO 8601格式打印
}
}
运行结果
(2)对时间的加减操作
eg. 对日期和时间的加减操作
import java.time.*;
import java.time.format.DateTimeFormatter;
/**
* 对时间的加减操作
*/
class TimeOp{
public static void main(String[] args) {
LocalDateTime dt = LocalDateTime.of(2019, 10, 26, 20, 30, 59);
//将输入的时间标准化
System.out.println(dt);
// 加6天减3小时:
LocalDateTime dt2 = dt.plusDays(6).minusHours(3);
System.out.println(dt2); // 2019-10-31T17:30:59
// 加2月:
LocalDateTime dt3 = dt2.plusMonths(2);
System.out.println(dt3); // 2019-09-30T17:30:59
}
}
运行结果
4. DateTimeFormatter
该类用于自定义时间输出格式,或者把非ISO 8601格式的字符串解析为LocalDateTime
类型。
eg. 自定义时间格式以及用将自定义时间格式的时间转换为标准时间格式
import java.time.*;
import java.time.format.DateTimeFormatter;
/**
* 测试非标准格式下的时间输入与输出
*/
class MyTime {
public static void main(String[] args) {
// 自定义格式化:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
System.out.println("用自定义格式输出时间"+dtf.format(LocalDateTime.now()));
// 用自定义格式解析:
LocalDateTime dt2 = LocalDateTime.parse("2019/11/30 15:16:17", dtf);
System.out.println("将自定义格式解析为标准格式时间"+dt2);
}
}
运行结果
四、字符串String
String是一个引用类型,本身也是一个class,是不可变的。即一旦被创建并初始化,内部状态数据保持不变。若对字符串对象进行数据改变,其实是改变了引用,指向了一个新建的对象。
1. 初探String的不可变
安全性:字符串广泛用于java系统中的参数,如账号密码、文件处理等。若这些被修改,会导致严重的安全威胁。
字符串池的要求:字符串池(字符串特定池)是方法区域中的一个特殊存储区域。当创建字符串时,如果字符串已经存在于池中,则将返回现有字符串的引用,而不是创建新对象,便于重用。可以让JVM减少额外的内存分配操作,可提升性能和节约内存。
2. String类中常用方法
(1)判断字符串是否相等
equals(): 用来判别字符串是否相等,区分大小写。
equalsIgnoreCase(): 用来判别字符串是否相等,忽略大小写。
note:== 与 equals()
==比较的是内存地址,而equals()比较的是两个字符串内容是否相等。
(2)对子串的操作
contains(): 判断字符串中是否包含某子串。
indexOf(): 返回首个子串起始下标,若不包含返回-1。
lastIndexOf(): 返回最后一个子串起始下标,若不包含返回-1。
substring(): 提取子串,括号内输入想截取下标的首尾下标。
replace(): 用新的子串替换子串。
replaceAll(): 利用正则表达式来替换子串。
eg1. 获取文件后缀
String oldName = "2020.08.31.jpg";
String last = oldName.substring(oldName.lastIndexOf("."), oldName.length());
System.out.println(last);
运行结果:
(3)首尾空白
trim(): 移除字符串首尾空白字符(\t \r \n)
strip(): 移除字符串首尾空白字符(\t \r \n \u300-中文空格)
isEmpty(): 判断字符串是否为空,有空白字符不算空。
isBlank(): 判断字符串是否为空,有空白字符也算空。
+ :直接将两个字符串拼接。
(4)字符串内容操作
toUpperCase(): 将字符串内容全部大写
split(): 分割字符串为字符串数组
join(): 拼接字符串数组为一个字符串
eg1. 拼接字符串
String[] name1 = {"Bob", "Alice", "Grace"};
String namess = String.join(", ", name1);
System.out.println(namess);
运行结果:
eg2. 分割字符串
String sp = "A,B,C,D";
String[] ss = sp.split(",");
for (String string:ss)
{
System.out.println(string);
}
运行结果
(5)类型转换
String.valueOf(): 将任意类型转换为字符串。
Integer.parseInt(): 将字符串类型转换为int类型。
Boolean.parseBoolean(): 将字符串类型转换为boolean类型。
toCharArray(): 将字符串类型转换为字符数组。
note:
若要将字符数组转换为字符串,可用
String s = new String(myCharArray);
转换后,更改字符数组不会影响字符串。
也可用String.valueOf()
,但是不可用toString()
,用该方法是对char[]地址的操作。
3. StringBuilder类
“+” 可以直接拼接字符串,但是不够高效,需要不断创建新的字符串对象,然后丢弃旧的字符串对象,造成内存浪费,影响GC效率。因此使用StringBuilder
,它可以预分配缓冲区,往StringBuilder
中新增字符,不会创建新的临时对象。
eg. 利用StringBuilder类拼接字符串和+操作符拼接字符串时间对比
StringBuilder sb = new StringBuilder(1024);
/** 获取当前系统时间*/
long startTime = System.nanoTime();
for (int i = 0; i < 1000; i++) {
sb.append(',');
sb.append(i);
}
String s = sb.toString();
/** 获取当前的系统时间,与初始时间相减就是程序运行的毫秒数,除以1000就是秒数*/
long endTime = System.nanoTime();
long usedTime = (endTime - startTime);
System.out.println("mrj2"+usedTime+s);
String s9="";
/** 获取当前系统时间*/
long startTime1 = System.nanoTime();
for(int i=0;i<1000;i++)
{
s9 = s9 + "," + i;
}
/** 获取当前的系统时间,与初始时间相减就是程序运行的毫秒数,除以1000就是秒数*/
long endTime1 = System.nanoTime();
long usedTime1 = (endTime - startTime);
System.out.println("mrj1"+usedTime1+s9);
运行结果
可发现,使用StringBuilder拼接字符串是非常节约时间的。
4. StringJoiner
专门用于利用分隔符拼接数组
用法: StringJoiner(delimiter,prefix,suffix)
其中delimiter 是分隔符 , prefix 是前缀 , suffix是后缀(前缀后缀是指字符串的开头和结尾)
eg. 利用StringJoiner拼接有分隔符的字符串
String[] names = {"Bob", "Alice", "Grace"};
StringJoiner sj = new StringJoiner(", ", "Hello ", "!");
for (String name : names) {
sj.add(name);
}
System.out.println(sj.toString());
运行结果
note: 若拼接的有分隔符字符串无前后缀,用String.join方法更加合适。
5. StringBuffer
类似于StringBuilder,对字符串进行操作可以不创建新对象,在原内存上进行修改。
(1)字符串拼接
append()函数
(2)字符串反转
reverse()函数
note: 反转是原地反转,想要不改变原字符串次序的反转,需要先把原字符串赋值给新的StringBuffer再反转。
(3)将StringBuffer转换为String
toString()函数
(4)示例
StringBuffer str=new StringBuffer();
// 将要拼接的部分放到字符串末尾
str.append("123");
System.out.println(str);
// 反转字符串
str.reverse();
System.out.println(str);
// 将StringBuffer转换为String
String stt=str.toString();
System.out.println(stt);
五、关于数字的操作
1. 大整数与大小数
BigInteger
long型整数最大范围是64位,可以直接通过CPU指令计算,速度快。但是使用的整数范围超过了64位,就需要使用BigInteger
来模拟一个大整数。
BigDecimal
BigDecimal
可以表示任意大小且精度完全准确的浮点数。
2. 限制小数的位数
(1)为什么要限制
在java中浮点数的计算,结果不能精确显示。这是因为有些浮点数在计算机中用二进制无法精确表示。例如0.1,二进制是一个无限循环小数。
因此进行简单的浮点数运算的时候,需要限制结果的位数,来达到得到精确结果的目的。
(2)DecimalFormat
我们可以使用DecimalFormat类来限制浮点数的位数,该类在包java.text内。
使用举例:
double result=(double)5.1-0.11;
DecimalFormat df = new DecimalFormat("#0.00");
System.out.println("不使用DecimalFormat: "+result);
System.out.println("使用DecimalFormat: "+df.format(result));