如何使用“”来初始化string?

如果String和其他类一样,如何使用双引号来初始化?

Javastring是特殊的

Java的devise者们决定用一种面向对象的语言来保留原始types,而不是把所有东西都当作一个对象,从而提高语言的性能。 基元存储在调用堆栈中,需要更less的存储空间并且操作起来更便宜。 另一方面,对象存储在程序堆中,这需要复杂的内存pipe理和更多的存储空间。

出于性能的原因,Java的string被devise为处于基元和类之间。

例如

 String s1 = "Hello"; // String literal String s2 = "Hello"; // String literal String s3 = s1; // same reference String s4 = new String("Hello"); // String object String s5 = new String("Hello"); // String object 

在这里输入图像描述

**注意:***string文字*存储在公共池中。 这有助于共享具有相同内容的string的存储以节省存储空间。 通过new运算符分配的String对象存储在heap ,并且相同的内容不存储共享。

Java将String视为一个特殊的类,您可以通过两种方式进行初始化

  1. 直接分配文字

     String a = "adsasdf"; 
  2. 作为使用新关键字的其他对象

     String a = new String("adsasdf"); 

当您想要与==符号进行比较时,您需要特别小心:

 String a = "asdf"; String b = "asdf"; System.out.println(a == b); // True System.out.println(a.equals(b)); // True String a = new String("asdf"); String b = new String("asdf"); System.out.println(a == b); // False System.out.println(a.equals(b)); // True 

这是因为在第一种情况下,对象a和b被保存在一个叫做literal pool东西literal pool ,它们都引用了同一个对象,所以它们在两个方面都是相等的。

但在第二种情况下,a和b引用不同的对象,比如当我们初始化任何其他对象时。 所以它们与==运算符相比是不相等的,而它们的值是相等的。

string在JLS中得到了特殊的处理:它是文字存在的两种非基本types之一(另一种是Class*

从JLS :

string文字是对类String []的一个实例的引用。

*好吧,也有“空types”与“空字面” null ,但大多数人不认为“空types”是一个适当的types。

这是Java语言的一个特性。 源代码中的string文字被给予特殊处理。

这里的语言规范只是说string文字是Stringtypes的

双引号内的文本创build一个文字String对象。

 String myString = "Some text"; 

上面的代码使用双引号创build一个String对象。

string经常用于编程语言。 由于Java是面向对象的,string是一个对象。 为了避免繁琐的新string(“someString”); 语句每当你需要一个string对象时,java允许你使用string文字创build一个string对象。

但是你应该记住string的平等。 这里有一个简短的JUnittesting来展示我的意思。

  @Test public void stringTest() { // a string literal and a string object created // with the same literal are equal assertEquals("string", new String("string")); // two string literals are the same string object assertSame("string", "string"); // a string literal is not the same object instance // as a string object created with the same string literal assertFalse("string" == new String("string")); // java's String.intern() method gives you the same // string object reference for all strings that are equal. assertSame("string", new String("string").intern()); } 

只要提一下。 string文字是对类String实例的引用,您可以这样编写代码:

  “ABC” .getBytes();

  “A:B:C” .split( “:”);

  “爱” .codePointAt(0);

String是Java中的一个类。 你是对的,所以我们总是可以用new关键字来初始化。

但是当我们做这样的事情时:

String s = "";

上面的语句被编译器标记为一个特殊的String对象 ,然后在加载类的过程中加载JVM (加载在初始化之前完成),看看这是什么被称为string文字 ,它存储在string文字池中

所以可以使用new()""方法创build一个string,但是后者提供了一个string字面值,即使没有对该string对象的引用,string字面值也会留在堆中,因为它有一个来自string的引用池。

Java为我们做了两个步骤。

 String str = "hello"; 

相当于

 char data[] = {'h', 'e', 'l' , 'l', 'o'}; String str = new String(data); 

像[.NET] [1]也有类似的事情。

 String(Char[]) constructor 

 String(char[] value) 

添加引用: –

Java.lang.String不只是一个类。 这是核心语言的一个组成部分。 编译器有它的语法糖。 例如, ""就像new String("")的缩写。 当编写""编译器优化相同的string到同一个实例来节省空间。 "a" + 5 == "a5" ==> true

编译器有很多东西的语法糖,包括不必在对象版本和它们的本地types之间进行box / unbox,没有父对象,默认构造函数,…