JAVA中字符串问题
来源:互联网 发布:感冒运动出汗好吗 知乎 编辑:程序博客网 时间:2024/05/19 17:47
JAVA中对象创建
- 通过new关键字来创建对象
- 通过newInstance()方法来创建对象
- 使用反序列化机制中IO流中恢复Java对象
- 通过clone()方法复制一个对象
- 直接量方式,String str = “abc”;
字符串缓冲池
public class TestString {
public static void main(String[] args){
String str1 = "string";
System.out.println(System.identityHashCode(str1));
String str2 = "string";
System.out.println(System.identityHashCode(str2));
}
}
public static void main(String[] args){
String str1 = "string";
System.out.println(System.identityHashCode(str1));
String str2 = "string";
System.out.println(System.identityHashCode(str2));
}
}
System.identityHashCode()是根据内存地址算Hash值
运行上面的代码得到一下结果
这说明str1与str2指向的内存地址是一样的。这是因为JVM将字符串常量放在了一个叫字符串缓冲区的,因为str1和str2的值一样,所以在缓冲区放一份就可以,同时str1和str2都指向这个地方。
当然str1="testString", str2="test" + "String",str1与str2也会指向相同的区域,因为在编译java文件时,会将str2的值合为“testString”。但是如果str3=“String”,str2 = “test” + str3时,str2将和str1虽然内是相等的,但是str1和str2指向的内存地址不同,因为编译器不会将变量str3转换为“String",不过也有下面的特例
public class TestString {
public static void main(String[] args){
String str1 = "TestString";
System.out.println(System.identityHashCode(str1));
final String str3 = "Test";
String str2 = str3 + "String";
System.out.println(System.identityHashCode(str2));
}
}
public static void main(String[] args){
String str1 = "TestString";
System.out.println(System.identityHashCode(str1));
final String str3 = "Test";
String str2 = str3 + "String";
System.out.println(System.identityHashCode(str2));
}
}
执行上面的代码会发现输出的值是相等的,这是因为我们在变量str3前加了关键字final,该关键字相当于C中宏替换,告诉编译器编译的时候将str3都替换成”Test“,所以才会有str1与str2相等(指向同一内存区)。
String类不可变字符串
String类的底层是用数组实现的,我们知道数组的长度确定好后是不能更改的。
str = ”abc“;
str = str + ”defg“;
JAVA中对于上面的处理过程是重新创建一个对象,并将内容初始化为”abcdefg“,再让str指向这个新的对象。而“abc”依然在字符串缓冲区,如果在后面不会用到,并且垃圾回收器不回收字符串缓冲区的数据的话,就会发生内存泄露问题。
如果字符串要动态扩展的话建议使用StringBuilder或者是StringBuffer,前者非线程安全,后者线程安全,但前者速度快。
public class TestString {
public static void main(String[] args){
StringBuilder str1 = new StringBuilder("TestString");
System.out.println(System.identityHashCode(str1));
str1.append("String");
System.out.println(System.identityHashCode(str1));
System.out.println(str1);
}
}
public static void main(String[] args){
StringBuilder str1 = new StringBuilder("TestString");
System.out.println(System.identityHashCode(str1));
str1.append("String");
System.out.println(System.identityHashCode(str1));
System.out.println(str1);
}
}
运行结果如下
0 0
- JAVA中字符串问题
- java中字符串相等问题
- java中接收字符串的问题
- java中字符串的编码解码问题
- JAVA中字符串转换成整型问题
- java中字符串的编码解码问题
- java 中截取中文字符串的问题
- Java中关于字符串拼接的问题
- Java字符串中常见的一些问题
- Java中字符串比较相等问题
- java中JSON对象字符串排序问题
- Java中字符串的拼接问题
- 关于Java中split方法对空字符串处理问题
- jsp页面中java脚本整型字符串自动转换问题
- (转)Java中字符串与内存泄漏的问题
- Java中String字符串的常见10个问题
- 关于Java中split方法对空字符串处理问题
- java中字符串以小数点作为分隔符问题
- 浅谈android 视频播放VideoView
- windows 运行多个tomcat
- 从接口开始说prestashop(一)
- cURL_TP-Link_internet_IP
- 启动hadoop 2.6遇到的datanode启动不了
- JAVA中字符串问题
- Git SSH Key 生成步骤
- [IOS 开发] GCD学习 dispatch_barrier_async
- 非常简单的Python HTTP服务
- iOS应用架构谈:架构设计的方法论
- volatile的理解
- JUnit 4 与 TestNG 对比(翻译)
- 运动会分数统计系统开发
- PHP的mysqli扩展