如何使用“”来初始化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视为一个特殊的类,您可以通过两种方式进行初始化
-
直接分配文字
String a = "adsasdf";
-
作为使用新关键字的其他对象
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文字是String
types的
双引号内的文本创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,没有父对象,默认构造函数,…