【 java 常用类】你不知道的String

发布于:2022-11-09 ⋅ 阅读:(14) ⋅ 点赞:(0) ⋅ 评论:(0)

📋 个人简介

  • 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
  • 📝 个人主页:馆主阿牛🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:java 小白到高手的蜕变🍁
  • 💬格言:要成为光,因为有怕黑的人!🔥
    请添加图片描述

前言

我们都知道String是一个不可变的对象,但之前总归是对他的理解有点浅,这里再大概补充总结一下!

String的特性

  • String 类:代表字符串。 Java 程序中的所有字符串字面值(如" abc ")都作为此类的实例实现。
  • String 是一个 final 类,代表不可变的字符序列。
  • 字符串是常量,用双引号引起来表示。它们的值在创建之后不能更改。
  • String 对象的字符内容是存储在一个字节数组 value []中的。

在这里插入图片描述
如图,我们可以看到String类实现了Serializable接口,表明String类是支持序列化的;实现了Comparable接口,表明String可以比较大小。

String类声明为final,表示不可被继承!

String对象的创建

//方式一:字面量定义的方式
String s1 = "aniu"; //在常量池中
//方式二:new+构造器
String s = new String("aniu"); //本质上this.value=original.value,这样创建的字符串在堆中     

大概常用的就这两种,当然,String还有很多构造器,可以自行去了解!

String不同实例化方式的对比

public static void main(String[] args) {
        //通过字面量定义的方式,此时s1和s2的数据申明在方法区的常量池中
        String s1 = "aniu";
        String s2 = "aniu";
        //通过new+构造器的方式:此时s3和s4保存的地址值,是数据在堆空间中开辟空间以后对应的地址值
        String s3 = new String("shui");
        String s4 = new String("shui");
        System.out.println(s1==s2); //true
        System.out.println(s3==s4); //false
        System.out.println(s1==s3); //false
        System.out.println(s1==s4); //false
    }

在这里插入图片描述

这个比较大家应该都很清楚,字符串常最存储在字符串常量池,目
的是共享;字符串非常量对象存储在堆中。
例如String s1 = “abc” 和 String s2 = new (“abc”) 他们的区别来看下图:

在这里插入图片描述
当然,在这里我的目的不是写这个大家都知道的,来看看下面这些:

String s1 = "hello";
        String s2 = "world";
        String s3 = "hello" + "world";
        String s4 = s1 + "world";
        String s5 = s1 + s2;
        String s6 = (s1+s2).intern();
        System.out.println(s3==s4); //false
        System.out.println(s3==s5); //false
        System.out.println(s4==s5); //false
        System.out.println(s3==s6); //true

在这里插入图片描述
是不是有点懵了,看看图解:
在这里插入图片描述
结论:

  • 常量与常量的拼接结果在常量池。且常最池中不会存在相同内容的常量。
  • 只要其中有一个是变量,结果就在堆中。
  • 如果拼接的结果调用 intern ()方法,返回值就在常量池中。

再来看看这个:

final String s1 = "hello";
String s3 = "hello" + "world";    
String s7 = s1 + "world";
System.out.println(s3==s7); //true

结论不是说只要其中有一个是变量,结果就在堆中吗,怎么结果又是true,是的,结论没有问题,这里你要注意是被final修饰的,因此s1也是常量哦!

易错String面试题

1.面试题: String s = new String (" abc “);方式创建对象,在内存中创建了几个对象?
两个:一个是堆空间中 new 结构,另一个是 byte[] 对应的常量池中的数据:” abc "。
2.

public class Test {
    public static void main(String[] args) {
        String str = new String("aniu");
        char[] ch = {'6','6','6'};
        change(str,ch);
        System.out.println(str);
        System.out.println(ch);
    }
    public static void change(String str1, char ch1[]){
        str1 = "tom";
        ch1[0] = 'h';
    }
}

在这里插入图片描述

这是一道比较易错的题,一定要切记,我们的String是不可变的!
在这里插入图片描述

结语

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。

🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门