最近温习java的一些基础知识,发现以往对String对象认识上的一些不足。特汇总如下,主要是帮助记忆,如能对其他朋友有些启发,不胜欣喜。

String在JVM中内存驻留问题
JVM的常量区(Constant Pool)中维持了大部分创建的string (Interned Strings)。举例,
Sring a="ABC";String b="ABC";
当JVM为a赋值时会在常量区生成一个String Constant,当b也赋值为“ABC”时,那么会在常量池中查看是否存在值为“ABC”的常量,存在的话,则把b的指针也指向“ABC”的地址,而不是新生成一个String Constant。
JDK1.6中Interned Strings存储在Permanent Space的常量池中;
JDK1.7中Interned Strings已经不再存储在Permanent Space中,而是放到了Heap中;
JDK8中PermanentSpace已经被完全移除,InternedStrings也被放到了MetaSpace中。
 
 
String.substring()方法
返回新的String对象,JAVA6返回的新对象与原有对象底层共享存储空间char[]数组,通过偏移和长度构造了一个"新"的String,导致substring对象被引用时,原对象即使没有被引用也不能被销毁;JAVA7之后返回的新对象会新建底层的存储空间
 
 
+与concat()的区别
1.  concat是String方法,String重载了“+”操作符(提醒下:Java不支持其他操作符的重载)
2. concat方法在参数为空时返回原字符串,不为空时返回新的String对象;而+在两个操作数都是常量时可能返回内存中已有的Interned String引用,操作数存在变量时必定新建String对象
 
 
对于敏感信息,为何使用char[]要比String更好?
String是不可变的。这意味着一旦创建了字符串,如果另一个进程可以进行内存转储,在GC发生前,(除了反射)没有方法可以清除字符串数据。
使用数组操作完之后,可以显式地清除数据:可以给数组赋任何值,密码也不会存在系统中,甚至垃圾回收之前也是如此。
所以,是的,这是一个安全问题 – 但是即使使用了char数组,仅仅缩小了了攻击者有机会获得密码的窗口,它值针对制定的攻击类型。
 
 
如何通过空白字符拆分字符串
String 的 split()方法接收的字符串会被当做正则表达式解析,
"\s"代表空白字符,如空格" ",tab制表符"\t", 换行"\n",回车"\r".
而编译器在对源代码解析时,也会进行一次字面量转码,所以需要"\\s".
 
String[] strArray = aString.split("\\s+");
 
 
String vs StringBuilder vs StringBuffer
StringBuilder 是可变的,因此可以在创建以后修改内部的值
StringBuffer 是同步的,因此是线程安全的,但效率相对更低

关于java.lang.String理解中的一些难点的更多相关文章

  1. Java源码学习 -- java.lang.String

    java.lang.String是使用频率非常高的类.要想更好的使用java.lang.String类,了解其源代码实现是非常有必要的.由java.lang.String,自然联想到java.lang ...

  2. mybatis异常invalid comparison: java.util.Date and java.lang.String

    原文链接:http://blog.csdn.net/wanghailong_qd/article/details/50673144 mybatis异常invalid comparison: java. ...

  3. Java虚拟机九 java.lang.String在虚拟机中的实现

    在Java中,Java的设计者对String对象进行了大量的优化,主要有三个特点: 1.不变性: 不变性是指String对象一旦生成,则不能再对它进行改变.String的这个特点可以泛化成不变(imm ...

  4. Mybatis中传参包There is no getter for property named 'XXX' in 'class java.lang.String'

    Mybatis中传参包There is no getter for property named 'XXX' in 'class java.lang.String' 一.发现问题 <select ...

  5. 关于mybtis 使用过程中发生There is no getter for property named 'id' in class 'java.lang.String' 错误

    今天在修改一个关于mybtis语句时,偶然发现的一个错误  There is no getter for property named 'id' in class 'java.lang.String' ...

  6. java:常用类(包装类,equals和==的比较,Date,java.lang.String中常用方法,枚举enum)

    *包装类: 将基本类型封装成类,其中包含属性和方法以方便对象操作. *byte---->Byte *short--->Short *long--->Long *float---> ...

  7. java.lang.String中的replace方法到底替换了一个还是全部替换了。

    你没有看错我说的就是那个最常用的java.lang.String,String可以说在Java中使用量最广泛的类了. 但是我却发现我弄错了他的一个API(也可以说是两个API),这个API是关于字符串 ...

  8. kettle 中 java.lang.ClassCastException: [B cannot be cast to java.lang.String报错的解决方法

    问题描述:从数据库中查询出的某字段是json类型数据,然后在json输入步骤报错java.lang.ClassCastException: [B cannot be cast to java.lang ...

  9. java.lang.String cannot be cast to scala.runtime.Nothing Scala中的Nothing类型

    经常在写Rdd的时候, 如:  val OWNER_ID=row.getAs("OWNER_ID")  等, 运行是可能会报异常 : java.lang.String cannot ...

随机推荐

  1. Spring小结

    一.环境搭建 创建Maven项目 一般pom.xml会出错,本地若无相应版本的jar包,则无法下载或下载速度非常慢,我的解决方案是,查找本地仓库的jar,修改为本地仓库有的jar即可 pom.xml的 ...

  2. IntelliJ IDEA中怎么查看文件中所有方法?

    可以使用快捷键ALT + 7打开左侧的Structure查看当前文件中的所有方法.   来自为知笔记(Wiz)

  3. bzoj1173: [Balkan2007]Point

    Description 给出N个三维空间上的点. 问有多少条直线,这些直线上至少有三个点. Input 第一行给出数字N,N在[4,1000] 下面N行,每行三个数字,用于描述点的坐标,其值在[-10 ...

  4. iMac一体机安装苹果和Win7双系统

    前几天,有个客户说有一苹果的一体机,想装苹果和Win7双系统.约好了时间,带上工具就过去了.去的路上,用手机上网查了一下苹果电脑装双系统的过程.虽然以前也有给苹果的电脑安装过双系统,但次数不多而且时间 ...

  5. python 深入理解 赋值、引用、拷贝、作用域

    在 python 中赋值语句总是建立对象的引用值,而不是复制对象.因此,python 变量更像是指针,而不是数据存储区域, 这点和大多数 OO 语言类似吧,比如 C++.java 等 ~ 1.先来看个 ...

  6. for语句的用法

    #!/bin/bashfor i in 1 2 3 4 5 6do echo $idone 看文件 #!/bin/bashdir=$(ls /etc) for i in $dirdo echo $id ...

  7. Linux系统默认服务建议开启关闭说明列表

    服务名称 功能简介 建议 acpid 电源管理接口.如果是笔记本用户建议开启,可以监听内核层的相关电源事件. 开启 anacron 系统的定时任务程序.cron的一个子系统,如果定时任务错过了执行时间 ...

  8. 26种提高ASP.NET网站访问性能的优化方法 .

    1. 数据库访问性能优化 数据库的连接和关闭 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源. ASP.NET中提供了连接池 ...

  9. PLSQL_性能优化系列10_Oracle Array数据组优化

    2014-09-25 Created By BaoXinjian

  10. hdu 5441 travel 离线+带权并查集

    Time Limit: 1500/1000 MS (Java/Others)  Memory Limit: 131072/131072 K (Java/Others) Problem Descript ...