String类--创建字符串以及字符串的相关操作

String类的介绍

String类是字符串操作类,String对象由0或多个包含在""下的字符组成,Java中把String类用final声明即创建后就不可修改。

在这里插入图片描述

创建字符串

方式一:直接赋值

String str = "abc";

方式二:通过构造方法产生对象

String str1 = new String("abc");

方式三:通过字符数组产生对象

 char[] data = new char[]{'a','b','c'};
        String str2 = new String(data);

方式四:通过String的静态方法valueOf(任意数据类型)转变为字符串

String str3 = String.valueOf(123);

字符串字面

字面量:直接写出来的数值就称为字面量
10 -> int字面量
10.1 -> double字面量
true -> boolean字面量
“abc” -> String字面量(也是一个字符串对象)

当写出如下代码:

  String str = "abc";//字符串字面量,同时也是字符串对象
  String str1 = str;
  str = "A";
  System.out.println(str);
  System.out.println(str1);

输出:

A
abc

当前堆和栈中的操作为:
在这里插入图片描述

字符串比较相等

所有引用类型在比较相等时,都使用equals方法比较,JDK常用类都已经覆写了equals方法,可以直接使用。
注:引用数据类型使用"=="比较的是地址。

public class Stringtest {
    public static void main(String[] args) {
        String str = "abc";//字符串字面量,同时也是字符串对象
        String str1 = str;
        System.out.println(str.equals(str1));
    }
}

输出:

true

此处插入一个小细节:

 String str = "abc";
 System.out.println(str.equals("abc"));//方式一
 System.out.println("abc".equals(str));//方式二

此处方式一和方式二都可以判断两个字符串是否相等,但是此时str对象若是一个空对象就会出错,所以我们推荐使用方式二

字符串常量池

在产生字符串对象时:出现字符串字面量,若该字面量是第一次出现(常量池中不存在),则新建一个该对象加入常量池;若出现new关键字,则在堆中开辟一个新内存并复制该实例对象的内容,该引用指向堆中新开辟出来的对象

String str = new String("abc");
String str1 = "abc";

这两行代码产生的具体操作如下:
在这里插入图片描述

手工入池

String类提供了intern方法,调用intern啊方法会将当前字符串引用指向的对象保存到字符串常量池中 ,规则如下:
1.若当前常量池中已经存在了该对象,则不再产生新的对象,返回常量池中的String对象。
2.若当前常量池中不存在该对象,则将该对象入池,返回入池后的地址

常量池存在该对象:

public class Stringtest {
    public static void main(String[] args) {
       String str1 = new String("hello");
       str1.intern();
       String str2 = "hello";
       System.out.println(str1 == str2);
    }
}

输出:

false

此时常量池中已经存在了"hello",不再产生新的对象,返回常量池中字符串对象地址,但str1并没有接受该地址,所以str1并没有改变指向对象。
在这里插入图片描述

public class Stringtest {
    public static void main(String[] args) {
       String str1 = new String("hello");
       str1 = str1.intern();
       String str2 = "hello";
       System.out.println(str1 == str2);
    }
}

输出:

true

此时str1接收了返回的地址,所以和str2指向同一个对象,地址相等。
在这里插入图片描述
常量池不存在该对象:

public class Stringtest {
    public static void main(String[] args) {
      char[] data = new char[]{'a','b','c'};
      String str = new String(data);
      str.intern();
      String str1 = "abc";
        System.out.println(str == str1);
    }
}

输出:

true

这里new String后面括号里的是字符数组,没有字符串对象,所以常量池中没有"abc",使用str的intern方法入池返回入池后的地址
在这里插入图片描述

字符串的不可变性

所谓字符串的不可变性指的是字符串对象的内容不可变,而不是字符串引用不可变。

比如:
在这里插入图片描述
这里的不可变指的是:
“hello”,“world”,“!!!”,"hellowworld!!!"不可变
在这里插入图片描述
那么为何字符串对象无法修改内容呢?
在这里插入图片描述

字符串其实就是一个字符数组 -> char[],字符串保存的值实际上在数组中保存,这个字符数组用final修饰,String类的外部拿不到这个数组,因此字符串对象的内容无法改变。
在这里插入图片描述

如何修改字符串内容

1.在运行时通过反射破坏数组的封装
2.更换使用StringBuilder或者StringBuffer类(使用StringBuilder性能更高,使用StringBuffer线程更安全)
若需要频繁的进行字符串的拼接,使用StringBuilder类的append方法

在这里插入图片描述

这里需要注意:StringBuilder和StringBuffer是两个独立的类,StringBuilder就是为了解决字符串的拼接问题产生的。

String和StringBuilder之间的转换

1.StringBuilder -> Staring

使用StringBuilder的toString方法:

String st = sb.toString();

2.String -> StringBuilder
使用StringBuilder的构造方法或者append方法:

StringBuilder sb = new StringBuilder("abc");
sb.append("abc");

字符串的相关操作

字符串的反转操作

先把String类转变为StringBuilder类,使用StringBuilder类的reverse方法进行字符串反转

public class StringBuilderTest {
    public static void main(String[] args) {
        String str = "abc";
        StringBuilder sb = new StringBuilder(str);
        sb.reverse();
        System.out.println(str);
        System.out.println(sb);
    }
}

输出:

abc
cba

删除字符串指定范围的数据

先把String类转变为StringBuilder类使用StringBuilder类的delete方法进行删除

public class StringBuilderTest {
    public static void main(String[] args) {
        String str = "abcabc";
        StringBuilder sb = new StringBuilder(str);
        sb.delete(3,6);
        System.out.println(str);
        System.out.println(sb);
    }
}

输出:

abcabc
abc

字符串的插入操作

同样也是先把String类转变为StringBuilder类,使用StringBuilder类的insert方法进行插入

public class StringBuilderTest {
    public static void main(String[] args) {
        String str = "abcabc";
        StringBuilder sb = new StringBuilder(str);
        sb.insert(3,"&&");
        System.out.println(str);
        System.out.println(sb);
    }
}

输出:

abcabc
abc&&abc

字符串的比较操作

方法

public boolean equals(Object anObject); //区分大小写

public boolean equalsIanoreCase(String anotherString); //不区分大小写的比较

public int comparaTo(String anotherString); //比较两个字符串大小关系(按ASCII比较)

String str1 = "abc";
String str2 = "Abc";
System.out.println(str1.equals(str2));  
System.out.println(str1.equalsIgnoreCase(str2));
System.out.println(str1.compareTo(str2));

输出:

false
true
32

字符和字符串的相互转换

1char -> String

通过构造方法:
public String(char);
public String(char,value[],int offset,int count); //将部分字符数组中的内容变为字符串

char[] data = new char[]{'a','b','c'};
      String str = new String(data);
      String str1 = new String(data,1,2);
        System.out.println(str);
        System.out.println(str1);

输出:

abc
bc

2.String -> char

方法
1.取出字符串中指定索引的字符
public char charAt(int index);
2.将字符串中的内容转为字符数组
public char toCharArray(); //此时产生了一个新的字符数组,将字符串的内容复制过去

public class Stringtest {
    public static void main(String[] args) {
      String str = "abcdefg";
      char data1 = str.charAt(1);
      char[] data2 = str.toCharArray();
        System.out.println(data1);
        System.out.println(data2);
    }
}

输出:

b
abcdefg

判断字符串是否是由纯数字组成

具体步骤如下:

方法一:
1.将字符串转变为字符数组
2.使用for-each循环遍历字符数组
3.若遇到小于’0‘或者大于’9’的字符就判定错误反之则对

public class StringIsNumber {
    public static void main(String[] args) {
        String str1 = "123";
        String str2 = "123a";
        System.out.println(isNumber(str1));
        System.out.println(isNumber(str2));
    }
        public static boolean isNumber(String str){
            //先把字符转转换为字符数组
            char[] data = str.toCharArray();
            //再遍历整个字符数组看看是否全为数字
            for (char c : data) {
                if (c < '0' || c > '9') {
                    return false;
                }
            }
            return true;
    }
}

输出:

true
false

方法二:
1.将字符串转变为字符数组
2.使用for-each循环遍历字符数组
3.使用char的包装类Character类中的isDigit方法判断是否为纯数字

public class StringIsNumber {
    public static void main(String[] args) {
        String str1 = "123";
        String str2 = "123a";
        System.out.println(isNumber(str1));
        System.out.println(isNumber(str2));
    }
        public static boolean isNumber(String str){
            //先把字符转转换为字符数组
            char[] data = str.toCharArray();
            //再遍历整个字符数组看看是否全为数字
            for (char c : data) {
                if(!Character.isDigit(c)){
                    return false;
                }
            }
            return true;
    }
}

输出:

true
false

字符串和字节的相互转换

意义:将字符串保存到文件中或是通过网络传输都要用到字节数组

1.字符串转为字节:
String -> byte[]
方法
public byte[] getBytes() //将字符串以及字节数组的形式返回
public byte[] getBytes(String charsetName) //按照指定的编码格式转为字节数组

import java.nio.charset.StandardCharsets;
import java.util.Arrays;

public class Stringtest {
    public static void main(String[] args) {
      String str1 = "你好中国!";
      byte[] bytes = str1.getBytes(StandardCharsets.UTF_8);
        System.out.println(Arrays.toString(bytes));
    }
}

输出:

[-28, -67, -96, -27, -91, -67, -28, -72, -83, -27, -101, -67, -17, -68, -127]

2.字节转换为字符串
byte[] -> String
方法:
public String(byte bytes[]) // 将字节数组变为字符串
public String(byte bytes[],int offset,int length) //将部分字节数组中的内容变为字符串

public class Stringtest {
    public static void main(String[] args) {
      byte[] bytes = new byte[]{97,98,99};
      String str = new String(bytes);
        System.out.println(str);
    }
}

输出:

abc

字符串查找操作

1.public boolean contains(CharSequence s) //判断一个子字符串是否存在
2. public int indexOf(String str) //从字符串开头查找自定字符串的位置,找到返回该字符串第一次出现的索引,没找到返回-1
3.public boolean startsWith(String prefix) //判断是否以指定字符串开头
4.public boolean endsWith(String suffix) //判断是否以指定字符串结尾

public class Stringtest {
    public static void main(String[] args) {
      String str = "hellow world";
        System.out.println(str.contains("he"));
        System.out.println(str.indexOf("l"));
        System.out.println(str.startsWith("h"));
        System.out.println(str.endsWith("w"));
    }
}

输出:

true
2
true
false

字符串的替换操作

1.public String replaceAll(String regex,String replacement) //替换所有指定内容
2.public String replaceFrist(String regex,String replacement) //替换首个内容

public class Stringtest {
    public static void main(String[] args) {
      String str = "hellow world";
        System.out.println(str.replaceAll("l"," "));
        System.out.println(str.replaceFirst("l"," "));
    }
}

输出:

he  ow wor d
he low world

字符串的拆分操作

1.public String[] split(String regex) //将字符串全部拆分
2.public String[] split(String regex,int limit) //将字符串部分拆分,该数字组长度就是limit极限

import java.util.Arrays;

public class Stringtest {
    public static void main(String[] args) {
      String str = "hello java hellow world";
        System.out.println(Arrays.toString(str.split(" ")));
        System.out.println(Arrays.toString(str.split(" ",3)));
    }
}

输出:

[hello, java, hellow, world]
[hello, java, hellow world]

字符串的截取处理

1.public String substring(int beginIndex) //从指定索引截取到结尾
2.public String substring(int beginIndex,int endIndex) //截取部分内容
注:产生了新的字符串,原字符串不变

public class Stringtest {
    public static void main(String[] args) {
      String str = "hellow world";
        System.out.println(str.substring(7));
        System.out.println(str.substring(0,6));
    }
}

输出:

world
hellow

其他常用方法

1.public String trim() //去掉字符串中的左右空格,保留中间空格
2.public String toUpperCase() //字符串大写
3.public String toLowerCase() //字符串小写
4.public int length() //取得字符串长度
5.public boolean isEmpty() //判断是否为空字符串,但不是null,是长度为0

public class Stringtest {
    public static void main(String[] args) {
      String str = " hellow world ";
      String str1 = "AbCd";
        System.out.println(str.trim());
        System.out.println(str.toUpperCase());
        System.out.println(str1.toLowerCase());
        System.out.println(str.isEmpty());
        System.out.println(str.length());
    }
}

输出:

hellow world
 HELLOW WORLD 
abcd
false
14

总结
一定记住,所有针对字符串的操作均无法修改原字符串的内容,都是产生了新的字符串做处理!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值