【Java】用心整理出的字符串总结

2020.8.27
今天闲来无事,整理了在《Java核心技术 卷Ⅰ》中最基础的字符串知识。楼主目前是一名准大二学生,在计算机这块普遍还非常薄弱。希望能与你们一同进步。

目录:

一:字符串的基本概念
二、子串(substring)的介绍
三、字符串的拼接
四、Java中字符串的不可变性
五、检测字符串是否相等
六、区分空串与null串
七、有点令人困惑的码点与代码单元

一:字符串的基本概念

1、在Java中,字符串是一段Unicode字符序列
2、Java中没有内置的字符串类型,字符串是String类的一个实例
3、字符串用双引号括住表示
举例:

String s1 = "";
String s2 = "Hello World";

二、子串(substring)的介绍

1、什么是子串?
子串是串中连续的片段,字符串本身是自己的最大字串。
2、substring方法:
先来看一个例子:

String s = "Hello World";
String sub = s.substring(0, 3);

上述sub表示的是字符串"Hel"
字符串s.substring(a,b)中,参数b表示不复制的第一个位置。
这样做的好处是,可以直接由b-a得到子串的长度。

三、字符串的拼接

1、简单的 + :
先来看两个例子:

System.out.println("You're" + "what you're");
System.out.println("1+1=" + 2);

(1)使用加号拼接两个字符串时,并不会自动添加空格。例一中的输出结果为"You’rewhat you’re"
(2)加号两侧只需至少有一侧为字符串即可,非字符串的部分(如例子中的 2 会自动转换为字符串)。在Java中,所有Java对象都可以转换成字符串。
2、方便的join方法与repeat方法:
(1)join方法:
用途:将多个字符串放在一起,并在字符串直接添加一个统一的界定符(delimiter)。
举个小例子:

String s = String.join("*", "Java", "is not", "difficult");
//s为"Java*is not*difficult"

注意:
它是一个静态方法。
头尾没有定界符。

(2)repeat方法:
这个很好理解

String repeated =  "Fire".repeat(2);
//repeated为"JavaJava"

四、Java中字符串的不可变性

1、字符串的值永远不能改变,"Java"永远是包含J、a、v、a的代码单元序列。能修改的只是字符串变量。
2、String类中没有任何直接修改字符串中某个字符的方法。
举例:

// 如果你想将上述repeated改为"JavaP",该怎么做?
//使用如下语句:
repeated = repeated.substring(0, 4) + "P";

虽然用拼接的方式重新创造一个新字符串的效率不高,但好处也是巨大的:编译器可以实现字符串共享。
在这种情况下,所有字符串存放在一个公共的存储池当中,此时,一个字符串变量就类似于C++当中的指针,指向公共存储池当中的字符串,若将该字符串变量进行复制,得到的复制的那个字符串变量实际指向的是同一个字符串。

五、检测字符串是否相等

1、易错的 “= =” 运算符
= =运算符检测的并不是两个字符串是否相等,而是他们的位置是否相等。
上文提到的字符串均处在一个公共存储池当中,因此用= =符号检测字面量是没问题的。但是,由 + 或 substring等操作得到的字符串并不是共享的!

repeated = repeated.substring(0, 4) + "P";
repeated == "JavaP";//可能得到false!

2、安全方便的equals方法
表达式:s.equals(t);
如果想忽略大小写,则使用s.equalsIgnoreCase(t);
s、t既可以是字符串字面量,也可以是字符串变量。

repeated.equals("JavaP"); // true
"javap".equalsIgnoreCase(repeated); //true

六、区分空串与null串

1、空串是String类的一个对象,它的长度为0,而null串表示一个字符串变量目前没有任何对象与之关联。
2、检验空串、检验null串、检验非空非null串

str.length() == 0;
str.equals("");

str == null;

str != null && str.length() != 0;

3、由于null串代表的字符串变量未与任何对象相关联,无法使用相关API,因此检验一个串是否为null非常重要。

七、有点令人困惑的码点与代码单元

介绍之前,我们先来了解几个基本知识。
1、Java字符串是由char值序列构成。
2、char数据类型只是一个代码单元。
3、代码单元采用UTF-16编码来表示Unicode码点。
4、Unicode字符有的需要一对代码单元来表示,有的只需要一个。
因此,对于一个字符串
其中 字符数 = 码点数 >= 代码单元数 = 序列中char值数
基于以上,
1、length方法返回的是代码单元数量,不一定是字符串的实际长度。
2、codePointCount方法可以计算码点数量(即字符串的实际长度)。

八、StringBuilder类的简单介绍

前面提到过,String类对象是不允许修改的,当我们需要多次拼接字符串时,每次拼接都会创造一个新的String对象,效率低下。因此,Java引入了StringBuilder类。
操作方法:

// 使用基本步骤:
StringBuilder StrB = new StringBuilder();//构建一个对象
StrB.append("123456789");//追加字符串
StrB.insert(0, "0");//插入字符串
StrB.delete(0, 2);//删除字符串
String s = StrB.toString();//返回一个与构建器中内容相同的字符串
//最终s的值为"23456789"

以上就是全部内容,如有错误还请多多指教。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值