Java成王之路】第十八篇:Java SE(认识String类2)

目录

一、字符, 字节与字符串

1 字符与字符串

①将字符数组中的所有内容变为字符串:

②获取指定下标位置的字符

 ③将字符串变为字符数组返回

④判断某个字符是不是数字

 2.字节与字符串

①将字节数组变为字符串

②将字符串以字节数组形式返回

 3.字符串常见操作

①比较字符串内容

②忽略大小写比较

③比较两个字符串大小关系

4.字符串查找 

①判断一个子字符串是否存在

②在子串当中找到主串第一次出现的位置,找到返回下标

③从后往前查找子串在主串第一次出现的位置 

③判断是否以指定字符串开头

​ ④判断是否以指定字符串结尾

5. 字符串替换

 ①字符替换

②字符串替换

③替换首个内容

6.字符串拆分 

①将字符串全部拆分

②字符串截取

③去掉字符串中的左右空格,保留中间空格

④字符串转大写

⑤字符串转小写

⑥字符串拼接

 ⑦判断是否为空字符串,但不是null,而是长度为0

​ 7 .StringBuffer 和 StringBuilder

 ①StringBuilder

②StringBuffer

③ StringBuffer、StringBuilder与String相互转换


一、字符, 字节与字符串

1 字符与字符串

字符串内部包含一个字符数组,String 可以和 char[] 相互转换.

①将字符数组中的所有内容变为字符串:

public static void main(String[] args) {
    char[] chars = {'a','b','c','d'};//不是双引号引起来的,不会入常量池
    String str = new String(chars);
    System.out.println(str);//字符转换成字符串
}

打印结果:

看下图代码,传两个参数意为从偏移量为1的地方开始取三个

public static void main(String[] args) {
    char[] chars = {'a','b','c','d','e'};//不是双引号引起来的,不会入常量池
    String str = new String(chars,1,3);//offset偏移量,意为从偏移量为1的地方开始取三个
    System.out.println(str);//把一个数组转变为一个字符串
}

打印结果:

②获取指定下标位置的字符

public static void main(String[] args) {
    String str1 = "hello";
    char ch = str1.charAt(2);//获取到2下标的字符
    System.out.println(ch);
}

打印结果:

 ③将字符串变为字符数组返回

public static void main(String[] args) {
    String str1 = "hello";
    char ch = str1.charAt(2);//获取到2下标的字符
    System.out.println(ch);

    char[] chars = str1.toCharArray();//把str1指向的字符串对象,变成字符数组
    System.out.println(Arrays.toString(chars));
}

 打印结果:

④判断某个字符是不是数字

第一种写法:

public static boolean isNumberchar(String s){
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        if(c<'0'||c>'9') {
            return false;
        }
    }
    return true;
}
public static void main(String[] args) {
    String str = "123456789";
    System.out.println(isNumberchar(str));

}

打印结果:

第二种写法:

public static boolean isNumberchar(String s){
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        boolean flg = Character.isDigit(c);//判断某个字符是不是数字
        if(flg == false){
            return false;
        }

    }
    return true;
}
public static void main(String[] args) {
    String str = "123456789";
    System.out.println(isNumberchar(str));

}

 2.字节与字符串

①将字节数组变为字符串

public static void main(String[] args) {
    byte[] bytes = {97,98,99,100};
    String str = new String(bytes);//把字节变成字符串
    System.out.println(str);

打印结果:

小小知识点 :

String中间一道横杠,我们点开看源码,注解为Deprecated,证明这个方法已经过时了,不用了。

看下图代码,传两个参数意为从偏移量为1的地方开始取三个

public static void main(String[] args) {
    byte[] bytes = {97,98,99,100};
    String str = new String(bytes,1,3);意为从偏移量为1的地方开始取三个,98为1偏移量
    System.out.println(str);

}

 打印结果:

②将字符串以字节数组形式返回

public static void main(String[] args) {
    byte[] bytes = {97,98,99,100};
    String str = new String(bytes,1,3);
    System.out.println(str);
    System.out.println("===========");
    String str1 = "abcde";
    byte[] bytes1 = str1.getBytes();
    System.out.println(Arrays.toString(bytes1));

}

 打印结果:

注意:

那么何时使用 byte[], 何时使用 char[]呢?

byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.

char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.

回忆概念: 文本数据 vs 二进制数据

一个简单粗暴的区分方式就是用记事本打开能不能看懂里面的内容.如果看的懂, 就是文本数据(例如 .java 文件), 如果看不懂, 就是二进制数据(例如 .class 文件).

 3.字符串常见操作

字符串比较方式:

1:真假比较

2:大小比较

①比较字符串内容

public static void main(String[] args) {
    String str1 = "hello";
    String str2 = "abcdef";
    System.out.println(str1.equals(str2));//比较字符串内容一样不一样
}

打印结果: equals如何比较的我们可以看一下源码: 

②忽略大小写比较

public static void main(String[] args) {
    String str1 = "abc";
    String str2 = "Abc";
    System.out.println(str1.equalsIgnoreCase(str2));//比较的时候忽略大小写
}

 打印结果:

③比较两个字符串大小关系

public static void main(String[] args) {
    String str1 = "abc";
    String str2 = "Abc";
    int ret = str1.compareTo(str2);
    System.out.println(ret);
}

 打印结果:

 看源码分析:

4.字符串查找 

①判断一个子字符串是否存在

public static void main(String[] args) {
    String str1 = "ababcabcd";
    String str2 = "abce";
    boolean ret = str1.contains(str2);//contains会从前往后找第一个出现的abc,有返回true,没有返回falsse
    System.out.println(ret);
}

打印结果:

②在子串当中找到主串第一次出现的位置,找到返回下标

public static void main(String[] args) {
    String str1 = "ababcabcd";
    String str2 = "abc";
    int index = str1.indexOf(str2);//在子串当中找到主串第一次出现的位置,找到返回下标
    System.out.println(index);
}

打印结果:

③从后往前查找子串在主串第一次出现的位置 

public static void main(String[] args) {
    String str1 = "ababcabcd";
    String str2 = "abc";
 int index = str1.lastIndexOf(str2);//在子串当中找到主串第一次出现的位置,从后往前找,找到返回下标
    System.out.println(index);
}

打印结果: 

③判断是否以指定字符串开头

public static void main(String[] args) {
    String str1 = "ababcabcd";
    String str2 = "abc";
    System.out.println(str1.startsWith("a"));
}

打印结果:

从偏移量为3的位置开始判断:

 ④判断是否以指定字符串结尾

public static void main(String[] args) {
    String str1 = "ababcabcd";
    String str2 = "abc";
    System.out.println(str1.endsWith("cd"));
}

 打印结果:

5. 字符串替换

替换所有的指定内容

 ①字符替换

public static void main(String[] args) {
    String str = "abababcdabcdef";
    String ret = str.replace('a','g');//不是把a替换成g,是重新new了一个对象。
    System.out.println(ret);
}

打印结果:

②字符串替换

public static void main(String[] args) {
    String str = "abababcdabcdef";
    String ret = str.replace("ab","pp");
    System.out.println(ret);
}

 打印结果:

③替换首个内容

public static void main(String[] args) {
    String str = "abababcdabcdef";
    String ret = str.replaceFirst("ab","pp");
    System.out.println(ret);
}

打印结果:

6.字符串拆分 

①将字符串全部拆分

public static void main(String[] args) {
    String str = "name=zhangsan&age=19";
    String[] st = str.split("=");
    for (String s:st) {
       // System.out.println(s);
       String[] str1 = s.split("&");
        for (String ss :str1) {
            System.out.println(ss);

        }
    }
}

打印结果:

②字符串截取

public static void main(String[] args) {
    String str = "abcdefg";
    //给个0不会产生新的对象,默认返回原来的对象
    String str1 = str.substring(2);//从下标为2的位置开始提取子串,相当于new了一个新的对象
    System.out.println(str1);
}

 打印结果:

 打印结果:

③去掉字符串中的左右空格,保留中间空格

public static void main(String[] args) {
    String str = "    abc     df      ";
   String ret = str.trim();
    System.out.println(ret);
}

打印结果:

④字符串转大写

public static void main(String[] args) {
    String str = "abcdefGHEDF123";
    String ret = str.toUpperCase();
    System.out.println(ret);

}

 打印结果:

⑤字符串转小写

public static void main(String[] args) {
    String str = "abcdefGHEDF123";
    String ret = str.toLowerCase();
    System.out.println(ret);

}

 打印结果:

⑥字符串拼接

public static void main(String[] args) {
    String str = "abcdef";
    String st = str.concat("ppp");//拼接后的结果不如池
    System.out.println(st);


}

 打印结果:

 ⑦判断是否为空字符串,但不是null,而是长度为0

public static void main(String[] args) {
    String str = "abcdef";
    System.out.println(str.isEmpty());
}

打印结果:

 7 .StringBuffer 和 StringBuilder

 ①StringBuilder

首先我们new一个sb,sout一下

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();
    System.out.println(sb);
}

打印结果:什么都没有

 如何打印出内容,StringBuilder的用法:第一种

new对象传参

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder("abcdef");
    System.out.println(sb);
}

 打印结果:

疑问?sb这个引用存的是地址啊?为什么能够打印出abcdef

答:sout本身底层调用的是sb这个引用类型的toString()方法。既然默认调用toString()方法就会把sb变成字符串形式,就是调用toString来new一个String

第二种: append()方法

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();
    sb.append("abcdef");//相当于把你的内容append到sb引用的对象当中
    System.out.println(sb);
}

打印结果:

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();
    sb.append("abcdef");
    sb.append("12344");
    System.out.println(sb);
}

打印结果:

append()方法自始至终返回的都是当前的对象,不会new新的对象。

append()方法可连用 :

 如果是在循环里面,进行字符串的拼接,尽量不要使用String,优先使用StringBuffer和StringBuilder

②StringBuffer

StringBuffer 与 StringBuilder的区别在于

一般情况下StringBuffer用在多线程情况下

StringBuilder用在单线程情况下

③ StringBuffer、StringBuilder与String相互转换

一、

//String->StringBuffer或者StringBuilder使用构造方法
public static StringBuffer func(){
    String str = "abcdef";
    return new StringBuffer(str);

}

二、

/StringBuffer或者StringBuilder->String调用toString()方法
public static String func2(){
    StringBuilder sb = new StringBuilder();
    return sb.toString();
}

注意:

String和StringBuffer类不能直接转换。

如果要想互相转换,可以采用如下原则:

String变为StringBuffer:

利用StringBuffer的构造方法或append()方法

StringBuffer变为String:

调用toString()方法。

  • 31
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 30
    评论
评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

K稳重

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值