一、String类

1、String类内部
字符串在String内部是通过一个char[]数组表示的,因此既可按照“…”的方式书写,也可按照以下方式书写。String是不可变对象,字符串操作不改变原字符串内容,而是返回新字符串。

String s2 = new String(new char[] {'H', 'e', 'l', 'l', 'o', '!'});

早期JDK的String类:

public final class String {
    private final char[] value;
    private final int offset;
    private final int count;
}

较新的JDK版本的String则以byte[]存储:

public final class String {
    private final byte[] value;
    private final byte coder; // 0 = LATIN1, 1 = UTF16

二、常见字符串方法

方法 格式 说明
比较 s.equals() 不能使用==
去除首尾空白 s.trim() 空白字符包括\t,\r,\n
去除首尾空白 strip() 除了trim去除的,还能去除类似中文的空格字符\u3000
是否为空 isEmpty() 字符串长度>0则返回false
是否为空白 isBlank() 只有空白字符(例如空格等)则返回true
替换 s.replace(旧的,新的)
分割字符串 s.split(分隔符) 返回String[]
拼接字符串 String.join(拼接符,字符串数组) 静态方法
格式化字符串 String.format(字符串,参数1,参数2…) String.format(“Hi %s, your score is %.2f!”, “Bob”, 59.5),不确定用啥占位符,那就始终用%s,因为%s可以显示任何数据类型
将其它类型转换为String String.valueOf() 编译器会根据参数自动选择合适的方法
字符串转整型 Integer.parseInt(“123”)
字符串转布尔型 Boolean.parseBoolean(“true”)
字符串转char[] “Hello”.toCharArray()
char[]转字符串 String s = new String(cs)
字符串转其它编码 byte[] b2 = “Hello”.getBytes(“UTF-8”); byte[] b2 = “Hello”.getBytes(“GBK”);

三、字符串编码

  • 最早期:美国国家标准学会(American National Standard Institute:ANSI)制定了一套英文字母、数字和常用符号的编码,它占用一个字节,编码范围从0到127,最高位始终为0,称为ASCII编码。
  • 为了解决一个字节不够编码的问题:汉字(GB2312标准)、日文(Shift_JIS编码)、韩文(EUC-KR编码)
  • 为了统一上述编码:全球统一码联盟发布了Unicode编码,它把世界上主要语言都纳入同一个编码,Unicode编码需要两个或者更多字节表示
  • UTF-8编码:因为英文字符的Unicode编码高字节总是00,包含大量英文的文本会浪费空间,所以,出现了UTF-8编码,它是一种变长编码,用来把固定长度的Unicode编码变成1~4字节的变长编码。UTF-8编码的另一个好处是容错能力强。如果传输过程中某些字符出错,不会影响后续字符,因为UTF-8编码依靠高字节位来确定一个字符究竟是几个字节,它经常用来作为传输编码。

四、StringJoiner

1、为什么使用

使用s=s+”str”拼接字符串时,会不断创新新对象,效率低。Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象。

2、语法

(1)基础语法

// 1.创建StringBuilder实例
StringBuilder sb = new StringBuilder(1024);
// 2.使用add拼接
for (int i = 0; i < 1000; i++) {
    sb.append(',');
    sb.append(i);
}
// 3.使用toString转为str
String s = sb.toString();

(2)链式操作

查看StringBuilder的内部逻辑,发现append方法返回自身,因此可以使用链式操作

public StringBuilder append(String str) {
super.append(str);
return this;
}

链式操作如下:

public static void main(String[] args) {
    var sb = new StringBuilder(1024);
    sb.append("Mr ")
      .append("Bob")
      .append("!")
      .insert(0, "Hello, ");
    System.out.println(sb.toString());
}

五、StringJoiner类

1、使用场景

拼接字符串

2、语法

public class Main {
    public static void main(String[] args) {
        String[] names = {"Bob", "Alice", "Grace"};
// 1.构造实例,参数依次是拼接符,前缀,结尾
        var sj = new StringJoiner(", ", "Hello ", "!");
        for (String name : names) {
            sj.add(name);
        }
        System.out.println(sj.toString()); // Hello,Bob,Alice,Grace!
    }
}

3.注意事项

如果没有前缀和后缀,可以直接使用String.join()

六、包装类型

1、是什么

基本类型对应的引用类型为包装类型,包装类型封装了很多实用方法。
例如,int对应Integer类,double对应Double

2、自动装箱和自动拆箱

int和Integer可以互相转换,

Integer n = 100; // 编译器自动使用Integer.valueOf(int)
int x = n; // 编译器自动使用Integer.intValue()

直接把int变为Integer的赋值写法,称为自动装箱(Auto Boxing),反过来,把Integer变为int的赋值写法,称为自动拆箱(Auto Unboxing)。装箱和拆箱会影响代码的执行效率,因为编译后的class代码是严格区分基本类型和引用类型的。
在创建Integer对象时,进行使用方法二,因为方法1总是创建新的Integer实例,方法2把内部优化留给Integer的实现者去做。Integer.valueOf()是静态工厂方法,它尽可能地返回缓存的实例以节省内存
方法1:Integer n = new Integer(100);
方法2:Integer n = Integer.valueOf(100);

3、注意事项

引用类型的毕竟必须使用equals而非==

七、枚举类enum

1、使用场景

定义有限类的同类型枚举

2、语法

(1)基础语法

必须使用enum关键词

public enum Color {
    RED, GREEN, BLUE;
}

上述代码被编译器翻译为:

public final class Color extends Enum { // 继承自Enum,标记为final class
    // 每个实例均为全局唯一:
    public static final Color RED = new Color();
    public static final Color GREEN = new Color();
    public static final Color BLUE = new Color();
    // private构造方法,确保外部无法调用new操作符:
    private Color() {}
}

(2)实例方法

每个枚举值其实为一个实例,因此有实例方法。

  • name():返回常量名
String s = Weekday.RED.name(); // "RED"
  • ordinal():返回定义的常量的顺序,从0开始计数。改变枚举常量定义的顺序就会导致ordinal()返回值发生变化,因此代码不健壮

(3)自定义构造方法

public class Main {
    public static void main(String[] args) {
        Weekday day = Weekday.SUN;
        if (day.dayValue == 6 || day.dayValue == 0) {
            System.out.println("Work at home!");
        } else {
            System.out.println("Work at office!");
        }
    }
}

enum Weekday {
    MON(1), TUE(2), WED(3), THU(4), FRI(5), SAT(6), SUN(0);

    public final int dayValue;
   // 自定义构造方法,可定义dayValue字段
    private Weekday(int dayValue) {
        this.dayValue = dayValue;
    }

}

八、记录类

1、作用

记录类实现以下功能:

  • 定义class时使用final,无法派生子类;
  • 每个字段使用final,保证创建实例后无法修改任何字段。
    即:
public final class Point {
    private final int x;
    private final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int x() {
        return this.x;
    }

    public int y() {
        return this.y;
    }
}

2、语法

和enum类似,我们自己不能直接从Record派生,只能通过record关键字由编译器实现继承

public record Point(int x, int y) {}

九、BigInteger

1、场景

在Java中,由CPU原生提供的整型最大范围是64位long型整数。使用long型整数可以直接通过CPU指令进行计算,速度非常快。
如果我们使用的整数范围超过了long型怎么办?这个时候,就只能用软件来模拟一个大整数。java.math.BigInteger就是用来表示任意大小的整数。

2、语法

(1)基础语法
对BigInteger做运算的时候,只能使用实例方法

BigInteger i1 = new BigInteger("1234567890");
BigInteger i2 = new BigInteger("12345678901234567890");
BigInteger sum = i1.add(i2); // 12345678902469135780

(2)转换为基础类型
可以把BigInteger转换成基本类型。如果BigInteger表示的范围超过了基本类型的范围,转换时将丢失高位信息,即结果不一定是准确的。如果需要准确地转换成基本类型,可以使用intValueExact()、longValueExact()等方法,在转换时如果超出范围,将直接抛出ArithmeticException异常。

BigInteger i = new BigInteger("123456789000");
System.out.println(i.multiply(i).longValueExact()); // java.lang.ArithmeticException: BigInteger out of long range

十、BigInteger

1、语法

(1)创建

BigDecimal bd = new BigDecimal("123.4567");
System.out.println(bd.multiply(bd)); // 15241.55677489

(2)精度及取值
.scale获取精度,setScale按照制定方法设置精度

BigDecimal d1 = new BigDecimal("123.456789");
BigDecimal d2 = d1.setScale(4, RoundingMode.HALF_UP); // 四舍五入,123.4568

2、注意事项

使用equals()方法不但要求两个BigDecimal的值相等,还要求它们的scale()相等
比较BigDecimal的值是否相等,必须使用compareTo()而不能使用equals()。

原文地址:http://www.cnblogs.com/pengu1998/p/16874653.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性