用户和程序交互
Console 控制台
- 使用 Scanner 获取键盘输入
// System.in 代表标准输入,即键盘输入
Scanner sc = new Scanner(System.in);
// 返回输入源中下一行的字符串
String line = sc.nextLine();
系统相关
- 类方法
void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:从 源数组 src 的 srcPos 位置 复制元素到 目标数组 dest 的 destPos 位置,复制的数组元素的个数为 lengthlong currentTimeMillis()
:获取系统当前时间(毫秒)(距离 1970 年 1 月 1 日 00:00:00 GMT)Properties getProperties()
:获取当前的系统属性String getProperty(String key)
:获取指定键指示的系统属性void exit(int status)
:终止 JVM(非 0 的状态码表示异常终止)(底层调用 Runtime 类中的方法)void gc()
:运行 GC(底层调用 Runtime 类中的方法)
Runtime
类方法Runtime getRuntime():获取与当前 Java 应用程序相关的运行时对象(单例模式)
实例方法
Process exec(String command)
:在单独的进程中执行指定的字符串命令,返回一个新的 Process 对象void exit(int status)
:终止 JVM(非 0 的状态码表示异常终止)void gc()
:运行 GC
Object 类
Object 是所有类、数组、枚举类的父类,所有对象(包括数组)都实现这个类的方法
Object 类的常见方法
protected void finalize()
:在对象被垃圾收集前调用此方法Class getClass()
:返回当前对象的运行时类型(该方法使用了 final 修饰,不能被覆写)int hashCode()
:返回当前对象的 hashCode 值,hashCode 决定了对象在哈希表中的存储位置boolean equals(Object obj)
:判断指定对象与该对象是否相等- equals 方法,判断标准和 == 相同,都是比较对象的引用地址
- 如果需要比较对象的内容,子类应该覆盖 equals 方法
- 基本数据类型只能使用 == 比较
String toString()
:返回该对象的字符串表示System.out.println(obj);
// 等价于System.out.println(obj.toString());
- 如果需要打印对象的内容,子类应该覆盖 toString 方法
Object clone()
:创建并返回此对象的一个副本,使用此对象相应字段的内容初始化副本的所有字段(浅表复制)wait()
、notify()
、notifyAll()
(这些方法都使用了 final 修饰,不能被覆写)
字符串
- 本质:char[] value
- CharSequence 接口常用的三个实现类:String StringBuffer StringBuilder
- 分类
- String 类创建的、字符序列不可变的的字符串对象
- StringBuffer 类或 StringBuilder 类创建的、字符序列可变的字符串对象
String
String 是最终类、不可变类,
final char[] value
注意:String 重写了 equals()、hashCode() 方法
对象的创建
- 字符串非空:引用不能为空(null)且内容不能为空("")
// 判断字符串非空
public static boolean hasLength(String str) {
return str != null && str.trim().length() > 0;
// return str != null && !"".equals(str.trim());
// return str != null && !str.trim().isEmpty();
}
从 Java 7 开始,switch 也支持操作 String 类型的字符串对象底层使用了 hashCode() 来进行 switch,然后通过 equals() 方法进行验证
在 Java 中,通过使用 "+" 符号来串联字符串时,实际上底层会转成通过 StringBuilder 实例的 append() 方法来实现
- 常用构造器 String(byte[] bytes, int offset, int length, String charsetName):使用指定的字符集将 byte[] 数组从 offset 开始、长度为 length 的子数组解码成字符串(构造器声明上抛出了异常) String(char[] value, int offset, int count):将字符数组从 offset 开始、长度为 count 的字符元素连缀成字符串
- String 转数组
byte[] getBytes()
:使用平台的默认字符集将此 String 编码为 byte 数组byte[] getBytes(String charsetName)
:使用指定的字符集将此 String 编码为 byte 数组(方法声明上抛出了异常)char[] toCharArray()
:将字符串转换为 char 数组 - 获取字符串信息(StringBuilder 类中也有)
int length()
:返回该字符串的长度char charAt(int index)
:返回指定索引处的 char 值int indexOf(String str)
:返回子串在该字符串中第一次出现处的索引int lastIndexOf(String str)
:返回子串在该字符串中最后一次出现处的索引boolean isEmpty()
:当且仅当 length() 为 0 时返回 true - 字符串比较判断
boolean equals(Object anObject)
:字符串比较,当指定对象不为 null,且类型为 String,字符序列相等时,结果才为 trueboolean equalsIgnoreCase(String anotherString)
:字符串比较,忽略大小写boolean contentEquals(CharSequence cs)
:字符串比较,当它们包含的字符序列相同时返回 true - 字符串大小写转换
String toUpperCase()
:把当前字符串转换为大写String toLowerCase()
:把当前字符串转换为小写 - 其它
boolean startsWith(String prefix)
:判断此字符串是否以指定的前缀开始 :判断此字符串是否以指定的后缀结束String substring(int start, int end)
:返回该字符串的一个子串 [start, end)(StringBuilder 类中也有)String trim()
:返回移除了前导和尾部空白的子串String replace(CharSequence target, CharSequence replacement)
:将该字符串中所有的 target 子串替换成 replacementintern()
:如果在常量池中已经包含一个等于此 String 对象的字符串,则返回在常量池中的引用;否则,将此 String 对象添加到常量池中,再返回在常量池中的引用(jdk1.7 将字符串常量池从方法区中移到了堆中,所以如果在常量池找不到对应的字符串,则不会再将字符串拷贝到常量池,而只是在常量池中生成一个对原字符串的引用)IntStream chars()
:List<Character> characterList = "StringToList".chars().mapToObj(c -> (char) c).collect(Collectors.toList());
- 类方法
String valueOf(X x)
:将基本类型值转换为字符串String valueOf(Object obj)
:返回 obj 对象的字符串表示形式(返回 obj.toString() 的值)String format(String format, Object… args)
:使用指定的格式字符串(包含格式说明符,语法%[argument_index$][flags][width][.precision]conversion
,如%s
,%1$tY-%<tm-%<td %<tH:%<tM:%<tS
)和参数返回一个格式化字符串String join(CharSequence delimiter, CharSequence… elements)
:用一个分隔符将多个字符串连接起来String join(CharSequence delimiter, Iterable<? extends CharSequence> elements)
:用一个分隔符将集合中的字符串元素连接起来
StringBuffer 和 StringBuilder
- StringBuffer 和 StringBuilder 都可以创建字符序列可变的字符串对象,功能方法相同的,都是最终类,但 value 没有使用 final 修饰
- StringBuffer 类使用了 synchronized 修饰符,线程安全;
- StringBuilder 类没有使用 synchronized 修饰符,性能更高,但线程不安全(建议使用 StringBuilder)
- 两个属性:length(字符序列的长度)和 capacity(容量)
对象的创建
new StringBuilder()
:创建一个不带字符,初始容量为 16 个字符的字符串缓冲区new char[16]
new StringBuilder(int capacity)
:创建一个不带字符,指定初始容量的字符串缓冲区new StringBuilder(String str)
:构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容常用方法
StringBuilder append(Object obj)
:追加任意类型数据,return this;
追加 "null"StringBuilder deleteCharAt(int index)
:删除字符串中指定位置的字符StringBuilder insert(int offset, Object obj)
:将 Object 参数的字符串表示形式插入此字符序列中StringBuilder reverse()
:字符序列反转String toString()
:返回此序列中数据的字符串表示形式void setLength(int newLength)
:设置字符序列的长度(如果 newLength 参数小于当前长度,则长度将更改为指定的长度,如果 newLength 参数大于或等于当前长度,则将追加有效的 null 字符,使长度满足 newLength 参数)
数学
Math
- 基本数学运算,如初等指数、对数、平方根和三角函数等,随机数(都是类方法)
- 常量字段:E、PI
double random()
:返回带正号的 double 值(伪随机数),[0.0, 1.0)int min(int a, int b)
:返回两个数的较小值int max(int a, int b)
:返回两个数的较大值int toIntExact(long value)
:将 long 值转换为 int 值long round(double a)
、int round(float a)
:执行标准舍入,将数值四舍五入为最接近的整数double ceil(double a)
:执行向上舍入,将数值向上舍入为最接近的 double 值double floor(double a)
:执行向下舍入,将数值向下舍入为最接近的 double 值
- java.math 包中
- 不可变的、任意精度的有符号十进制数,用于处理金钱和精度要求高的数据
- 全局静态常量:ZERO、ONE、TEN、ROUND_HALF_UP(对应于 RoundingMode.HALF_UP)
- 除法
BigDecimal divide(BigDecimal divisor)
:返回一个 BigDecimal,其值为 (this / divisor),如果无法表示准确的商值,则抛出 ArithmeticExceptionBigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
:返回一个 BigDecimal,其值为 (this / divisor),要保留的小数位数 scale,舍入模式 roundingMode(如 RoundingMode.HALF_UP 表示四舍五入)BigDecimal setScale(int newScale, RoundingMode roundingMode)
,BigDecimal setScale(int newScale, int roundingMode)
:返回一个 BigDecimal,要保留的小数位数 newScale,舍入模式 roundingMode
BigInteger
- java.math 包中
- 不可变的、任意精度的整数
随机数
Random
- 使用种子创建随机数生成器,生成下一个伪随机数
- 构造器
Random()
:使用默认的种子创建一个随机数生成器对象(以当前系统时间作为种子)Random(long seed)
- 实例方法
int nextInt()
:返回一个伪随机整数,[0, int 最大值),类似还有返回 long、float [0.0, 1.0)、double [0.0, 1.0)、boolean 的方法int nextInt(int n)
:返回一个伪随机数,[0, n)IntStream ints(long streamSize, int randomNumberOrigin, int randomNumberBound)
:返回一个流,生成 streamSize 个 [randomNumberOrigin, randomNumberBound) 范围内的 int 值
ThreadLocalRandom
- Java 7 新增的 Random 的子类,相对于 Random 可以减少多线程资源竞争,保证了线程的安全性
其构造器是缺省访问权限
实例方法
int nextInt(int least, int bound)
:返回一个伪随机数,[least, bound),类似还有返回 long、double 的方法
UUID
结合机器的网卡、当地时间、一个随即数来生成 UUID(通用唯一标识符),UUID 是一个 128 位的值,一般用 16 进制表示
类方法
UUID randomUUID()
:获取 UUID 对象实例方法:返回表示此 UUID 的 String 对象,格式为:(8 个字符)-(4 个字符)-(4 个字符)-(4 个字符)-(12 个字符),字符范围:0~9,a~f
日期、时间
java.util 包中,表示特定的瞬间,精确到毫秒
构造器:Date()、Date(long date)
类方法
Date from(Instant instant)
:从 Instant 对象获取一个 Date 的实例实例方法
String toLocaleString()
:返回此日期的字符串表示形式(使用语言环境约定)(已过时)long getTime()
:返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此对象表示的毫秒数boolean equals(Object obj)
:比较两个日期的相等性boolean after(Date when)
:判断此日期是否在指定日期之后boolean before(Date when)
:判断此日期是否在指定日期之前
- jdk 1.8 的应用可以使用 Instant(代表一个具体的时刻)代替 Date
Calendar(抽象类)
int 类型的静态常量:YEAR, MONTH(第一个月为 0), DAY_OF_MONTH 或 DATE, DAY_OF_WEEK, HOUR_OF_DAY, MINUTE, SECOND
类方法
Calendar getInstance()
:基于当前时间,使用默认时区和语言环境获取一个 Calendar 对象实例方法
int get(int field)
:返回指定日历字段的值void set(int field, int value)
:将给定的日历字段设置为给定值void add(int field, int amount)
:根据日历的规则,为指定的日历字段添加或减去指定的时间量Date getTime()
:返回一个表示此 Calendar 时间值的 Date 对象void setTime(Date date)
:使用给定的 Date 设置此 Calendar 的时间boolean after(Object when)
:判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后boolean before(Object when)
:判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前boolean equals(Object obj)
- jdk1.8 的应用可以使用 LocalDateTime(代表不带时区的日期、时间)代替 Calendar
格式化
- java.text 包中
- Format,java.text 包中,一个用于格式化语言环境敏感的信息(如日期、消息和数字)的抽象基类
- 已知子类:DateFormat、MessageFormat、NumberFormat
MessageFormat
- 线程安全
- 类方法:
String format(String pattern , Object… arguments)
:返回后面的多个参数值填充前面的 pattern 字符串,其中 pattern 是一个带占位符的字符串
NumberFormat(抽象类)
- 格式化(format)和解析(parse)数值
- 线程不安全
- 实例方法:
String format(double number)
、String format(long number):格式化数值void setGroupingUsed(boolean newValue)
:设置此格式中是否使用分组void setMaximumIntegerDigits(int newValue)
:设置数的整数部分所允许的最大位数void setMinimumIntegerDigits(int newValue)
:设置数的整数部分所允许的最小位数void setMaximumFractionDigits(int newValue)
:设置数的小数部分所允许的最大位数void setMinimumFractionDigits(int newValue)
:设置数的小数部分所允许的最小位数void setParseIntegerOnly(boolean value)
:设置数是否应该仅作为整数进行解析void setRoundingMode(RoundingMode roundingMode)
:设置在此 NumberFormat 中使用的 RoundingModevoid setCurrency(Currency currency)
: 设置格式化货币值时此数值格式使用的货币
DateFormat / SimpleDateFormat
- 格式化(format)和解析(parse)日期或时间
- jdk 1.8 的应用可以使用 DateTimeFormatter(时间格式器)代替 DateFormat、SimpleDateFormat
int 类型的全局静态常量:SHORT、MEDIUM、LONG、FULL(分别表示四种样式)
类方法:
DateFormat getInstance()
:获取使用 SHORT 风格的默认日期格式器DateFormat getDateTimeInstance(int dateStyle, int timeStyle)
:获取日期使用 dateStyle 风格、时间使用 timeStyle 风格的日期/时间格式器
实例方法
String format(Date date)
:将 Date 格式化为日期/时间字符串Date parse(String source)
:解析字符串的文本,生成 Date(该方法声明抛出了 ParseException 异常)
- DateFormat 的子类,支持自定义日期-时间格式
- SimpleDateFormat、DateFormat 都是线程不安全的类
SimpleDateFormat 继承 DateFormat 类,DateFormat 类中维护了一个 Calendar 实例,Calendar 实例被用来计算日期-时间字段和时间实例,既被用于 format 方法也被用于 parse 方法(The Calendar instance used for calculating the date-time fields and the instant of time. This field is used for both formatting and parsing.)
图 1 日期和时间模式字母
构造器:SimpleDateFormat()、SimpleDateFormat(String pattern)
实例方法
void applyPattern(String pattern)
:将给定模式字符串应用于此日期格式,如 "yyyy-MM-dd E HH:mm:ss" 2017-10-07 星期六 17:55:54- 从类 DateFormat 继承的方法:
String format(Date date)
,Date parse(String source)
正则表达式
- 正则表达式(regex)是一个强大的字符串处理工具,主要用于匹配判断、分割操作、替换操作(网络爬虫)等
- 在正则表达式中有特殊含义的符号
\ + * ^ . ? $ | ( ) [ ] { }
- 由于 Java 字符串中反斜杠本身需要转义,因此两个反斜杠(\)实际上相当于一个(前一个用于转义)
// Java 的转义符包括
\b \t \n \f \r \" \' \\
boolean matches(String regex)
:判断该字符串是否匹配给定的正则表达式,如手机号码:"^[1][3456789][0-9]{9}$"
或"^1[3-9]\d{9}$"
(第一个反斜线表示转义)String replaceAll(String regex, String replacement)
:将该字符串中所有匹配 regex 的子串替换成 replacementString[] split(String regex)
:以 regex 作为分隔符,把该字符串分割成多个子串