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));

  }

}

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));

  }

}
执行上面的代码会发现输出的值是相等的,这是因为我们在变量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);

  }

 

}
运行结果如下



最新文章

  1. 新思想、新技术、新架构——更好更快的开发现代ASP.NET应用程序
  2. C#设计模式之工厂方法
  3. Atitit jsr规范有多少个  407个。Jsr规范大全
  4. 关于Repository模式
  5. Shell中取时间格式方法
  6. POJ 3159 Candies (栈优化spfa)
  7. Android_listView_exc
  8. 学习MongoDB 二:MongoDB加入、删除、改动
  9. CF76A.Gift [最小生成树]
  10. Java集合中List,Set以及Map等集合体系详解(史上最全)
  11. angular引用echarts插件
  12. 通过Cookie跳过登录验证码【限cookie不失效有用】
  13. DevExpress v18.1新版亮点——WPF篇(四)
  14. uml建模工具介绍
  15. C#获取文件路径的几种方法
  16. e673. Getting Amount of Free Accelerated Image Memory
  17. VS默认的类前缀(访问控制符)是internal
  18. 使用UNIDAC连接oracle时的参数设置
  19. 解决RegexKitLite导入报错问题
  20. PyCharm中的Console调整字体大小

热门文章

  1. CTO俱乐部
  2. Python 数据库连接池
  3. Java 的数组
  4. API 接口设计中 Token 类型的分类与设计
  5. (转)servlet setCharacterEncoding setContentType
  6. IPOL图像处理分析经典在线(文献+源码)
  7. jQery 操作CSS
  8. 【BZOJ2836】魔法树 树链剖分
  9. 《从零开始学Swift》学习笔记(Day 59)——代码排版
  10. 170120、java 如何在pdf中生成表格