这是我在采访中得到的一个问题.
我有两个字符串定义为
String s1="Java";
String s2="Java";
Run Code Online (Sandbox Code Playgroud)
我的问题是这两个引用是否指向相同的内存位置.通常,当我们创建相同的字符串(没有new关键字)时,内容是否只存储在内存中一次,所有具有相同内容的String对象只是引用相同的位置,而不是冗余地存储字符串"Java"?s1和s2的哈希码是相同的.但是哈希码是否直接依赖于对象的内存位置?
我想更深入地理解字符串池.请帮助我在Java中获取包含此实现的源类文件.
问题更多的是找到源代码或字符串池的实现,以深入研究这个概念,以更多地了解其中的一些未知或难以捉摸的事物.通过这种方式,我们可以更有效地使用字符串,或者考虑使用其他方法来实现我们自己的垃圾收集,以防我们有一个应用程序创建了如此多的文字和字符串对象.
我知道StringBuilder应优先于String,因为String将保存在常量字符串池中,并为其分配新值不会覆盖以前的值.但是,StringBuilder是一个覆盖其先前值的对象.
另外如果我在Hibernate的支持类中有String类型的变量,我应该使用StringBuilder吗?怎么样?
...
Result result = (Result) criteria.list().get(0);
class Result{
String name;
String fname;
...
}
Run Code Online (Sandbox Code Playgroud)我知道有两种方法可以在Java中创建String:
String a = "aaa";
String b = new String("bbb");
Run Code Online (Sandbox Code Playgroud)
第一种方式,Java肯定会在字符串池中创建一个String对象并a引用它.(假设"aaa"之前不在游泳池里.)
使用第二种方法,将在堆中创建一个对象,但是jvm还会在字符串池中创建一个对象吗?
在这篇关于Java字符串池的问题中,@ Jesper说:
如果你这样做:
Run Code Online (Sandbox Code Playgroud)String s = new String("abc");然后在池中将有一个String对象,一个代表文字"abc",>的对象,并且将有一个单独的String对象,而不是在池中,它包含池对象的>内容的副本.
如果这是真的,那么每次使用new String("bbb");,在池中创建一个对象"bbb",这意味着通过上面的任何一种方式,java将始终在池中创建一个字符串对象.然后intern()用于什么?在文档http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern()中,它说:
调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串.否则,将此String对象添加到池中,并返回对此String对象的引用.
这意味着有些情况下池中没有字符串,这可能吗?哪一个是真的?
When creating a String in Java, what is the difference between these two:
String test = new String();
test = "foo";
Run Code Online (Sandbox Code Playgroud)
and
String test = "foo";
Run Code Online (Sandbox Code Playgroud)
When do I need to use the keyword new? Or are these two basically the same and they both create a new String object?
有人问我这个问题:
String s = "abc"; // creates one String object and one
// reference variable
In this simple case, "abc" will go in the pool and s will refer to it.
String s = new String("abc"); // creates two objects,
// and one reference variable*
Run Code Online (Sandbox Code Playgroud)
基于以上细节,在下面的代码的println语句之前创建了多少个String对象和多少个引用变量?
String s1 = "spring ";
String s2 = s1 + "summer ";
s1.concat("fall ");
s2.concat(s1);
s1 += "winter ";
System.out.println(s1 + " " + s2);
Run Code Online (Sandbox Code Playgroud)
我的回答是这个代码片段的结果是春冬春夏
有两个参考变量,s1和s2.共创建了八个String对象:"spring","summer"(lost),"spring summer","fall"(lost),"spring fall"(lost),"spring spring spring"(丢失) ),"冬天"(丢失),"春天的冬天"(此时"春天"丢失).
在此过程中,八个String对象中只有两个不会丢失.
这是对的吗?
我知道问题的标题不是很清楚,对不起,不知道如何提出.我有一个非常基本的java实现问题,我想关注应用程序性能,但它也涉及java中的String创建模式.
我理解Java中字符串的不变性概念.我不确定的是,我在某处读到以下内容不会产生两个不同的String对象:
String name = "Sambhav";
String myName= "Sambhav";
Run Code Online (Sandbox Code Playgroud)
我想知道Java是如何做到的?它是否实际在程序存储器中查找String值并检查其是否存在,如果它不存在则创建一个新的String对象?在这种情况下,显然它节省了内存,但存在性能问题.
还可以说我有这样的代码:
public void some_method(){
String name = "Sambhav";
System.out.println(name); // or any random stufff
}
Run Code Online (Sandbox Code Playgroud)
现在每次调用此函数时,是否有新的String被添加到内存中或者我使用相同的String对象?我很想知道这一切是如何发生的见解的?
如果我们这样说的话
String name = "Sambhav";
String myName= "Sambhav";
Run Code Online (Sandbox Code Playgroud)
因为参考不会创建新对象,怎么样
String name = new String("Sambhav");
String myName= new String("Sambhav");
Run Code Online (Sandbox Code Playgroud)
Java仍然能够捕获字符串是否相同,只是将myName指向与前一个语句中创建的对象相同的对象?
说我有这个String表达
String hi = "Tom" + "Brady" + "Goat"
Run Code Online (Sandbox Code Playgroud)
我知道字符串池"允许运行时通过在池中保留不可变字符串来节省内存" 字符串池
字符串池中将创建多少个字符串?
我最初的猜测是5 - ,"Tom","Brady","Goat","TomBrady","TomBradyGoat"因为操作顺序的String级联(左到右?),或者是它只是最后的结果,"TomBradyGoat",存储在字符串池?
String str1 = new String("I love programming");
String str2 = new String("I love programming");
boolean boo = str1 == str2; // evaluates to false
String str1 = "I love programming";
String str2 = "I love programming";
boolean boo = str1 == str2; // evaluates to true
Run Code Online (Sandbox Code Playgroud)
为什么第一个评估为假,第二个评估为真?
在这里你可以找到更多:什么是Java字符串池以及"s"与新String("s")有何不同?
哪一个更好?
public class A {
private static final String DOSOMETHING_METRICS = "doSomethingmetrics";
private static final String SAYSOMETHING_METRICS = "saySomethingmetrics";
public void doSomething() {
...
System.out.println("Metrics for " + DOSOMETHING_METRICS + "is something");
}
public void saySomething() {
...
System.out.println("Metrics for " + SAYSOMETHING_METRICS + "is something");
}
}
Run Code Online (Sandbox Code Playgroud)
要么
public class A {
public void doSomething() {
final String DOSOMETHING_METRICS = "doSomethingmetrics";
...
System.out.println("Metrics for " + DOSOMETHING_METRICS + "is something");
}
public void saySomething() {
final String SAYSOMETHING_METRICS = …Run Code Online (Sandbox Code Playgroud)