受到关于这个问题的评论的启发,我很确定Java String是在运行时而不是编译时间实现的 - 当然,事实上可以在不同的时间编译类,但在运行时仍然会指向相同的引用.
我似乎无法找到任何证据支持这一点.谁能证明这一点?
我正在查看String API,突然我遇到一个String空构造函数,即我们可以使用构造一个空的String对象 String s = new String()
我想知道它有用吗?
首先道歉,如果这是一个非常基本的问题,我只是想知道以下字符串定义之间的区别
String x= "hello";
String y = new String("hello");
Run Code Online (Sandbox Code Playgroud)
我知道在java中,String是一个类,它既不是原始也不是包装器(如果这是一种误解,请纠正我).考虑一个A类,到目前为止我已经看过任何类的以下声明.我认为A c;是有效的,A a = new A();也是有效的.我很困惑A a ="xyz";这就是我们如何在上面的第一种类型的定义中声明一个String.我确信上面两个定义是完全不同的,就像我说它x==y返回false.我知道y是对String对象的引用.什么是x,它是如何存储在内存中的,有趣的是我发现x和y都可以访问String类的所有方法.
那么一个人的优势是什么呢.我知道每个人的适用性.
String str = new String(“my literal”);
Run Code Online (Sandbox Code Playgroud)
在上面的语句中,将创建两个对象,一个作为字符串常量池中的字符串文字"my literal"(如果它不存在于字符串池中),另一个作为对象字符串("my literal")在堆区域中创建
Q-1我知道将字符串文字放在字符串池区域中的好处,但我无法想到在堆中创建重复对象的好处?
Q2-当我在一些堆栈中读取流链接时:如果使用新的String("我的文字")几乎总是坏的,因为你将在String常量池上创建2个字符串,而在具有相同值的堆上创建另一个字符串,那么我的问题是为什么Java在堆中创建重复对象?为什么java只是忽略在堆中创建?