【问题标题】:String representation in JavaJava中的字符串表示
【发布时间】:2011-12-25 13:43:53
【问题描述】:

字符串在 Java 中表示为对象。因此,对象包含存储在对象内的实例变量中的值。对象还包含对对象进行操作的代码体。这些代码体称为方法


包含相同类型值和相同方法的对象被分组到类中。一个类可以被视为这些对象的类型定义。因此,Java 中的 String 是如何表示的?让我们考虑下面的 Java 代码 sn-p。

 final public class Main
 {
    public static void main(String[] args)
    {
        String s="black lion";
        String s1=new String(s);

        System.out.println(s.toUpperCase());
        System.out.println("black lion".toUpperCase());
        System.out.println(s1.toUpperCase());
    }
}

以上代码将字符串转换为大写后显示。在此语句 String s="black lion"; 中,分配的字符串在哪里。它是被分配到 String 类中的实例变量中还是某处?在此声明中"black lion".toUpperCase();。它是 String 类的对象吗?怎么样?

【问题讨论】:

    标签: java


    【解决方案1】:

    字符串是一个char[],包含一系列UTF-16 code units、一个int到该数组的偏移量和一个int长度。

    我认为你困惑的根源在于

    String s
    

    创建一个分配到的字符串。

    它没有。它为字符串引用创建空间。分配复制引用,但不会修改这些引用所引用的对象。

    你也应该知道

    new String(s)
    

    并没有真正做任何有用的事情。它只是创建另一个实例,由与s 相同的数组、偏移量和长度支持。很少有这样做的理由,因此大多数 Java 程序员认为这是不好的做法。

    "my string" 这样的Java 双引号字符串实际上是对interned String 实例的引用,因此"foo" 是对同一个String 实例的引用,无论它在您的代码中出现多少次。

    【讨论】:

    • so String hello = new String("hello"); 将在字符串池中创建两个“hello”字符串对象还是一个?
    • "hello" 创建一个池化实例,new String(...) 创建一个非池化实例。试试System.out.println(("hello" == "hello") + "," + (new String("hello") == "hello") + "," + (new String("hello") == new String("hello")));,你应该会看到true,false,false
    【解决方案2】:

    字符串在 Java 中是不可变的,因此当您执行 println 时,toUpperCase 会创建一个新的 String(随后会被垃圾回收)。

    【讨论】:

      【解决方案3】:

      如果我得到你想知道的。 String 对象由双引号" 表示。这称为字符串文字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-05-04
        • 1970-01-01
        • 2018-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        相关资源
        最近更新 更多