我们都应该知道,new出来的对象会放在堆中分配空间,String 也是一样:String s = new String("s");
而String直接引用的值都放在常量池中,但对String类型的“+”运算值得弄清楚:
public static void test1() {
String s = "ab";
String a = "a" + "b";
System.out.println(s == a);//这里 true。
}
JVM对字符串常量的"+"运算,在编译期完成。在常量池中的值赋给各个变量的引用!在编译期即把字符串常量的值确定下来!
public static void test2() {
String s = "ab";
String a = "a";
String b = a + "b";
System.out.println(s == b);//这里 false;
}
JVM对字符串引用的“+”运算,如果有字符串引用的存在,在编译期无法确定引用的值指向。只有在程序运行期通过动态分配并将链接后的地址赋予。 如果String a = "a" 换成 final String a = "a"那么返回的就是true。有了final修饰后,它在编译时被解析为常量值的一个本地拷贝存储到自己的常量池中或嵌入到它的字节码流中,所以和"a" + "b"是相同的效果!
注意 只有在编译期确定下来相同的值后方能 == 。这里的操作都在常量池中进行!不同于new出来的String !
分享到:
相关推荐
5. 注意事项:尽管`intern()`可以优化内存,但过度使用可能会增加方法区的压力,导致性能下降或`OutOfMemoryError`。因此,明智地使用`intern()`是很重要的。 6. 静态字符串池:在Java 8之后,字符串常量池被移到了...
intern 方法的注意事项 intern 方法也有一些需要注意的事项: * intern 方法只能用于字符串对象,不能用于其他类型的对象。 * intern 方法只能将字符串对象添加到字符串常量池中,不能将其他类型的对象添加到常量...
在Java编程过程中,掌握一些关键的注意事项至关重要,这不仅能提高代码质量,还能避免常见的编程陷阱。以下是一些关于"JAVA注意事项"的详细说明: 1. **命名规范**:Java有严格的命名规则,类名应使用驼峰式命名,...
### 架构设计-性能篇:性能设计注意事项 在架构设计的过程中,性能设计是一个至关重要的环节,但往往容易被忽视。良好的性能设计不仅能够确保系统的高效运行,还能够在一定程度上减少后期维护的成本与复杂度。以下...
### Java基础复习笔记03:我们不会注意的陷阱 ...以上就是Java编程中一些常见的陷阱及注意事项,这些细节往往在面试或笔试中容易被忽视。通过对这些知识点的理解和掌握,可以有效避免实际开发中的潜在问题。
- String常量池:Java为了优化性能,字符串字面量(直接量)会存储在常量池中。如果多个地方引用相同的字符串直接量,它们会共享同一个对象。例如,`String s1 = "Hello"; String s2 = "Hello";`,这里的s1和s2都...
String类的使用注意事项: * 不建议使用new关键字,因为使用new会创建两个对象。 * 如果多个字符串进行拼接,将会形成多个对象,这样可能会造成内存溢出,会给垃圾回收带来工作量。 String类的常用方法: * ...
- **注意事项**: `new String()`创建的对象不会放入常量池中。 **34. String和StringBuffer的区别** - **知识点**: `String`是不可变的,而`StringBuffer`是可变的。 - **注意事项**: `StringBuffer`更适合在多...
使用 String 的注意事项 - **初始化与赋值**:在类成员变量的初始化时,最好直接赋值而不是使用 `new` 关键字。这样做可以利用字符串常量池的优点,提高性能。例如: ```java public class Demo { private ...
在构建Web应用程序并连接到数据库时,需要注意一系列关键点,以确保数据的稳定访问和安全性。以下是关于这个主题的一些重要知识点: 1. **数据库表名的大小写敏感性**: 在PostgreSQL中,表名默认是不区分大小写的...
关于内存管理和字符串常量池,`"abc" + "def"`会直接在常量池中合并为一个字符串,而`new String(s1)`则在堆上创建新的对象,所以`s1 == s2`为`false`,但`s1.equals(s2)`为`true`。 在内存占用方面,题目中提到了...
- **注意事项**:由于 `String` 是不可变的,频繁进行字符串拼接可能导致内存浪费。应考虑使用 `StringBuilder` 或 `StringBuffer`。 #### StringBuffer 和 StringBuilder - **StringBuffer**:类似于 `String` 的...
- **重写注意事项**:重写 `equals` 方法时应确保遵循以下原则: - 自反性:`x.equals(x)` 必须返回 `true`。 - 对称性:`x.equals(y)` 与 `y.equals(x)` 必须返回相同的值。 - 传递性:如果 `x.equals(y)` 和 `y...
- `ldc`、`ldc_w`、`ldc2_w`:用于将常量池中的int、float或String型常量值,以及long或double型常量值推送到栈顶。 #### 局部变量加载指令 ##### load系列指令 - `iload`系列:加载int型本地变量至栈顶。 - `...
- **字符串常量池**:通过直接赋值方式创建的字符串会被放入常量池中,提高效率和减少内存消耗。 **2. 构造器** - **常见构造器**: - `public String()`:创建一个空字符串。 - `public String(byte[] bytes)...
`String str="i"`会将字符串常量放入常量池,而`new String("i")`会在堆中创建一个新的对象,即使内容相同,也是两个不同的对象。 7. **字符串反转**: 使用`StringBuilder`或`StringBuffer`的`reverse()`方法...
- **注意事项**: - 断言默认是禁用的,可以通过 `-ea` 或 `-enableassertions` 命令行参数启用。 - 断言主要用于调试阶段,一般不在生产环境中启用。 ### 4. String 类型的理解 - **String 对象的创建**: ```...
2. **`new String()`与字符串字面量**:使用`new String("xyz")`创建的对象位于堆内存中,并且不会直接放入字符串常量池中;而直接使用`String str = "xyz";`则会将字符串放入常量池。 3. **`String`构造函数**:`...
5. **注意事项**: - JNDI名称(`JNDI`常量)需要根据实际环境中数据源的配置进行调整。 - `wlfullclient.jar`的版本应与WebLogic Server版本匹配,以避免兼容性问题。 - 配置环境变量时需确保WebLogic服务器可...
这通常是项目说明文件,可能包含了`StringDemo2`程序的目的、使用方法、注意事项或者作者的信息。 以上就是对`StringDemo2`可能涉及的Java字符串处理相关知识点的详细解释。在实际的代码示例中,`StringDemo2`可能...