Java基础部分查缺补漏-05:常用类&枚举

一、字符串相关的类

1、String 类及常用的方法

  • String 是一个 final 类,代表不可变的字符序列
  • 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
  • String 对象的字符内容是存储在一个字符数组 value[] 中的。
//源码
public final class String implements Serializable, Comparable<String>, CharSequence {
    @Stable
    private final byte[] value;
    private final byte coder;
    private int hash;
}
  • 常用方法:

方法

使用

int length()

返回字符串的长度: return value.length

char charAt(int index)

返回某索引处的字符

boolean isEmpty()

判断是否是空字符串

String toLowerCase()

使用默认语言环境,将 String 中的所有字符转换为小写

String toUpperCase()

使用默认语言环境,将 String 中的所有字符转换为大写

String trim()

返回字符串的副本,忽略前导空白和尾部空白

boolean equals(Object obj)

比较字符串的内容是否相同

boolean equalsIgnoreCase(String anotherString)

与equals方法类似,忽略大小写

String concat(String str)

将指定字符串连接到此字符串的结尾。 等价于用“+”

int compareTo(String anotherString)

比较两个字符串的大小

String substring(int beginIndex)

返回一个新的字符串,它是此字符串的从 beginIndex开始截取到最后的一个子字符串。

String substring(int beginIndex, int endIndex)

返回一个新字符串,它是此字 符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。

boolean endsWith(String suffix)

测试此字符串是否以指定的后缀结束

boolean startsWith(String prefix)

测试此字符串是否以指定的前缀开始

boolean startsWith(String prefix, int toffset)

测试此字符串从指定索引开始的子字符串是否以指定前缀开始

  • 查找元素索引的相关方法

boolean contains(CharSequence s)

当且仅当此字符串包含指定的 char 值序列s时,返回 true

int indexOf(String str)

返回指定子字符串在此字符串中第一次出现处的索引

int indexOf(String str, int fromIndex)

返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始

int lastIndexOf(String str)

返回指定子字符串在此字符串中最右边出现处的索引

int lastIndexOf(String str, int fromIndex)

返回指定子字符串在此字符串中最后 一次出现处的索引,从指定的索引开始反向搜索

注:indexOf和lastIndexOf方法如果未找到都是返回-1

  • 替换相关方法

String replace(char oldChar, char newChar)

返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。

String replace(CharSequence target, CharSequence replacement)

使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。

String replaceAll(String regex, String replacement)

使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串

String replaceFirst(String regex, String replacement)

使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串

  • 正则表达式有关方法

boolean matches(String regex)

告知此字符串是否匹配给定的正则表达式

String[] split(String regex)

根据给定正则表达式的匹配拆分此字符串。

String[] split(String regex, int limit)

根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。

2、String str1 = “abc”;与String str2 = new String(“abc”);的区别?

字符串常量存储在字符串常量池,目的是共享。

字符串非常量对象存储在堆中。

3、String的一些使用陷阱

  • String s1 = “a”; 字符串常量池中创建
  • s1 = s1 + “b”; 实际上原来的“a”字符串对象已经丢弃了,现在在堆空间中产生了一个字符串s1+“b”(也就是"ab")。
  • String s2 = “ab”; 字符串常量池中创建
  • String s3 = “a” + “b”;:s3指向字符串常量池中已经创建的"ab"的字符串。
  • String s4 = s1.intern(); 在调用intern()之后,会将常量池中已经存在的"ab"字符串 赋值给s4。

4、String与字符数组或字节数组的转换

  • 字符数组 —> 字符串 :String 类的构造器:String(char[]) 和 String(char[],int offset,int length)
  • 字符串 —> 字符数组 :
  • public char[] toCharArray():将从字符串中的全部字符复制到目标字符数组。。
  • public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin):提供了将指定索引范围内的字符串存放到数组中的方法。(dstBegin:目标数组中的起始偏移量)
  • 字节数组 —> 字符串 :String(byte[]) 、String(byte[],int offset,int length)
  • 字符串 —> 字节数组 :public byte[] getBytes() 、public byte[] getBytes(String charsetName)

5、StringBuffer类及其常用方法

java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符串内容进行增删,此时不会产生新的对象。

很多方法与String相同。 作为参数传递时,方法内部可以改变值。

//源码
public final class StringBuffer extends AbstractStringBuilder implements Serializable, Comparable<StringBuffer>, CharSequence {

}

abstract class AbstractStringBuilder implements Appendable, CharSequence {
    byte[] value; // value没有final声明,value可以不断扩容。
    byte coder;
    int count; // count记录有效字符的个数。
}
  • StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:
  • StringBuffer():初始容量为16的字符串缓冲区
  • StringBuffer(int size):构造指定容量的字符串缓冲区
  • StringBuffer(String str):将内容初始化为指定字符串内容
  • 常用方法:

**public int indexOf(String str)


**

序号

方法描述

1

public StringBuffer append(String s)

将指定的字符串追加到此字符序列。

2

public StringBuffer reverse()

 将此字符序列用其反转形式取代。

3

public delete(int start, int end)

移除此序列的子字符串中的字符。

4

public insert(int offset, int i)

int 参数的字符串表示形式插入此序列中。

5

insert(int offset, String str)

str 参数的字符串插入此序列中。

6

replace(int start, int end, String str)

使用给定 String 中的字符替换此序列的子字符串中的字符。

public String substring(int start,int end)

public int length()

public char charAt(int n )

public void setCharAt(int n ,char ch)

StringBuilder 和 StringBuffer 非常类似.

6、对比String、StringBuffer、StringBuilder

  • String(JDK1.0):不可变字符序列
  • StringBuffer(JDK1.0):可变字符序列、效率低、线程安全
  • StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全
    注意:作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder 会改变其值。

二、JDK8之前的日期时间API

三、JDK8中新日期时间API

Java 8中引入l java.time API

  • java.time – 包含值对象的基础包
  • java.time.chrono – 提供对不同的日历系统的访问
  • java.time.format – 格式化和解析时间和日期
  • java.time.temporal – 包括底层框架和扩展特性
  • java.time.zone – 包含时区支持的类

四、Java比较器

1. 自然排序:java.lang.Comparable

Comparable 接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序。

实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即 通过 compareTo(Object obj) 方法的返回值来比较大小。如果当前对象this大于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回负整数,如果当前对象this等于形参对象obj,则返回零。

  • Comparable 的典型实现:(默认都是从小到大排列的)
  • String:按照字符串中字符的Unicode值进行比较
  • Character:按照字符的Unicode值来进行比较
  • 数值类型对应的包装类以及BigInteger、BigDecimal:按照它们对应的数值大小进行比较
  • Boolean:true 对应的包装类实例大于 false 对应的包装类实例
  • Date、Time等:后面的日期时间比前面的日期时间大
2. 定制排序:java.util.Comparator

当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码, 或者实现了java.lang.Comparable接口的排序规则不适合当前的操作,那 么可以考虑使用 Comparator 的对象来排序,强行对多个对象进行整体排序的比较。

五、System类

System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。

由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实例化该类。其内部的成员变量和成员方法都是static的,所以也可以很方便的进行调用。

成员变量: System类内部包含in、out和err三个成员变量,分别代表标准输入流 (键盘输入),标准输出流(显示器)和标准错误输出流(显示器)。

常见方法:

  • native long currentTimeMillis(): 是返回当前的计算机时间,当前计算机时间和GMT时间(格林威治时间)1970年1月1号0时0分0秒所差的毫秒数。
  • void exit(int status): 退出程序。其中status的值为0代表正常退出,非零代表异常退出。
  • void gc(): 该方法的作用是请求系统进行垃圾回收。
  • String getProperty(String key): 该方法的作用是获得系统中属性名为key的属性对应的值。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nDzWiyIw-1624444632433)(C:\Users\Yuhome\AppData\Roaming\Typora\typora-user-images\image-20210608073117562.png)]

六、 Math类

java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回 值类型一般为double型。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sENl3iPM-1624444632443)(C:\Users\Yuhome\AppData\Roaming\Typora\typora-user-images\image-20210608073142666.png)]

七、BigInteger与BigDecimal

java.math包的BigInteger可以表示不可变的任意精度的整数。BigInteger 提供所有 Java 的基本整数操作符的对应物,并提供 java.lang.Math 的所有相关方法。 另外,BigInteger 还提供以下运算:模算术、GCD 计算、质数测试、素数生成、 位操作以及一些其他操作。

  • **构造器 : **
    BigInteger(String val):根据字符串构建BigInteger对象
  • 常用方法
  • public BigInteger abs():返回此 BigInteger 的绝对值的 BigInteger。
  • BigInteger add(BigInteger val) :返回其值为 (this + val) 的 BigInteger
  • BigInteger subtract(BigInteger val) :返回其值为 (this - val) 的 BigInteger
  • BigInteger multiply(BigInteger val) :返回其值为 (this * val) 的 BigInteger
  • BigInteger divide(BigInteger val) :返回其值为 (this / val) 的 BigInteger。整数 相除只保留整数部分。
  • BigInteger remainder(BigInteger val) :返回其值为 (this % val) 的 BigInteger。
  • BigInteger[] divideAndRemainder(BigInteger val):返回包含 (this / val) 后跟 (this % val) 的两个 BigInteger 的数组。
  • BigInteger pow(int exponent) :返回其值为 (thisexponent) 的 BigInteger

要求数字精度比较高,故用到java.math.BigDecimal类。

  • 构造器
  • public BigDecimal(double val)
  • public BigDecimal(String val)
  • 常用方法
  • public BigDecimal add(BigDecimal augend)
  • public BigDecimal subtract(BigDecimal subtrahend)
  • public BigDecimal multiply(BigDecimal multiplicand)
  • public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

八、枚举类

类的对象只有有限个,确定的。如:星期、性别等…

  • 枚举类的实现
  • JDK1.5之前需要自定义枚举类
  • JDK 1.5 新增的 enum 关键字用于定义枚举类

1、自定义枚举类

  1. 私有化类的构造器,保证不能在类的外部创建其对象
  2. 在类的内部创建枚举类的实例。声明为:public static final
  3. 对象如果有实例变量,应该声明为private final,并在构造器中初始化
class Season{ 
    private final String SEASONNAME;//季节的名称 
    private final String SEASONDESC;//季节的描述
    
    private Season(String seasonName,String seasonDesc){ 
        this.SEASONNAME = seasonName; 
        this.SEASONDESC = seasonDesc; 
    } 
    public static final Season SPRING = new Season("春天", "春暖花开"); 
    public static final Season SUMMER = new Season("夏天", "夏日炎炎"); 
    public static final Season AUTUMN = new Season("秋天", "秋高气爽"); 
    public static final Season WINTER = new Season("冬天", "白雪皑皑"); 
}

2、使用enum定义枚举类

  1. 使用 enum 定义的枚举类默认继承了 java.lang.Enum类,因此不能再 继承其他类
  2. 枚举类的构造器只能使用 private 权限修饰符
  3. 枚举类的所有实例必须在枚举类中显式列出(, 分隔 ; 结尾)。列出的 实例系统会自动添加 public static final 修饰
  4. 必须在枚举类的第一行声明枚举类对象
public enum SeasonEnum { 
    SPRING("春天","春风又绿江南岸"), 
    SUMMER("夏天","映日荷花别样红"), 
    AUTUMN("秋天","秋水共长天一色"), 
    WINTER("冬天","窗含西岭千秋雪");
    
    private final String seasonName; 
    private final String seasonDesc; 
    
    private SeasonEnum(String seasonName, String seasonDesc){ 
        this.seasonName = seasonName; 
        this.seasonDesc = seasonDesc; 
    } 
    public String getSeasonName() { 
        return seasonName; 
    } 
    public String getSeasonDesc() { 
        return seasonDesc; 
    }
}

3、Enum类的常用方法

java 字符串获取枚举类 java字符串转枚举类型_java 字符串获取枚举类

  • values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的 枚举值。
  • valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符 串必须是枚举类对象的“名字”。如不是,会有运行时异常: IllegalArgumentException。
  • toString():返回当前枚举类对象常量的名称

JDK 1.5 中可以在 switch 表达式中使用Enum定义的枚举类的对象 作为表达式, case 子句可以直接使用枚举值的名字,枚举类可以实现一个或多个接口。