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

  }

 

}
运行结果如下



JAVA中字符串问题的更多相关文章

  1. 三张图彻底了解Java中字符串的不变性

    转载: 三张图彻底了解Java中字符串的不变性 定义一个字符串 String s = "abcd"; s中保存了string对象的引用.下面的箭头可以理解为"存储他的引用 ...

  2. java中字符串的非空判断

    问题如下:在java 中 字符串为null 如何判断String str;if(str==null) ??str.equal("null") ?? 答:我觉得应该搞清楚字符串对象和 ...

  3. java中字符串String 转 int(转)

    java中字符串String 转 int String -> int s="12345"; int i; 第一种方法:i=Integer.parseInt(s); 第二种方法 ...

  4. 【转】Java中字符串中子串的查找共有四种方法(indexof())

    原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下:1.int ...

  5. Java中字符串中子串的查找共有四种方法(indexof())

    Java中字符串中子串的查找共有四种方法(indexof()) Java中字符串中子串的查找共有四种方法,如下:1.int indexOf(String str) :返回第一次出现的指定子字符串在此字 ...

  6. JAVA中字符串函数subString的用法小结

    本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...

  7. Java中字符串的一些常见方法

    1.Java中字符串的一些常见方法 /** * */ package com.you.model; /** * @author Administrator * @date 2014-02-24 */ ...

  8. Java中字符串indexof() 的使用方法

    Java中字符串中子串的查找共有四种方法(indexof())indexOf 方法返回一个整数值,指出 String 对象内子字符串的开始位置.如果没有找到子字符串,则返回-1.如果 startind ...

  9. Java中字符串string的数据类型

    Java中字符串string的数据类型 时间:2017-07-03 08:01:47 YuanMxy 原文:https://blog.csdn.net/YuanMxy/article/details/ ...

  10. Java中字符串转为16进制表示

    Java中字符串转为16进制表示 String str = "鲸"; char[] chars = "0123456789ABCDEF".toCharArray ...

随机推荐

  1. 【转】【CTO俱乐部走进支付宝】探索支付宝背后的那些技术 部分

    怎么避免研发环节当中引入漏洞?“我们有一套比较成熟的安全研发开发框架.首先我们用统一的框架,框架本身是经过我们安全工程师去做过非常好的认证的,同时在研发过程当中我们对这些问题也有些规范.一旦发现风险我 ...

  2. 更改MVC注册Areas的顺序,掌控Areas的运作

    [转自:http://www.cnblogs.com/dozer/archive/2010/04/14/change-order-of-MVC-Areas.html] 一.前言 首先,有人要问,为什么 ...

  3. 【BZOJ】3401: [Usaco2009 Mar]Look Up 仰望(单调栈)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3401 还能更裸一些吗.. 维护一个递减的单调栈 #include <cstdio> #i ...

  4. (转)memcache、redis缓存

    memcache原理.内存模型: http://www.csdn.net/article/2016-03-16/2826609 redis原理: http://baike.baidu.com/link ...

  5. js节流防抖应用场景,以及在vue中节流防抖的具体实现

    故事背景: 项目有个需求是输入框在输入的时候进行搜索,展示下拉数据,但是没必要输入一个字都进行搜索,所以想到了在输入结束200毫秒后再进行搜索,从而引出来了 js的节流(throttle),防抖(de ...

  6. Entity Framework基础

    http://blog.csdn.net/hurtlingsnail/article/details/53113934

  7. Python标准库:内置函数delattr(object, name)

    本函数是用来删除对象的属性,比方在函数setattr()里加入的属性,就能够利用这个函数来删除. 參数object是一个对象,參数name是一个字符串,但这个字符串必须是对象的属性.比方delattr ...

  8. Linux下RPM包管理

    概述 一种用于互联网下载包的打包及安装工具,它包含在某些linux分发版中.它生成具有.RPM扩展名的文件.RPM是Redhat Package Manager(Redhat软件包管理工具)的缩写.这 ...

  9. Tomcat unable to start within 45 seconds.

    解决的方法当然是设定这个时间,让其大于45秒,修改在当前项目所在的workspace\.metadata\.plugins\org.eclipse.wst.server.core\servers.xm ...

  10. iOS 计算时间差

    /** * 计算指定时间与当前的时间差 * @param compareDate 某一指定时间 * @return 多少(秒or分or天or月or年)+前 (比如,3天前.10分钟前) */ +(NS ...