用户和程序交互

  • Console 控制台

  • 使用 Scanner 获取键盘输入
  1. // System.in 代表标准输入,即键盘输入
  2. Scanner sc = new Scanner(System.in);
  3. // 返回输入源中下一行的字符串
  4. String line = sc.nextLine();

系统相关

  • 类方法
    • void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):从 源数组 src 的 srcPos 位置 复制元素到 目标数组 dest 的 destPos 位置,复制的数组元素的个数为 length
    • long 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)且内容不能为空("")
  1. // 判断字符串非空
  2. public static boolean hasLength(String str) {
  3. return str != null && str.trim().length() > 0;
  4. // return str != null && !"".equals(str.trim());
  5. // return str != null && !str.trim().isEmpty();
  6. }
  • 从 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,字符序列相等时,结果才为 true boolean 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 子串替换成 replacement intern():如果在常量池中已经包含一个等于此 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),如果无法表示准确的商值,则抛出 ArithmeticException
    • BigDecimal 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 字符串中反斜杠本身需要转义,因此两个反斜杠(\)实际上相当于一个(前一个用于转义)
  1. // Java 的转义符包括
  2. \b \t \n \f \r \" \' \\

正则表达式
图 2 正则表达式

  • boolean matches(String regex):判断该字符串是否匹配给定的正则表达式,如手机号码:"^[1][3456789][0-9]{9}$""^1[3-9]\d{9}$"(第一个反斜线表示转义)
  • String replaceAll(String regex, String replacement):将该字符串中所有匹配 regex 的子串替换成 replacement
  • String[] split(String regex):以 regex 作为分隔符,把该字符串分割成多个子串


Pattern 和 Matcher