Java 中的 String 类

本文详细分析了Java中String类的源码,探讨了其不可变性和存储特性,以及不同创建方式对内存的影响。通过实例讲解了字符串比较的正确方法,帮助理解字符串常量池和堆内存的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.String 源码分析

//String类被final 修饰所以不能被继承
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    /** The value is used for character storage. */
   
    private final char value[];
     //private 修饰说明value只能在String类内部使用,而且又没有提供get方法,所以外部无法获取value数 组,就无法改变数组中元素的值
    //final修饰说明value是常量,一旦创建,就不能被改变,value一旦被初始化成某个数组,将永远指向这个数组,不可能再指向其它的数组了	

 String类特点:
             (1)一切都是对象,字符串事物 "" 也是对象,类是描述事物,String类,描述字符串对象的类, 所有的 "" 都是String类的对象
             (2)字符串是一个常量,一旦创建,不能改变,其实就是说一旦这个字符串确定了,那么就会在内存区域中就生成了这个字符串。字符串本身不能改变,但str变量中记录的地址值是可以改变的。

* String:
     *         字符串的类
     *         本质: 就是一个字符数组(字符串成的串)
     *         特点: String是一个不可改变的字符序列, 一旦被赋值, 就不能被更改!
     *         注意: String s = "abc";        // 实际上是创建了一个对象.

2.String类创建方式和比较

 * A: String类创建方式和比较
        * a: 创建对象的数量比较
            * String s3 = "abc";
                * 在内存中只有一个对象。这个对象在字符串常量池中
              * String s4 = new String("abc");
                * 在内存中有两个对象。一个new的对象在堆中,一个字符串本身对象,在字符串常量池中
        * b: 案例代码

  public class StringDemo2 {
                public static void main(String[] args) {
                    //字符串定义方式2个, 直接=  使用String类的构造方法
                    String str1 = new String("abc");
                    String str2 = "abc";
                    System.out.println(str1);
                    System.out.println(str2);
                    
                    System.out.println(str1==str2);//引用数据类型,比较对象的地址 false
                    System.out.println(str1.equals(str2));//true
                }
            }

3.String 面试题

1、判断定义为String类型的s1和s2是否相等
            * String s1 = "abc";
            * String s2 = "abc";
            * System.out.println(s1 == s2);             // true 字符串常量池问题        
            * System.out.println(s1.equals(s2));         // true 比较的是字符序列
    2、判断定义为String类型的s1和s2是否相等
            * String s1 = new String("abc");            
            * String s2 = "abc";
            * System.out.println(s1 == s2);                // false  s2指向的是常量池的地址值, s1指向的是堆内存的地址值.
            * System.out.println(s1.equals(s2));
    3、判断定义为String类型的s1和s2是否相等
            * String s1 = "a" + "b" + "c";
            * String s2 = "abc";
            * System.out.println(s1 == s2);                // true, 因为java有常量优化机制."a" + "b" + "c"是常量在拼接
            * System.out.println(s1.equals(s2));
    4、判断定义为String类型的s1和s2是否相等
            * String s1 = "ab";
            * String s2 = "abc";
            * String s3 = s1 + "c";        
            * System.out.println(s3 == s2);                //false  s3记录的是堆内存中String对象的地址值
            * System.out.println(s3.equals(s2));
  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值