Java 集合 --- String, StringBuilder, StringBuffer

  • String
    • String的声明方式
    • String的不可变性
    • 对比两个String
  • StringBuilder
    • StringBuilder 和 StringBuffer 的区别

String

  • 字符串对象,程序中定义""都是字符串对象,这个对象的使用频率最高.
  • 字符串类 java.lang.String类,继承Object类,实现了三个接口.

String的声明方式

  • 直接赋值: String s = “hello world” — 储存在常量池
  • 调用构造器 String s = new String(“hello world”) ---- 储存在堆中的地址
  • JVM为了提高性能和减少内存开销,在实例化字符串常量的时候进行了一些优化, 为字符串开辟一个字符串常量池,类似于缓存区
  • 直接赋值时,首先坚持字符串常量池是否存在该字符串. 所以如果再次创建一个 String ss = "“hello world”. 将会和 s 指向同样的字符串常量

String的不可变性

  • String类声明为final, 所以不能被继承
  • String类实际储存字符串数据的是类内部的成员变量 final char [] value
  • 因为value被final修饰, 所以value不能指向新的地址也就是不能再引用其他String变量
  • String 内部没有改变 value 数组的方法,也就是不能更改String中任何一个char 元素, 因此可以保证 String 不可变。

String不可变性的体现: 只要对string做出修改, 就会开辟新的内存空间

  • 1.当对字符串重新赋值时,会重新开辟新的内存空间储存新的字符串
//常量池中会同时储存 "hello world" 和  "hello" , 而不是 "hello world" 被覆盖掉
String s = "hello world"
s = "hello"
public static void main(String args[]) {String s = "hello";String temp = s;s = "world"; String ss = "hello";  if (ss == temp) {//注意这里对比的是地址, 说明ss和temp指向同样的地址//也就是 "hello" 没有被world覆盖掉System.out.println("same");}
}
output: "same"
  • 2.当对现有的字符串进行连接操作时,会重新开辟新的内存空间储存拼接后的字符串
  • 3.当调用String的replace(). 或者 substring() 等方法修改指定字符或字符串时,也会重新开辟新的内存空间储存修改后的字符串
public static void main(String args[]) {String s = "hello";String temp1 = s;s = s + "world" ;String temp2 = s;if (temp1 != temp2) {System.out.println("not same");}
}output: "not same"

对比两个String

  • 使用 == 对比两字符串时实际对比的是地址, 而不是实际内容
  • 所以一律使用 s1.equals(s2) 或者 s1.compareTo(s2) 对比string
public static void main(String args[]) {String s = "hello";String ss = "hello";String sss = new String("hello");System.out.println(s == ss);System.out.println(s == sss);System.out.println(ss == sss);
}output:
true // 因为 直接赋值创建String时, JVM会首先在常量池中寻找是否已经有同样的字符串. 所以s和ss指向同样的地址
false //使用构造器创建String时, 地址会指向堆内存, 然后堆内存中的地址指向常量池, 所以不一样
false //同上

Another example:

public class Solution {static public String fun1(String s1) {return s1;}public static void main(String args[]) {String s = "hello";String ss = fun1(s);//因为s和ss都等于hello, 所以共用常量池中的字符串System.out.println(s == ss);}
}ouput: true
//但是如果在fun1中对s1进行任何修改, 如拼接等, 就会开辟新的内存空间, 则 s != ss

Another Example

public static void main(String[] args) {String s = "Hello";String ss = s;//此时ss和s指向同一个地址s = "World";//常量池中开辟了新的空间, s指向新的地址if (ss == s) {System.out.println("same");}else {System.out.println("not same");}System.out.println(s.hashCode());System.out.println(ss.hashCode());//s和ss指向不一样的地址, 所以not same}

Another Example

 static public void fun1(String s1) {String newS = "hello";System.out.println(newS == s1);//答案是相等}public static void main(String args[]) {String s = "hello";fun1(s);}

StringBuilder

  • 如果代码中需要对string进行大量修改, 则推荐使用 StringBuilder类
  • StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象

Example:

 public void pathToStartValue(TreeNode node, int startValue, String pathStart) {if (node == null) {return;}if (node.val == startValue) {pathTostartValue = pathStart;return;}//这里pathStart + "U" 会生成新的String, 最后导致内存超限//所以需要改用StringBuilderpathToStartValue(node.left, startValue, pathStart + "U");pathToStartValue(node.right, startValue, pathStart + "U");return;     }
  • StringBuilder提供对String的增删改查, 包括:

append:

insert

setCharAt

void setCharAt(int index, char ch)
//The character at the specified index is set to ch.

delete

StringBuilder    delete(int start, int end)
//Removes the characters in a substring of this sequence.
StringBuilder   deleteCharAt(int index)
//Removes the char at the specified position in this sequence.

replace

StringBuilder    replace(int start, int end, String str)
//Replaces the characters in a substring of this sequence with characters in the specified String.

substring

String   substring(int start)
//Returns a new String that contains a subsequence of characters currently contained in this character sequence.
String  substring(int start, int end)
//Returns a new String that contains a subsequence of characters currently contained in this sequence.

StringBuilder 和 StringBuffer 的区别

  • StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
  • 由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

Java 集合 --- String, StringBuilder, StringBuffer相关推荐

  1. Java回顾-String/StringBuilder/StringBuffer

    一.String的特点 1.String类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 2.String是一个final类,代表不可变字 ...

  2. Java中String、StringBuffer、StringBuilder的区别

    Java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  3. Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)

    java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...

  4. String StringBuilder StringBuffer 包装类 Date 类 枚举类

    String,StringBuilder,StringBuffer直接的区别是: String 不可变长的字符序列 StringBuilder 可变长的字符序列,线程不安全的,效率较高 StringB ...

  5. String StringBuilder StringBuffer三者之间的区别~~~

    String StringBuilder  StringBuffer三者之间的区别~~~ String是字符串常量,它是典型的immutable类,被声明final class,所有的属性都是fina ...

  6. String ,StringBuilder,StringBuffer的区分

    String ,StringBuilder,StringBuffer的区分 一.区别 String是字符串常量,而StringBuffer和StringBuilder是字符串变量.由String创建的 ...

  7. String,Stringbuilder,Stringbuffer及正则表达式

    掌握String StringBuilder StringBuffer类的区别 一.String String是不可变类,一旦String对象被创建之后,包含对象中的字符串序列都是不可改变的,直到类被 ...

  8. Java中String,StringBuffer都是final类

    Java中String和StringBuffer同时final类,它们的区别在哪里 ? final 表示这个类不能再被继承.String不可变是说String中用一个final 的char数组priv ...

  9. java中拼接和 的区别_浅析Java中String与StringBuffer拼接的区别

    学习笔记: 1.String拼接会创建一个新的String对象,存储拼接后的字符串: StringBuffer拼接是直接在本身拼接,会即时刷新. 2.String只能拼接String类型的字符串: S ...

最新文章

  1. flutter 常用网址
  2. Configure NFS Server On AIX 6.1
  3. MySQL where后面的列子查询使用
  4. 怎么形容智能冰激凌机器人_有关于形容描写冰激凌的句子及图片
  5. H5页面适配iOS、Android和微信
  6. C语言-输入十进制数转换为二进制数
  7. iOS设备中的推送(三):页面跳转
  8. 如何让自定义Dialog上下居中
  9. 世界杯来了!小程序赛事操作来一波~
  10. Visual Studio常用的快捷键
  11. php类的静态属性,php学习之类与对象的类的静态属性
  12. “舒尔特表”训练法:产生1-25随机数,并打印到一个表格中
  13. 最新版云铺购ds网系统全开源可运营程序源码
  14. 【渝粤题库】广东开放大学 商务网站建设与维护 形成性考核
  15. python打包加壳_转:Python用PyInstaller打包笔记
  16. 3d打印机c语言程序下载,芯烨打印机设置软件工具
  17. 接口测试工具优缺点总结
  18. Freemyapps赚取积分终极图文教程
  19. VoIP的原理及技术
  20. 【CS229笔记】协方差矩阵概念快速回顾

热门文章

  1. forwardRef 的详解及使用
  2. 将数组转换成集合Arrays.asList,不可进行add和remove操作的原因
  3. php面试题之二——数据结构和算法(高级部分)
  4. Deep Face Super-Resolution with Iterative Collaboration论文阅读笔记
  5. rk3568安卓11系统之开发环境搭建
  6. 虚拟机Ubuntu18.04开机后没有网络的解决办法
  7. msysgit在Windows上的安装,
  8. 7-2 程序改错题4 (5 分)
  9. 漏洞通告 | Atlassian Confluence存在远程代码执行漏洞,悬镜云鲨RASP天然免疫防护...
  10. HTML 转义字符nbsp; ensp; emsp;thinsp;zwnj;zwj;空格标记