java字符串详解——码点与代码单元

从概念上讲,java字符串就是Unicode字符序列。例如字符串"java\u2122"由5个Unicode字符j,a,v,a和™组成。java没有内置的字符串类型,而是在标准java类库中提供了一个预定义类,叫做String。每个由""括起来的字符串都是String类的实例。

拼接字符串

java允许使用+号拼接两个字符串,
当一个字符串和一个非字符串进行拼接市,后者会转换为字符串,如果后者是对象,则会调用它的toString方法,这种情况常出现在打印语句中
如需要将多个字符串以特定分隔符连接起来,可使用String类的静态方法join

//第一个参数是分隔符,后面的是要拼接的字符串
String all = String.join(",","a","b","c")

上述代码中的all的值为"a,b,c"

字符串的不变性

在java中,字符串是不可修改的,字符串的修改操作将会创建新串。这是因为,java语言的设计者认为,字符串的共享将会带来高效率。

各种字符串将会被存放到一个公共的存储池中。字符串变量指向存储池中的相应位置(字符串变量的值为地址),两个字面量相等的字符串变量,指向相同的地址
示例:

public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "abc";

        String a = "ab";
        String b = "c";
        String s3 = a+b;
        
        System.out.println(s1==s2);
        System.out.println(s1==s3);
    }

结果:
在这里插入图片描述
注意:只有字符串字面量是共享的,而通过+或subString得到的字符串并不共享

检测字符串是否相等

在c++中,c++的String类重载了==操作符来检测两个字符串内容是否相等,但是java没有运算符重载机制,只能使用equals方法或compareTo方法来检验字符串内容的相等性。

码点与代码单元

码点:码点是指某个字符在编码表上对应的数值
代码单元:代码单元是组成码点的更小单位,对于绝大多数常用字符,一个码点由一个代码单元构成,而对于一些辅助字符,其码点由两个代码单元构成

java字符串由char序列组成,char数据类型是一个采用UTF-16编码表示的Unicode码点的代码单元。最常用的Unicode字符使用一个代码单元就可以表示,而辅助字符需要使用两个代码单元表示。

String类的length方法返回的是采用UTF-16编码表示的字符串所需要的代码单元数量,而不是指字符串的字符个数(即当字符串中含有辅助字符时,length方法的返回值要比字符串中的字符个数大)。

若想得到实际的长度,即码点数量,可以使用String类的codePointCount方法

大多数情况下,字符串中不会含有辅助字符,因而以上两种获得字符串长度的方法均可用。

需要注意的是,虚拟机不一定把字符串实现为代码单元序列。在java9中,只包含单字节代码单元的字符串使用byte数组实现,所有其他字符串均使用char数组

构建字符串

如果需要多次拼接字符串,建议使用StringBuilder或StringBuffer,避免多次创建String对象,造成内存空间的浪费。

StringBuilder builder = new StringBuilder();
builder.append("abc");
builder.append("def");

String result = builder.toString()  //result="abcdef"

需要注意的是,StringBuffer是线程安全的,它支持在多个线程中并发编辑字符串,但是代价是降低效率。而StringBuilder不是线程安全的,它只支持在单线程内编辑字符串,但是效率较高。两者的API是一样的

对于其他的字符串常用API本文不再赘述,详情参见官方文档

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值