Java中的字符串

news2025/7/18 8:18:38

🙉 作者简介: 全栈领域新星创作者 ;天天被业务折腾得死去活来的同时依然保有对各项技术热忱的追求,把分享变成一种习惯,再小的帆也能远航。

🏡 个人主页:xiezhr的个人主页

java中的字符串

      • 一、简介
      • 二、字符串定义
        • 2.1 直接定义字符串
        • 2.2 通过使用 String 类的构造方法来创建字符串
      • 三、如何使用Java API帮助文档
        • 3.1 帮助文档下载地址
        • 3.2 帮助文档使用
        • 3.2 中文帮助文档
      • 四、 String字符串和int、double、float 的相互转换
        • 4.1 String 转int
        • 4.2 String 转Double、Float
        • 4.3 int转换为String
        • 4.3 Double、Float转换为String
      • 五、字符串拼接
        • 5.1 使用连接运算符“+”
        • 5.2 使用 concat() 方法
      • 六 、获取字符串长度
      • 七、字符串大小写转换
      • 八 、去除字符串中的空格
      • 九 、截取字符串
      • 十、分割字符串
      • 十一、字符串替换
      • 十二、字符串比较
        • 12.1 equals()
        • 12.2 equals() 与 == 比较字符
        • 12.3 equalsIgnoreCase()
        • 12.4 compareTo() 与 compareToIgnoreCase()
      • 十三、 字符串查找
        • 13.1 charAt()
        • 13.2 indexOf()
        • 13.3 lastlndexOf()
        • 13.4 contains()
      • 十四、字符串按指定字符集转byte序列
        • 14.1 getBytes()
        • 14.2 getBytes(String charsetName)
      • 十五、字符复制
        • 15.1 getChars()
        • 15.2 copyValueOf()
      • 十六、空字符串与null
        • 16.1 空字符串与null的区别
        • 16.2 非空判断
        • 16.3 StringUtils的isBlank与isEmpty
      • 十七、String、StringBuilder、StringBuffer
        • 17.1 比较
        • 17.2 继承结构
        • 17.3 使用场景选择
        • 17.4 StringBuffer 常用函数

一、简介

Java字符串就是Unicode字符序列。Java里没有内置的字符串类型,而是在标准的类库中提供了一个预定义类,String。每个用双引号""括起来的都是String类的一个实例

字符串是日常开发中最常用, Java字符串的一个重要特点就是字符串不可变

二、字符串定义

2.1 直接定义字符串

String str = "www.xiezhrspace.cn";
//或者
String str;
str = "www.xiezhrspace.cn";

2.2 通过使用 String 类的构造方法来创建字符串

//① String() 初始化新创建的 String对象,使其表示空字符序列
String str = new String();
//② String(String original) 初始化新创建的String对象,使其表示与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。
String str = new String("www.xiezhrspace.cn")
//③ String(char[] value) 分配一个新的字符串,将参数中的字符数组元素全部变为字符串。该字符数组的内容已被复制,后续对字符数组的修改不会影响新创建的字符串
char a[] = {'H','e','l','l','0'};
String sChar = new String(a);
//④ String(char[] value, int offset, int count) 分配一个新的 String,它包含来自该字符数组参数一个子数组的字符。offset 参数是子数组第一个字符的索引,count 参数指定子数组的长度。该子数组的内容已被赋值,后续对字符数组的修改不会影响新创建的字符串
char a[]={'H','e','l','l','o'};
String sChar=new String(a,1,4);
...

String 提供的构造方法很多,文章只列举常用的,其余的可自行查找Java帮助文档。帮助文档的使用参照下一小节

三、如何使用Java API帮助文档

3.1 帮助文档下载地址

https://www.oracle.com/java/technologies/downloads/
在这里插入图片描述
在这里插入图片描述
下载完解压后目录如下
在这里插入图片描述

3.2 帮助文档使用

① 双击index.html打开
在这里插入图片描述
② 搜索框中输入关键字String 找到java.lang包下的String
在这里插入图片描述
③ 查看String 类的帮助信息
String 类的基本信息
在这里插入图片描述
String 类public/protected 修饰的属性
在这里插入图片描述
String 类public/protected 修饰所有构造器
在这里插入图片描述
String 类public/protected 修饰所有构造器
在这里插入图片描述

3.2 中文帮助文档

如果小伙伴看英文比较吃力,这里也提供了中文帮助文档下载地址(文档包含jdk1.6~jdk10 的帮助文档)。
注: 中文帮助文档采用的是工具翻译的,有些地方可能不准确,请结合着官方英文文档查看

链接:https://pan.baidu.com/s/1Rh-o1i-LCjEPNB4EyO9FrQ
提取码:7kms

在这里插入图片描述

在这里插入图片描述

四、 String字符串和int、double、float 的相互转换

4.1 String 转int

String 转换 int 时,String 的值一定是整数,否则会报数字转换异常(java.lang.NumberFormatException)

  • Integer.parseInt(String s)
  • Integer.valueOf(String s)
public class StringTest {

    public static void main(String[] args) {
        System.out.println(Integer.parseInt("123"));
        System.out.println(Integer.valueOf("345"));
    }
}
//输出结果为
123
345

4.2 String 转Double、Float

String 转换 Double、Float 时,String 的值一定是浮点类型,否则会报数字转换异常(java.lang.NumberFormatException)

  • Double.parseDouble(String s)
  • Double.valueOf(String s)
  • Float.parseFloat(String s)
  • Float.valueOf(String s)
public class StringTest {

    public static void main(String[] args) {
        System.out.println(Double.parseDouble("12.45"));
        System.out.println(Double.valueOf("12.45"));
        System.out.println(Float.parseFloat("25.68"));
        System.out.println(Float.valueOf("25.68"));
    }
}
//输出结果为
12.45
12.45
25.68
25.68

4.3 int转换为String

使用第三种方法相对第一第二种耗时比较大。在使用第一种 valueOf() 方法时,注意 valueOf 括号中的值不能为空,否则会报空指针异常(NullPointerException)

  • String.valueOf( Integer i)
  • Integer.toString( Integer i)
  • "" + Integer i
public class StringTest {

    public static void main(String[] args) {
        System.out.println(String.valueOf(123));
        System.out.println(Integer.toString(345));
        System.out.println(456 + "");
    }
}
//输出结果为
123
345
456

4.3 Double、Float转换为String

使用第三种方法相对第一第二种耗时比较大。在使用第一种 valueOf() 方法时,注意 valueOf 括号中的值不能为空,否则会报空指针异常(NullPointerException)

  • String.valueOf(Double d)
  • Double.toString(Double d)
  • "" + Double d
  • String.valueOf(Float d)
  • Float.toString(Float d)
  • "" + Float f
public class StringTest {

    public static void main(String[] args) {
        public class StringTest {

    public static void main(String[] args) {
        System.out.println(String.valueOf(20.48d));
        System.out.println(Double.toString(20.48d));
        System.out.println(20.48d + "");

        System.out.println(String.valueOf(10.24f));
        System.out.println(Float.toString(10.24f));
        System.out.println(10.24f + "");
    }
}

    }
}
//输出结果为
20.48
20.48
20.48
10.24
10.24
10.24

五、字符串拼接

5.1 使用连接运算符“+”

str1+str2

public class StringTest {

    public static void main(String[] args) {

        System.out.println("微信公众号:" + "XiezhrSpace");
        
    }
}
//输出
微信公众号:XiezhrSpace

5.2 使用 concat() 方法

str1.concat(str2)

public class StringTest {

    public static void main(String[] args) {

        System.out.println("个人博客:".concat("www.xiezhrspace.cn"));

    }
}
// 输出
个人博客:www.xiezhrspace.cn

六 、获取字符串长度

str.length()

public class StringTest {

    public static void main(String[] args) {
        String str1 = "公众号:XiezhrSpace";
        String str2 = "个人博客:www.xiezhrspace.cn";

        System.out.println("str1长度:"+str1.length());
        System.out.println("str2长度:"+str2.length());
    }
}
//输出
str1长度:15
str2长度:23

七、字符串大小写转换

  • str.toLowerCase() 将字符串中的字母全部转换为小写,非字母不受影响
  • str.toUpperCase() 将字符串中的字母全部转换为大写,非字母不受影响
public class StringTest {

    public static void main(String[] args) {
       String str ="Hello World!";
        System.out.println("原始字符串:"+str);
        System.out.println("使用toLowerCase() 方法之后为:" + str.toLowerCase());
        System.out.println("使用toUpperCase() 方法之后为:" + str.toUpperCase());
    }
}
//输出
原始字符串:Hello World!
使用toLowerCase() 方法之后为:hello world!
使用toUpperCase() 方法之后为:HELLO WORLD!

八 、去除字符串中的空格

字符串中存在的首尾空格一般情况下都没有任何意义,如字符串“ Hello ”,但是这些空格会影响到字符串的操作,如连接字符串或比较字符串等,所以应该去掉字符串中的首尾空格,这需要使用 String 类提供的 trim() 方法

  • str.trim()
  • str.replace((char) 12288, ' '); str.trim()

注意

  • trim() 只能去掉字符串中前后的半角空格(英文空格),而无法去掉全角空格(中文空格)。
    这时候我们只能先将全角空格替换为半角空格再进行操作,其中替换是 String 类的 replace() 方法
  • 12288 是中文全角空格的 unicode 编码
//字符串中的每个空格占一个位置,直接影响了计算字符串的长度
public class StringTest {

    public static void main(String[] args) {
        String str = " hello ";
        System.out.println(str.length());    // 输出 7
        System.out.println(str.trim().length());    // 输出 5
    }
}
//输出
7
5
//去除全角空格实例
public class StringTest {

    public static void main(String[] args)  {
       String str = " hello";
       //带有全角的空格没有去掉
        System.out.println(str.trim().length());
        //去除全角空格
        System.out.println(str.replace((char) 12288, ' ').trim().length());
    }
}
//输出
6
5

九 、截取字符串

  • substring(int beginIndex) //指定位置截取到字符串结尾
  • substring(int beginIndex,int endIndex) 是截取指定范围的内容

substring() 方法是按字符截取,而不是按字节截取

substring(int beginIndex)

//调用时,括号中是需要提取字符串的开始位置,方法的返回值是提取的字符串
public class StringTest {

    public static void main(String[] args) {
        String str = "关注XiezhrSpace公众号";
        System.out.println(str.substring(2));
    }
}

//输出
XiezhrSpace公众号

substring(int beginIndex,int endIndex)

//方法中的 beginIndex 表示截取的起始索引,截取的字符串中包括起始索引对应的字符;
//endIndex 表示结束索引,截取的字符串中不包括结束索引对应的字符
public class StringTest {

    public static void main(String[] args) {
        String str = "关注XiezhrSpace公众号";
        System.out.println(str.substring(2,13));
    }
}
//输出
XiezhrSpace

注意:, 对于开始位置 beginIndex, Java 是基于字符串的首字符索引为 0 处理的,但是对于结束位置 endIndex,Java 是基于字符串的首字符索引为 1 来处理的 。具体如下图所示

在这里插入图片描述

十、分割字符串

  • str.split(String sign)

  • str.split(String sign,int limit)

  • str 为需要分割的目标字符串。

  • sign 为指定的分割符,可以是任意字符串。

  • limit 表示分割后生成的字符串的限制个数,如果不指定,则表示不限制,直到将整个目标字符串完全分割为止。

public class StringTest {

    public static void main(String[] args) {
        String str = "苹果,香蕉,猕猴桃,梨";
        String arr1[] = str.split(",");
        String arr2[] = str.split(",",3);

        System.out.println("①分割所有水果");
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }

        System.out.println("②分割取前两个水果,其余不分割");
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }

    }
}
//输出
①分割所有水果
苹果
香蕉
猕猴桃
梨
②分割取前两个水果,其余不分割
苹果
香蕉
猕猴桃,

对于 .|$&*.^ 等转义字符,程序中使用时,需要加上\\。 实例如下

public class StringTest {

    public static void main(String[] args) {
        String str1 = "苹果|香蕉|猕猴桃|梨";
        String str2 = "黄色$橙色$红色$白色";
        String arr1[] = str1.split("\\|");
        String arr2[] = str2.split("\\$");

        System.out.println("分割以|分割的水果:");
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
        System.out.println("分割以$为分隔符的颜色:");
        for (int i = 0; i < arr2.length; i++) {
            System.out.println(arr2[i]);
        }

    }
}
//输出结果
分割以|分割的水果:
苹果
香蕉
猕猴桃
梨
分割以$为分隔符的颜色:
黄色
橙色
红色
白色
//多层分隔符解析
public class StringTest {

    public static void main(String[] args) {
        String str = "xiezhr相关信息^个人公账号|XiezhrSpace$个人博客|www.xiezhrspace.cn";
        String arr1[] = str.split("\\^");
        String arr2[] = arr1[1].split("\\$");
        String arr3[] ={};

        System.out.println(arr1[0]);
        for (int i = 0; i < arr2.length; i++) {
          arr3= arr2[i].split("\\|");
            for (int i1 = 0; i1 < arr3.length; i1++) {
                System.out.println(arr3[i1]);
            }
        }
        
    }
}
//输出
xiezhr相关信息
个人公账号
XiezhrSpace
个人博客
www.xiezhrspace.cn

十一、字符串替换

str.replace(char oldChar, char newChar)

将目标字符串中的指定字符(串)替换成新的字符(串)

  • oldChar 表示被替换的字符串
  • newChar 表示用于替换的字符串

str.replaceFirst(String regex, String replacement)

将目标字符串中匹配某正则表达式的第一个子字符串替换成新的字符串

  • regex 表示正则表达式
  • replacement 表示用于替换的字符串

str.replaceAll(String regex, String replacement)

将目标字符串中匹配某正则表达式的所有子字符串替换成新的字符串

  • regex 表示正则表达式
  • replacement 表示用于替换的字符串
public class StringTest {

    public static void main(String[] args) {
        String str1 ="个人公众号:XiezhrSpace";
        String str2 ="xiezhr love programming";

        System.out.println("原始字符串:" + str1);
        System.out.println("替换后:"+str1.replace(":", "|"));
        System.out.println("原始字符串:" + str2);
        System.out.println("替换后:"+str2.replace("programming", "anime"));

    }
}
//输出
原始字符串:个人公众号:XiezhrSpace
替换后:个人公众号|XiezhrSpace
原始字符串:xiezhr love programming
替换后:xiezhr love anime
public class StringTest {

    public static void main(String[] args) {
      String str ="中国移动:https://www.10086.cn/ 10086:https://www.10086.cn/";

      System.out.println("匹配成功:");
      System.out.println(str.replaceFirst("10086", "xiezhrspace"));

      System.out.println("未匹配成功:");
      System.out.println(str.replaceFirst("mobile", "xiezhrspace"));
    }
}

//输出
匹配成功:
中国移动:https://www.xiezhrspace.cn/ 10086:https://www.10086.cn/
未匹配成功:
中国移动:https://www.10086.cn/ 10086:https://www.10086.cn/
public class StringTest {

    public static void main(String[] args) {
      String str ="中国移动:https://www.10086.cn/ 10086:https://www.10086.cn/";

      System.out.println("匹配成功:");
      System.out.println(str.replaceAll("10086", "xiezhrspace"));

      System.out.println("未匹配成功:");
      System.out.println(str.replaceAll("mobile", "xiezhrspace"));
    }
}
//输出
匹配成功:
中国移动:https://www.xiezhrspace.cn/ xiezhrspace:https://www.xiezhrspace.cn/
未匹配成功:
中国移动:https://www.10086.cn/ 10086:https://www.10086.cn/

十二、字符串比较

str1.equals(str2)
str1.equalsIgnoreCase(str2)
str1.compareTo(str2);

12.1 equals()

逐个地比较两个字符串的每个字符是否相同。如果两个字符串具有相同的字符和长度,它返回 true,否则返回 false。字符大小写不同,返回false

public class StringTest {

    public static void main(String[] args) {
        String str1 ="xiezhr";
        String str2 = new String("xiezhr");
        String str3 = "XIEZHR";

        System.out.println("str1与str2比较结果:" + str1.equals(str2));
        System.out.println("str1与str3比较结果:" + str1.equals(str3));

    }
}
//输出结果
str1与str2比较结果:true
str1与str3比较结果:false

12.2 equals() 与 == 比较字符

== 比较引用地址是否相同,equals() 比较字符串的内容是否相同

public class StringTest {

    public static void main(String[] args) {
        String str1 ="xiezhr";
        String str2 = new String("xiezhr");

        System.out.println("使用equals方法比较的结果:");
        System.out.println(str1.equals(str2));
        System.out.println("使用==比较的结果:");
        System.out.println(str1 == str2);

    }
}
//输出
使用equals方法比较的结果:
true
使用==比较的结果:
false

12.3 equalsIgnoreCase()

字符串与指定的对象比较,不考虑大小写

public class StringTest {

    public static void main(String[] args) {
        String str1 ="xiezhr";
        String str2 ="XIEZHR";
        String str3 = new String("xiezhr");

        System.out.println("str1与str2通过equalsIgnoreCase比较结果:" + str1.equalsIgnoreCase(str2));
        System.out.println("str1与str3通过equalsIgnoreCase比较结果:" + str1.equalsIgnoreCase(str3));
    }
}
//输出
str1与str2通过equalsIgnoreCase比较结果:true
str1与str3通过equalsIgnoreCase比较结果:true

12.4 compareTo() 与 compareToIgnoreCase()

基于字符串各个字符的 Unicode 值,按字典顺序(ASCII码顺序)比较两个字符串的大小
如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的长度差值(ASCII码差值)
如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至不等为止,返回该字符的ASCII码差值
如果两个字符串不一样长,可对应字符又完全一样,则返回两个字符串的长度差值
compareToIgnoreCase方法可以忽略大小写

  • 如果参数字符串等于此字符串,则返回值 0;
  • 如果此字符串小于字符串参数,则返回一个小于 0 的值;
  • 如果此字符串大于字符串参数,则返回一个大于 0 的值。
public class StringTest {

    public static void main(String[] args) {
        String str1 ="xiezhr";
        String str2 ="XIEZHR";
        String str3 = new String("xiezhr");
        String str4 = "xiezhr";
        String str5 ="xiezhrspace";

        System.out.println(str1.compareTo(str2));
        System.out.println(str1.compareTo(str3));
        System.out.println(str1.compareTo(str4));
        System.out.println(str1.compareTo(str5));
        System.out.println(str1.compareToIgnoreCase(str2));

    }
}
//输出
32
0
0
-5
0

十三、 字符串查找

13.1 charAt()

字符串本质上是由一个个字符组成的字符数组,因此它也有索引,索引跟数组一样从零开始。charAt() 方法可以在字符串内根据指定的索引查找字符

public class StringTest {

    public static void main(String[] args) {
       String str ="www.xiezhrspace.cn";

        System.out.println(str.charAt(0));
        System.out.println(str.charAt(4));
        System.out.println(str.charAt(5));
        System.out.println(str.charAt(12));

    }
}
//输出
w
x
i
a

13.2 indexOf()

①public int indexOf(int ch): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1
②public int indexOf(int ch, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1
③int indexOf(String str): 返回指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1
④int indexOf(String str, int fromIndex): 返回从 fromIndex 位置开始查找指定字符在字符串中第一次出现处的索引,如果此字符串中没有这样的字符,则返回 -1

  • ch – 字符,Unicode 编码。
  • fromIndex – 开始搜索的索引位置,第一个字符是 0 ,第二个是 1 ,以此类推。
  • str – 要搜索的子字符串
public class StringTest {

    public static void main(String[] args) {
       String str ="XiezhrSpace";

        System.out.println(str.indexOf("e"));
        System.out.println(str.indexOf("pa"));
        System.out.println(str.indexOf("e", 4));
    }
}
//输出
2
7
10

在这里插入图片描述

13.3 lastlndexOf()

用于返回字符(串)在指定字符串中最后一次出现的索引位置,如果能找到则返回索引值,否则返回 -1

lastlndexOf 方法的四种形式

  • public int lastIndexOf(int ch): 返回指定字符在目标字符串中最后一次出现处的索引,如果指定字符串中没有指定的字符,返回 -1

  • public int lastIndexOf(int ch, int fromIndex): 返回指定字符在目标字符串中最后一次出现处的索引,从指定的索引处开始进行反向搜索,如果目标字符串中没有指定字符,返回 -1。

  • public int lastIndexOf(String str): 返回指定子字符串在目标字符串中最后一次出现处的索引,如果目标字符串中没有指定字符,返回 -1

  • public int lastIndexOf(String str, int fromIndex): 返回指定子字符串在目标符串中最后一次出现处的索引,从指定的索引开始反向搜索,如果目标字符串中没有指定的字符,返回 -1

public class StringTest {

    public static void main(String[] args)  {
        String str = new String("个人博客:www.xiezhrspace.cn");
        String str1 = "xiezhr";
        String str2 = "cn";

        System.out.print("查找指定字符 w 在目标字符str中最后出现的位置 :" );
        System.out.println(str.lastIndexOf( 'w' ));
        System.out.print("从第2个位置查找指定字符 w在目标字符串str最后出现的位置 :" );
        System.out.println(str.lastIndexOf( 'w', 14 ));
        System.out.print("指定子字符串 str1 在目标字符串str最后出现的位置:" );
        System.out.println( str.lastIndexOf( str1 ));
        System.out.print("从第7个位置开始查找指定字符串 str1在目标字符串中最后出现的位置 :" );
        System.out.println( str.lastIndexOf( str1, 7 ));
        System.out.print("指定字符串 str2 在目标字符串str最后出现的位置 :" );
        System.out.println(str.lastIndexOf( str2 ));

    }
}
//输出
查找指定字符 w 在目标字符str中最后出现的位置 :7
从第2个位置查找指定字符 w在目标字符串str最后出现的位置 :7
指定子字符串 str1 在目标字符串str最后出现的位置:9
从第7个位置开始查找指定字符串 str1在目标字符串中最后出现的位置 :-1
指定字符串 str2 在目标字符串str最后出现的位置 :21

13.4 contains()

查找字符串中是否包含目标字符(串)

public class StringTest {

    public static void main(String[] args) {
        String str = "xiezhrspace";
        System.out.println(str.contains("xiezhr"));
        System.out.println(str.contains("cn"));
    }
}
//输出
true
false

十四、字符串按指定字符集转byte序列

14.1 getBytes()

按指定的字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中

14.2 getBytes(String charsetName)

默认字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中


import java.io.UnsupportedEncodingException;

public class StringTest {

    public static void main(String[] args)  {
        String str = "网名xiezhr";
        byte[] bytes1 = null;
        byte[] bytes2 = null;
        byte[] gbks = null;
        byte[] bytes = str.getBytes();
        try {
            bytes1 = str.getBytes("utf-8");
            bytes2 = str.getBytes("ISO-8859-1");
             gbks = str.getBytes("GBK");
        }catch (UnsupportedEncodingException e){
            System.out.println("不支持的字符集"+e.getMessage());
        }

        System.out.println("按默认字符集将字符串转byte数组:");
        for (byte aByte : bytes) {
            System.out.print(aByte+" ");
        }
        System.out.println();
        System.out.println("按utf-8编码将字符串转bytes数组:");
        for (byte b1 : bytes1) {
            System.out.print(b1+" ");
        }
        System.out.println();
        System.out.println("按ISO-8859-1编码将字符串转bytes数组:");
        for (byte b2 : bytes2) {
            System.out.print(b2+" ");
        }
        System.out.println();
        System.out.println("按GBK编码将字符串转bytes数组:");
        for (byte gbk : gbks) {
            System.out.print(gbk+" ");
        }
    }
}
//输出
按默认字符集将字符串转byte数组:
-25 -67 -111 -27 -112 -115 120 105 101 122 104 114 
按utf-8编码将字符串转bytes数组:
-25 -67 -111 -27 -112 -115 120 105 101 122 104 114ISO-8859-1编码将字符串转bytes数组:
63 63 120 105 101 122 104 114GBK编码将字符串转bytes数组:
-51 -8 -61 -5 120 105 101 122 104 114 

十五、字符复制

15.1 getChars()

将字符从字符串复制到目标字符数组

public void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)

  • srcBegin – 字符串中要复制的第一个字符的索引。
  • srcEnd – 字符串中要复制的最后一个字符之后的索引。
  • dst – 目标数组。
  • dstBegin – 目标数组中的起始偏移量
public class StringTest {

    public static void main(String[] args)  {
        String Str1 = new String("www.xiezhrspace.cn");
        char[] Str2 = new char[15];

        try {
            Str1.getChars(4, 15, Str2, 3);
            System.out.print("复制的字符串为:" );
            System.out.println(Str2 );
        } catch( Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
//输出,新字符串Str2 是从第三位复制的
复制的字符串为:   xiezhrspace

15.2 copyValueOf()

将字符数组中指定字符复制到目标字符

public static String copyValueOf(char[] data)

  • data – 字符数组

public static String copyValueOf(char[] data, int offset, int count)

  • data – 字符数组
  • offset – 子数组的初始偏移量
  • count – 子数组的长度

public class StringTest {

    public static void main(String[] args)  {
        char[] str1 ={'w','w','w',':','x','i','e','z','h','r','s','p','a','c', 'e','.','c','n' };
        String str2 = null;
        String str3 = null;

        System.out.println(str2.copyValueOf(str1));
        System.out.println(str3.copyValueOf(str1, 4, 11));
        
    }
}
//输出
www:xiezhrspace.cn
xiezhrspace

十六、空字符串与null

一个比较容易混淆的知识点。空串是长度为0的字符串,null表示没有引用任何对象

16.1 空字符串与null的区别

  • String str = null ;
    表示声明一个字符串对象的引用,但指向为null,也就是说还没有指向任何的内存空间;
  • String str = “”;
    表示声明一个字符串类型的引用,其值为""空字符串,这个str引用指向的是空字符串的内存空间;
  • String str = new String();
    创建一个字符串对象的默认值为""
/**
字符串对象与null的值不相等,且内存地址也不相等;
空字符串对象与null的值不相等,且内存地址也不相等;
new String()创建一个字符串对象的默认值为""
**/
public class StringTest {

    public static void main(String[] args) {
        String str1 = new String();
        String str2 = null;
        String str3 = "";

        System.out.println(str1==str2);                
        System.out.println(str1.equals(str2));         
        System.out.println(str2==str3);                
        System.out.println(str3.equals(str2));         
        System.out.println(str1==str3);                
        System.out.println(str1.equals(str3));         
    }
}
//输出
false  //内存地址的比较,返回false
false  //值的比较,返回false
false  //内存地址的比较,返回false
false  //值的比较,返回false
false  //内存地址的比较,返回false
true   //值的比较,返回true

16.2 非空判断

执行下面代码,会抛出java.lang.NullPointerException 。这也是我们日常开发中经常见到的报错。
所以,字符串非空判断显得尤为重要

public class StringTest {

    public static void main(String[] args) {
       String str = null;
       str.length();
    }
}
// 报空指针异常
Exception in thread "main" java.lang.NullPointerException
	at StringTest.main(StringTest.java:5)

非空判断一般包含空字符串和null判断,常见的判断方法主要有以下几种
① 最多人使用的一个方法, 直观, 方便, 但效率很低
注: s==null 判断需要写在前面,要不然还是会报NullPointerException

 if(!(s == null || s.equals(""))){
 	 System.out.println("业务逻辑代码");
 };
 //或者
 if(str !=null &&!"".equals(str)){
   	System.out.println("业务逻辑代码");
 }

②比较字符串长度, 效率比第一种方法高

  if(!(str==null||str.length()==0)){
      System.out.println("业务逻辑代码");
  }
  if(str!=null&&str.length()!=0){
      System.out.println("业务逻辑代码");
  }
}

③ Java SE 6.0 才开始提供的方法, 效率和方法②差不多, 但出于兼容性考虑, 推荐使用方法二

 if(!(str==null||str.isEmpty())){
     System.out.println("业务逻辑代码");
 }
 if(str!=null&& !str.isEmpty()){
     System.out.println("业务逻辑代码");
 }

16.3 StringUtils的isBlank与isEmpty

与java.lang这个包作用类似,Commons Lang 包是由apache 提供的jar包。这一组API也是提供一些基础的、通用的操作和处理

官方下载地址:https://commons.apache.org/proper/commons-lang/download_lang.cgi
maven 包引用

<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

commons-lang3 提供了很多常用的基础操作处理,包括字符串、日期、数组等等。
由于本文主要是说字符串String,所以我们只对其中的StringUtils的isBlank与isEmpty 方法说明。

判断字符串为空,一般会遇到 null 、“” 、字符串中间有空格 " ", 下面是两个方法处理结果

public static boolean isBlank(String str)

import org.apache.commons.lang3.StringUtils;

public class StringTest {

    public static void main(String[] args) {

        System.out.println(StringUtils.isBlank(null));
        System.out.println(StringUtils.isBlank(""));
        System.out.println(StringUtils.isBlank("  "));
        System.out.println(StringUtils.isBlank("        "));
        System.out.println(StringUtils.isBlank("\t \n \f \r"));
        System.out.println(StringUtils.isBlank("\\"));
        System.out.println(StringUtils.isBlank("公众号XiezhrSpace"));
        System.out.println(StringUtils.isBlank("  公众号XiezhrSpace  "));
    }
}
//输出
true    
true
true
true
true
false
false
false

public static boolean isEmpty(String str)

import org.apache.commons.lang3.StringUtils;

public class StringTest {

    public static void main(String[] args) {

        System.out.println(StringUtils.isEmpty(null));
        System.out.println(StringUtils.isEmpty(""));
        System.out.println(StringUtils.isEmpty("  "));  //StringUtils 中空格作非空处理
        System.out.println(StringUtils.isEmpty("        "));
        System.out.println(StringUtils.isEmpty("\t \n \f \r"));
        System.out.println(StringUtils.isEmpty("\\"));
        System.out.println(StringUtils.isEmpty("公众号XiezhrSpace"));
        System.out.println(StringUtils.isEmpty("  公众号XiezhrSpace  "));
        
    }
}
//输出
true
true
false
false
false
false
false
false

当然了,StringUtils工具类还有对应的isNotBlank和isNotEmpty 方法,意思是不为空。

十七、String、StringBuilder、StringBuffer

具体区别可以参考https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303 这篇博文,写的还是挺好的。

17.1 比较

  • String 类是不可变类,即一旦一个 String 对象被创建以后,包含在这个对象中的字符序列是不可改变的;
  • StringBufferStringBuilder支持可变字符串;
  • StringBuilderStringBuffer 功能基本相似,方法也差不多;
  • StringBuffer 是线程安全的,而 StringBuilder 则没有实现线程安全功能;
  • StringBuilder 由于没有实现线程安全,所以效率要比StringBuffer高;

17.2 继承结构

在这里插入图片描述

17.3 使用场景选择

  • 操作少量的数据使用 String。
  • 单线程操作大量数据使用 StringBuilder(大多数情况推荐使用)。
  • 多线程操作大量数据使用 StringBuffer。
public class StringTest {

    public static void main(String[] args) {
        StringBuilder sbd = new StringBuilder();
        StringBuffer sbf = new StringBuffer();
        String str1 ="xiezhr个人信息:";
        String str2 ="博客:www.xiezhrspace.cn";
        String str3 ="公众号:XiezhrSpace";


        String str =str1+str2+str3;

        sbd.append(str1);
        sbd.append(str2);
        sbd.append(str3);

        sbf.append(str1);
        sbf.append(str2);
        sbf.append(str3);

        System.out.println("String拼接字符串:");
        System.out.println(str);
        System.out.println("StringBuilder拼接字符串:");
        System.out.println(sbd.toString());
        System.out.println("StringBuffer拼接字符串:");
        System.out.println(sbf.toString());

    }
}

//输出
String拼接字符串:
xiezhr个人信息:博客:www.xiezhrspace.cn公众号:XiezhrSpace
StringBuilder拼接字符串:
xiezhr个人信息:博客:www.xiezhrspace.cn公众号:XiezhrSpace
StringBuffer拼接字符串:
xiezhr个人信息:博客:www.xiezhrspace.cn公众号:XiezhrSpace

17.4 StringBuffer 常用函数

append(String s) //追加一个字符串
reverse() //将字符串反转
delete(int start, int end) //删除指定位置字符串
insert(int offset, String str) //在指定位置插入字符串
replace(int start, int end, String str) //将指定位置字符串替换为新字符串

public class StringTest {

    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer();
        sb.append("XiezhrSpace!!!");
        System.out.println(sb);
        sb.append("m");
        System.out.println(sb);
        sb.insert(0,"公众号:");
        System.out.println(sb);
        sb.delete(16,19);
        System.out.println(sb);
        sb.replace(15,16,"**");
        System.out.println(sb);
        sb.reverse();
        System.out.println(sb);
    }
}
//输出
XiezhrSpace!!!
XiezhrSpace!!!m
公众号:XiezhrSpace!!!m
公众号:XiezhrSpace!
公众号:XiezhrSpace**
**ecapSrhzeiX:号众公

在这里插入图片描述

本期到此结束,我们下期再见~(●’◡’●)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++:重定义:符号重定义:变量重定义

概述&#xff1a;在上一篇我们知道 通过 #ifndef....#defin....#endif &#xff0c; 这个解决头文件重复包含的问题 C&#xff1a;重定义&#xff1a;class类型重定义_hongwen_yul的博客-CSDN博客 避免头文件的重复包含可以有效的避免变量的重复定义&#xff0c;其实不光变量…

[附源码]java毕业设计基于web旅游网站的设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

使用Docker开发GO应用程序

根据Stack Overflow的2022开发者调查&#xff0c;Go&#xff08;或Golang&#xff09;是最受欢迎和最受欢迎的编程语言之一。由于与许多其他语言相比&#xff0c;Go的二进制大小更小&#xff0c;开发人员经常使用Go进行容器化应用程序开发。 Mohammad Quanit在他的社区全能课程…

小程序vant-tabbar使用示例,及报错处理

小程序vant-tabbar使用示例&#xff0c;及报错处理1. 配置信息2. 添加 tabBar 代码文件3. 编写 tabBar 代码custom-tab-bar/index.tscustom-tab-bar/index.jsoncustom-tab-bar/index.wxml使小程序使用vant-tabbar组件时&#xff0c;遇到以下报错&#xff1a;Couldn’t found th…

Java基于springboot+vue的儿童玩具销售购物网站 多商家

爱玩儿是所有孩子的天性。尤其是在婴幼儿阶段。选择一个好的玩具&#xff0c;不仅能够让孩子玩儿的开心&#xff0c;而且有助于孩子智力的开发。很多家长在选择玩具的时候&#xff0c;不知道选择什么样的玩具。且当前玩具市场的玩具鱼目混杂&#xff0c;种类繁多&#xff0c;而…

SAR信号处理基础1——线性调频信号

关键字&#xff1a;线性调频信号&#xff0c;LFM信号&#xff0c;chirp信号&#xff0c;驻定相位原理&#xff08;POSP&#xff09;&#xff0c;泰勒展开&#xff0c;Taylor展开&#xff0c;脉冲压缩&#xff0c;匹配滤波&#xff0c;sinc&#xff0c;分辨率&#xff0c;峰值旁…

QProgressDialog.close()失败,进度条关闭感觉失败了,无法彻底关闭

开发环境&#xff1a;我是在deepin&#xff08;深度&#xff09;系统下开发的&#xff0c;在我本机上&#xff0c;一点问题也没有&#xff0c;但是我移植到了ubantu的机子上&#xff0c;就偶尔出现出个问题&#xff0c;出现了一个模态框&#xff0c;需要重启软件才能关闭。 问题…

Vue的computed和watch的区别是什么?

一、computed介绍 computed 用来监控自己定义的变量&#xff0c;该变量在 data 内没有声明&#xff0c;直接在 computed 里面定义&#xff0c;页面上可直接使用。 //基础使用 {{msg}} <input v-model"name" /> //计算属性 computed:{msg:function(){return …

【MySQL】MySQL日志系统以及InnoDB背后的技术(MySQL专栏启动)

&#x1f4eb;作者简介&#xff1a;小明java问道之路&#xff0c;专注于研究 Java/ Liunx内核/ C及汇编/计算机底层原理/源码&#xff0c;就职于大型金融公司后端高级工程师&#xff0c;擅长交易领域的高安全/可用/并发/性能的架构设计与演进、系统优化与稳定性建设。 &#x1…

Java基于springboot+vue的个人博客网站 前后端分离

随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多网站的之中&#xff0c;随之就产生了“博客网站”&#xff0c;这样就让博客网站更加方便简单。 对于本博客网站的设计来说&#xff0c;系统开发主要是采用java语言技…

2022国产8K摄像机介绍

摄像机是一种把光学图像信号转变为电信号&#xff0c;以便于存储或者传输的设备。当我们拍摄一个物体时&#xff0c;此物体上反射的光被摄像机镜头收集&#xff0c;使其聚焦在摄像器件的受光面&#xff08;例如摄像管的靶面&#xff09;上&#xff0c;再通过摄像器件把光转变为…

N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting

N-HiTS: Neural Hierarchical Interpolation for Time Series Forecasting 神经预测的最新进展加速了大规模预测系统性能的提高。然而,长期预测仍然是一项非常困难的任务。影响这项任务的两个常见挑战是预测的波动性和它们的计算复杂性。本文提出N-HiTS,一种通过结合新的分层…

不同字符编码对比

目录 1. ASCII码 2. Unicode 3. GBK编码 1. ASCII码 ASCII码使用一个字节编码&#xff0c;但只适用于英文&#xff1b; 2. Unicode Unicode定义了字符集&#xff0c;有 17 个 code plane&#xff0c;总共规划了 1,114,112 个 code point。而这些字符可以使用UTF-8、UTF-1…

Windows无法访问指定设备、路径或文件怎么办?

如何解决Windows 无法访问指定的设备、路径或文件错误&#xff1f; 1.修改安全中心的设置 如果在安装程序的过程中&#xff0c;遇到该错误&#xff0c;可以进入到【Windows安全中心】进行设置修改。 第一步&#xff1a;点击左下角的开始按钮&#xff0c;然后依次点击【设置】…

直接安装WSL2及安装Ubuntu到F盘

1. 勾选这三项&#xff0c;重启 2. 以管理员方式运行powersell wsl --updatewsl --shutdownwsl --set-default-version 2wsl --status3. 解压缩ubuntu 解压缩Ubuntu_1804.2019.522.0_x64.appx到F盘 4. 安装ubuntu 双击ubuntu1804.exe安装 5. 运行 双击ubuntu1804.exe …

AI人工智能实践技术系统性教学方案

郁磊老师【副教授】 &#xff1a;长期从事Python、Matlab机器学习及深度学习等研究工作&#xff0c;具备良好的数学及信号处理基础&#xff0c;熟悉如神经网络、支持向量机、决策树、随机森林等&#xff0c;以及群优 化算法&#xff0c;如遗传算法、蚁群算法、蝙蝠算法等&#…

React源码解读之更新的创建

React 的鲜活生命起源于 ReactDOM.render &#xff0c;这个过程会为它的一生储备好很多必需品&#xff0c;我们顺着这个线索&#xff0c;一探婴儿般 React 应用诞生之初的悦然。 更新创建的操作我们总结为以下两种场景 ReactDOM.rendersetStateforceUpdate ReactDom.render …

k8s-dynamic-pvc

安装 storage class: external-storage/nfs-client/deploy at master kubernetes-retired/external-storage GitHub 下载文件并安装: class.yaml deployment.yaml rbac.yaml 其中修改: 安装 测试: [rootmaster test-dir]# cat nginx-1.yaml apiVersion: v1 kind: Pers…

【Pytorch with fastai】第 4 章 :底层训练数字分类器

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

一切为了喵喵 | 攻防世界 x Nepnep x CATCTF邀你一战!

各位极客请注意❗ 各位极客请注意❗❗ 为了坚决捍卫每只小猫咪吃饱饭的权利 为了彻底贯彻“可爱就是王道”的正义 攻防世界 x Nepnep x CATCTF 邀你一战&#xff01; 此战若成&#xff0c;8333只流浪喵星人将能饱餐一顿&#xff01; 没有一只修猫咪饿肚子的明天在等着我们…