Java中的字符串表示

Lio*_*ion 1 java

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


包含相同类型的值和相同方法的对象组合在一起成为类.可以将类视为这些对象的类型定义.因此,Java中的String如何表示?让我们考虑Java中的以下代码片段.

 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在将其转换为大写后显示String.在此语句中String s="black lion";,Where被分配的位置.它是被分配到String类中的实例变量还是某个地方?并在此声明中"black lion".toUpperCase();.它是String类的对象吗?怎么样?

Mik*_*uel 5

字符串是char[]包含一系列UTF-16代码单元,int该数组的偏移量和int长度.

我认为你混淆的根源是这个想法

String s
Run Code Online (Sandbox Code Playgroud)

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

它不是.它为字符串引用创建空间.分配副本引用,但不修改这些引用引用的对象.

你也应该意识到这一点

new String(s)
Run Code Online (Sandbox Code Playgroud)

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

Java的双引号的字符串像"my string"真的来引用实习 String情况下,这样"foo"是相同的字符串实例的引用,不管它有多少次出现在你的代码.

  • ``hello"`创建一个汇集的实例,`new String(...)`创建一个非池实例.试试`System.out.println(("hello"=="hello")+","+(new String("hello")=="hello")+","+(new String("hello") == new String("hello")));`你应该看到`true,false,false`. (2认同)