String类以及字符串详解

目录

一、JDK中String类的声明

二、创建字符串的四种方式

1、直接赋值

2、通过String的构造方法产生对象

3、通过字符数组产生对象

4、通过String的静态方法valueOf(任意类型)

 三、String引用数据类型

1、字面量和字符串对象

 2、字符串的比较

3、关于字符串的常量池问题

​ 4、手工入池

 4、字符串的不可变性

5、如何修改字符串内容

五、字符串的其他常见操作

1、字符串比较

 2、字符和字符串的相互转换

 (1)字符转换到字符串,通过字符串的构造方法

(2)字符转换到字符串,通过字符串的有参构造实现

(3)字符串到字符

 (4)将字符串中的内容转为字符数组(String->char[])

(5)判断一个字符串是否是纯数字组成

 (6)字符串和字节的相互转换

 (7)字符串到字符的转换

 (8)字符串查找操作

 (9)字符串替换

(10)字符串的拆分操作

(11)字符串截取处理

(12)字符串的其他操作方法

​ 六、相关代码


一、JDK中String类的声明

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

String实现了多个接口,就具备了多种能力。

为什么String要用final修饰?

可以知道的是被final修饰的类无法被继承,所以String就不存在子类,这样的话就可以保证所有使用JDK的人,大家所用到的String类仅此一个。

二、创建字符串的四种方式

 String str1="hello world";
        String str2=new String("hello world");
        char[] arr={'a','b','c'};
        String str3=new String(arr);
        String str4=String.valueOf(10);

1、直接赋值

String str=''hello world'';

2、通过String的构造方法产生对象

String str2=new String(''hello world'');

3、通过字符数组产生对象

char[] arr=new char[]{'a','b','c'};

4、通过String的静态方法valueOf(任意类型)

String str=String.valueOf(10);

 三、String引用数据类型

1、字面量和字符串对象

String str=''hello world'';等号后面这一部分既是字面量,也是字符串对象。

 2、字符串的比较

所有引用数据类型在比较时,等号hi用equals方法比较,JDK的常用类都已经重写了equals方法,大家直接使用即可。引用数据类型使用“==”比较的是地址是否相等。

注意,当牵扯到用户输入时,一定要做判空处理

如果使用第一种比较方法就会出现空指针异常,因为我们要比较的特定内容本身就是字符串字面量,一定不是空对象,把要比较的内容放在equals的前面,就可以方便处理name为空的问题。

3、关于字符串的常量池问题

 可以发现,此第一个图中的str1,str2和str3使用“==”比较都返回了true,但是在第二个图中的又都返回了false,这是怎么回事呢?

当使用直接赋值法创建字符串对象时,JVM会维护一个字符串的常量池,若该对象在堆中还不存在,则产生一个新的字符串对象加入常量池中。当继续使用直接赋值法产生字符串对象时,JVM发现该引用指向的内容在常量池中存在了,则此时就不在新建字符串对象,而是复用已有的字符串对象。

4、手工入池

 public native String intern();

String类提供的intern方法:

调用intern方法会将当前字符串引用指向的对象保存到字符串常量池中

①若当前常量池中已经存在了该对象,则不在产生新的对象,返回常量池中的String对象

②若当前常量池中不存在该对象,则将该对象入池,返回入池后的地址

 

对于str1.intern();这行代码来说,只是调用了一下,并没有接收intern方法的返回值,要想让str1等于str2,只需要接收一下返回值就行。

 4、字符串的不可变性

所谓的字符串不可变指的是字符串的对象不可变

这里的不可变指的是"hello" "world" "helloworld" "helloworld!!!"这些字符串对象一旦声明后就不可修改其内容了。

 String str1="hello";
        str1=str1+"world";
        str1+="!!!";
        System.out.println(str1);

为何字符串的对象无法修改内容呢?

字符串其实就是一个字符数组,字符串保存的值实际上在数组中保存。

5、如何修改字符串内容

(1)在运行时ton过反射破坏Value数组的封装(不推荐使用)

(2)更换使用StringBuilder或者StringBufer类

如果需要频繁的进行字符串的拼接,就可以使用StringBuilder类的append方法

 关于StringBuilder类的具体使用:

StringBuilder类和String类是两个独立的类,StringBuilder就是为了解决字符串拼接问题产生的,因为String的对象时无法修改的,为了方便字符的操作,产生了StringBuilder类,StringBuilder类的对象是可以改变的。

(3)String类和StringBuilder类的转换

①String类对象转换为StringBuilder类对象

StringBuilder sb=new StringBuilder("hello");
 sb.append("123");

②StringBuilder类对象转换为String类对象

String str= sb.toString();

③StringBuilder类的其他方法

字符串反转操作,使用StringBuilder提供的reserse()方法

删除字符串指定范围的数据,使用StringBuilder提供的delete(int start,int end),删除从start索引开始到end的内容,[start,end)区间范围左闭右开。

 插入操作,使用StringBuilder提供的insert(int start,各种数据类型),从索引为start开始插入任意类型的数据

五、字符串的其他常见操作

1、字符串比较

 字符串的compareTo方法是按照字符串内部的每个数组进行ASCLL的比较

 2、字符和字符串的相互转换

字符串的内部实际上就是使用字符数组存储的

 (1)字符转换到字符串,通过字符串的构造方法

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

(2)字符转换到字符串,通过字符串的有参构造实现

(3)字符串到字符

 (4)将字符串中的内容转为字符数组(String->char[])

  String str1="hello";
          char[] data=str1.toCharArray();
        System.out.println(data);

(5)判断一个字符串是否是纯数字组成

 public static boolean isAllNumber(String str){
        //将字符串转换为字符数组去处理
        char[] data=str.toCharArray();
        //遍历寻找反例
        for (char a:data
             ) {
            if (a<'0'||a>'9'){
                return false;
            }
        }
        return true;
    }

 (6)字符串和字节的相互转换

字节到字符串的转换按照ASCLL转换的

 (7)字符串到字符的转换

其中getBytes() 方法是按照默认字符编码转为字节数组的

 第二种是按照自定义字符编码转换的

在UTF-8编码下,一个汉字三个字节;在GBK编码下,一个汉字是两个字节

 (8)字符串查找操作

   String str="helloworld";
        //1、判断一个字符串是否存在
        System.out.println(str.contains("e"));
        //2、从头开始查找字符串,找到了返回字符串位置开始索引,找不到返回-1
        int a=str.indexOf("ello");
        System.out.println(a);
        //3、从指定位置开始查找子字符串位置
        int b=str.indexOf("o",3);
        System.out.println(b);
        //4、由后向前查找子字符串的位置
        int c=str.lastIndexOf("llo");
        System.out.println(c);
        //5、从指定位置从后向前查找
        int d=str.lastIndexOf("llo",7);
        System.out.println(d);
        //6、判断是否以指定字符串开头
        System.out.println(str.startsWith("he"));
        //7、从指定位置开始判断是否以指定字符串开头
        System.out.println(str.startsWith("llo",2));
        //8、判断是否以指定字符串结尾
        System.out.println(str.endsWith("ld"));

 (9)字符串替换

   String str="helloworld";
        //1、替换所有指定的内容
        String str1=str.replaceAll("l","-");
        System.out.println(str1);
        //2、替换首个字符内容
        String str2=str.replaceFirst("l","-");
        System.out.println(str2);

(10)字符串的拆分操作

 注意:当按照指定的格式去拆分字符串得到了一个空数组时

①这个指定的格式在字符中不存在

②这个指定的格式是个特殊字符,需要转义处理"\\."

(11)字符串截取处理

(12)字符串的其他操作方法

 将字符串的手字母大写

六、相关代码

任枭雄/rocket_class_Grammer - Gitee.com

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值