1. immutable不可改变特性

String类对象都是不可修改的。如果我们去查阅JDK文档关于String类的信息,我们将发现所有看起来修改了String内容的方法其实是返回了一个全新的对象包含了这部分修改内容。原始的String字符串依然保持原封不动,未做过任何修改。这种设定保证了的代码很容易写,而且易于被人理解。
Objects of the String class are immutable. If you examine the JDK documentation for the String class, you’ll see that every method in the class that appears to modify a String actually creates and returns a brand new String object containing the modification. The original String is left untouched.
This is an important guarantee, since it makes code easier to write and understand.

2. String的’+’ & ‘+=’

因为String类型的对象是read-only的,所以在字符串引用上所做的修改不可能会影响其它的引用。
但是String的这种imutable特性也又一些效率上的代价存在。

另:’+’&’+=’是java语言中唯二被重载的操作符号,Java语言不允许程序猿重载任何其他的操作符。
所以一般在做对于String的修改操作时,一般会用StringBuilder作中间处理,减少对象的连续创建和释放带来的系统性能开销。

package com.fqy.blog;import java.util.Random;public class StringBuilderDemo {private Random random = new Random();public String toString() {StringBuilder sb = new StringBuilder("[");for (int i = 0; i < 10; i++) {sb.append(random.nextInt(100));sb.append(", ");}/** StringBuilder.delete(int start, int end) start inclusive, and end* exclusive*/sb.delete(sb.length() - 2, sb.length());sb.append("]");// return the number of unicode units in the string.System.out.println(sb.length());// System.out.println(sb.toString().length());return sb.toString();}public static void main(String[] args) {StringBuilderDemo sbd = new StringBuilderDemo();System.out.println(sbd);}}
//Running result:
39
[32, 4, 54, 83, 43, 16, 35, 52, 64, 31]

3. 关于toString()方法的一个栈溢出的问题

当编译器看到一个String对象,其后跟着的是一个非String类型的东西时,它会试图将其解析成一个String类型的对象。问题出现了,它会不断地调用自身,直到栈空间耗尽。控制台被不断的栈溢出所淹没,不知所措。
解决方式之一是:调用父类的方法super.toString()方法。

package com.fqy.blog;public class StackFlowDemo {@Overridepublic String toString() {// This will cause infinite loop here this way.return "Infinite Recursion address: " + this + "\n";// This will work.// return super.toString();}public static void main(String[] args) {System.out.println(new StackFlowDemo());}
}//Running result:
Exception in thread "main" java.lang.StackOverflowErrorat java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:449)at java.lang.StringBuilder.append(StringBuilder.java:136)at java.lang.StringBuilder.<init>(StringBuilder.java:113)at com.fqy.blog.StackFlowDemo.toString(StackFlowDemo.java:7)at java.lang.String.valueOf(String.java:2994)at java.lang.StringBuilder.append(StringBuilder.java:131)at com.fqy.blog.StackFlowDemo.toString(StackFlowDemo.java:7)at java.lang.String.valueOf(String.java:2994)at java.lang.StringBuilder.append(StringBuilder.java:131)at com.fqy.blog.StackFlowDemo.toString(StackFlowDemo.java:7)at java.lang.String.valueOf(String.java:2994)...

4. 关于String对象的内存存储问题

这里展示几个常见方法:toCharArray()/valueOf()/intern().
其中关于intern() 方法存在的意义的问题,stackoverflow上有详细问题,具体参见这里和这里。
Q:What is String interning?–什么是intern()方法?
A:Basically doing String.intern() on a series of strings will ensure that all strings having same contents share same memory. 一般说来,我们调用intern()方法,将会使得有相同内容的String对象在内存中只有一份存储。
这样做的好处是降低了程序对于内存的需求;但问题在于这部分缓存是被JVM的permanent memory区所维护的,永久区内存大小通常比heap区内存要小得多,所以如果不是对象特别多的话,不要使用intern()方法。
Q:到底我们应该什么时候使用intern()方法呢?
A:String.intern()方法在该String对象在String pool中被发现存在时,返回该对象的引用;否则则会在String pool中插入一个新对象,并返回新对象的引用。
Q:intern在String.intern()的应用?
A:这里分为2种情形。1.java自动将字符串字面值sting literals转换为intern的,比如String str1 = “this is literal str”;。这意味着,==对于这类的String类型数据就像基本数据类型一样比如int . 2.对于使用new String()方法创建的String对象,是需要使用intern()方法保证其内存空间的唯一性的。

package com.fqy.blog;public class StrOpr {public static void main(String[] args) {int num = 12345;String str = "fqyuan";String str1 = new String("fqyuan");String str2 = "fqyuan";// 1.String.toCharArray(), return character array of the stringchar[] arr = str.toCharArray();// 2. static method, convert the input to String.String intVal = String.valueOf(num);// 3.This is a special case that need to be taken care of.String inString = str.intern();System.out.println(arr);System.out.println(intVal);System.out.println(inString);if (str == str1)System.out.println("str == str1");if (str == str2)System.out.println("str == str2");if (str == str1.intern())System.out.println("str == str2.intern()");//an equality check on the contents of the two Strings.if (str.equals(str1))System.out.println("str equals str1");}}
//Running result:
fqyuan
12345
fqyuan
str == str2
str == str2.intern()
str equals str1

Thinking in java-35 String 字符串相关推荐

  1. Java中String字符串截取几种方法(substring,split)

    Java中String字符串截取几种方法 substring,split 这是一个Java中的String的基础用法的演示. 下面通过代码对大家进行讲解 substring 这里用来ndexOf,la ...

  2. Java中String 字符串与List<String>互转

    Java中String 字符串与List互转 大家好,我是酷酷的韩~ 1.String转List public static void main(String[] args) {String aa = ...

  3. Java中String字符串:空字符串、存放空的字符串、null的区别

    Java中String字符串:空字符串.存放空的字符串.null的区别 Java String字符串中有三种特殊的字符串:空字符串.存放空的字符串.字符串为Null,如下所示: String str1 ...

  4. Java将String字符串里的每个字符都分割取出来

    Java将String字符串里的每个字符都分割取出来 方法一 String str = "play with style"; char[] strArray = str.toCha ...

  5. java基础-String字符串字符长度校验

    java基础-String字符串字符长度校验 /*** 校验字符串是否在规定字符数内* @param str* @param maxLength* @return*/ public static bo ...

  6. Java中string字符串的值_Java中的字符串(String)

    一.基本概念: 字符串是一系列字符串的序列.在Java语言中字符串是用一对对双引号"",括起来的字符系列.例如"Hello","你好".从数 ...

  7. 【Java】String字符串的最大长度是多少?

    先说结论: 对于Java字符串的最大长度,要分为2种情况进行讨论. ① 编译期:一般情况下,最大长度为65534. ② 运行期:Integer.MAX_VALUE. 接下来通过对一个字节码文件反编译来 ...

  8. 基于Java的String字符串基本用法总结

    在Java中,String类是字符串操作类,提供了多种方法对字符串进行操作,经过学习对String类的常用方法总结如下: 一.String字符串的创建 由于String类位于Java的lang包下,所 ...

  9. Java中string字符串和char字符之间的千丝万缕

    目录 前言 String字符串和char字符的区别 拓展 相互转换 String字符串转换成char字符数组 char字符转换成String字符串 char字符数组转换成String字符串 Strin ...

  10. Java中String字符串toString()、String.valueOf()、String强转、+ 的区别

    Object#toString(): Object object = getObject(); System.out.println(object.toString()); 在这种使用方法中,因为ja ...

最新文章

  1. 如何编写数据库存储过程?
  2. Delphi XE5 常见问题解答
  3. Android TextView里直接显示图片的三种方法
  4. 微信小程序点击button按钮后重置输入框等表单内容
  5. go程序的跨平台编译
  6. AT2305-[AGC010D]Decrementing【博弈论】
  7. 阿里P8架构师谈:MongoDB、Hbase、Redis等NoSQL优劣势、应用场景
  8. (二)C语言数据类型(2)
  9. DFS序+线段树 hihoCoder 1381 Little Y's Tree(树的连通块的直径和)
  10. java 解决死锁_如何解决java中的死锁问题
  11. Mac 识别NTFS移动硬盘
  12. 【运动学】基于matlab GUI模拟鱼类目标追击问题【含Matlab源码 166期】
  13. php怎么改背景图片,php - 如何借助php中的url参数更改背景图片? - SO中文参考 - www.soinside.com...
  14. centos7.0 配置mysql_Centos7.0配置MySQL主从服务器
  15. 《ROS理论与实践》学习笔记(七)机器人语音交互
  16. [Swift]LeetCode882. 细分图中的可到达结点 | Reachable Nodes In Subdivided Graph
  17. 【转贴】常识普及:广府人是越佬族
  18. eui怎么在名字后面显示服务器,EUI如何打开经验条 显示经验条其实很简单
  19. 范渊免职——网安界其人曾异军突起又将“落幕”?
  20. 盛迈坤电商:电商运营要怎么样进行选款

热门文章

  1. 【无标题】元宇宙背后的安全隐患
  2. 打印功能window.print()
  3. 曾经山寨手机上的跨平台方案
  4. 微博舆情热点挖掘项目——A+项目
  5. 图漾相机-TM461-E2(TM460-E2) TOF相机
  6. 【echarts记录 -- 3d 饼状图实现】
  7. LOL代练检测——2019腾讯游戏安全技术竞赛决赛记录
  8. 技能兴鲁试题--数据分析挖掘
  9. 【松岩论道】浅谈四季度的操作策略!
  10. 鄢陵一高2021高考成绩查询单,鄢陵县第一高级中学2020年高考喜报