String类

是不可变的对象,即每次要对String对象进行修改时,都会重新创建一个新的String对象,然后指向这个新对象。

创建方式有两种:

1.          String s = "abc";         //先查看常量池有无"abc"数据空间,如果有直接指向,没有就在常量池中创建一个,然后指向

2.          String s = new String ("abc");        //现在堆中创建一块空间,维护了value属性,然后这块空间指向常量池中的"abc",如果常量池没有,同上

String常用方法:

int length():        返回字符串的长度

char charAt(int index):        返回指定索引处的字符

boolean isEmpty():        判断字符串是否为空

String toLowerCase():        将字符串中的所有字符转换为小写

String toUpperCase():        将字符串中的所有字符转换为大写

String trim():        返回字符串的副本,去掉前导空白和尾部空白,中间的空白不会被去掉

boolean equals(Object obj):        比较字符串的内容是否相同

boolean equalsIgnoreCase(String anotherString):        忽略大小写,比较字符串的内容是否相同

String concat(String str):        将指定字符串连接到此字符串的结尾,等价于用“+”

int compareTo(String anotherString):        比较两个字符串的大小

String substring(int beginIndex):        返回从beginIndex到末尾的子字符串

String substring(int beginIndex, int endIndex):        返回从beginIndex到endIndex-1的子字符串,不包括endIndex

boolean endsWith(String suffix):         判断字符串是否以指定的后缀结束

boolean startsWith(String prefix):        判断字符串是否以指定的前缀开始

boolean startsWith(String prefix, int toffset):        判断字符串在指定索引开始的子字符串是否以指定前缀开始

boolean contains(CharSequence s):        判断当前字符串中是否包含指定的字符串

int indexOf(String str):        返回指定子字符串在当前字符串中第一次出现处的索引

int indexOf(String str, int fromIndex):        返回从指定的索引后,指定子字符串在当前字符串中第一次出现处的索引

int lastIndexOf(String str):        返回指定子字符串在当前字符串中最后一次出现处的索引

int lastIndexOf(String str, int fromIndex):        返回从指定的索引后,指定子字符串在当前字符串中最后一次出现处的索引
注:indexOf和lastIndexOf方法如果未查找到指定子字符串时,返回值都为-1。

String replace(char oldChar, char newChar):        替换当前字符串中指定的子字符串

String[] split(String regex):        根据指定的符号拆分当前字符串,然后返回一个String数组

String和char[]相互转换

        //String-->char[]String s1 = new String("123jslas");char [] c1 = s1.toCharArray();System.out.println(c1);//char[]-->Stringchar [] c2 = {79,'c','s','a'};String s2 = new String (c2);System.out.println(s2);

String和byte[]互相转换,使用String的getBytes方法,同理

特性:

String a = "abc";    //创建了一个a对象
String b = "ee";    //创建了一个b对象
String c = a+b;   //创建了三个对象,分别是"abcee"这个字符串常量,Stringbuilder对象,String对象

因为String t1 = "a"+"b"是常量相加,看的是池

而String t2 = a+"123"是有变量参与的相加,是在堆中。这种相加底层是StringBuilder t2 = new StringBuilder();t2.append(a);t2.append("123"); t2是在堆中。

总结:当变量与字面量或变量与变量进行拼接时,会在堆中创建一个StringBuilde对象,然后使用StringBuilder的append()方法将变量与字面量或变量与变量进行拼接,最后调用toString()方法转成String对象。

StringBuffer (线程安全)

底层也是用一个数组来存储字符串的值

如果调用无参构造器,数组长度默认为16

调用有参构造函数创建一个StringBuffer对象时,数组长度为“当前对象值的长度+16”

在用append添加字符常量时,先判断添加之后的长度是否大于目前的容量,如果大的话,就要进行扩容

扩容
扩容的逻辑就是创建一个新的 char 数组,将现有容量扩大一倍再加上2,如果还是不够大则直接等于需要的容量大小。扩容完成之后,将原数组的内容复制到新数组,最后将指针指向新的 char 数组。

这个是Arrays类提供的静态方法,将原来的数组扩充到newLength长度,然后将原来的数据拷贝过去,可以从源码看出,它首先创建出一个新的字符数组,然后使用System的静态方法arraycopy将原来的数据拷贝到新的数组,然后返回新的数组。

StringBuffer类常用方法

增 append

s.append(",");         s.append("小张").append("小王").append(11.4).append(true);

删 delete(start,end)

改 replace(start,end,String)

s.replace(11,14,“马化腾”);

查 indexOf        //查找指定的子串在字符串中第一次出现的索引,找不到返回-1

int indexof = s.indexOf("马化腾");

插 insert

s.insert(9,"小张");

获取长度 length

String,StringBuffer相互转换

        //String -- > StringBuffer//方法1String s1 = new String("demaxiya");StringBuffer b1 = new StringBuffer(s1);System.out.println(b1);//方法2StringBuffer b2 = new StringBuffer();b2.append(s1);//StringBuffer -- > String//方法1StringBuffer b3 = new StringBuffer("qigeai");String s3 = b3.toString();System.out.println(s3);//方法2String s4 = new String(b3);System.out.println(s4);

String、StringBuffer和StringBuilder的异同
相同点:底层都是通过char数组实现的
不同点:

String对象一旦创建,值不能修改的,如果要修改,会重新开辟内存空间来存储修改之后的对象;而StringBuffer和StringBuilder对象的值是可以被修改的;
StringBuffer几乎所有的方法都使用synchronized实现了同步,线程比较安全,在多线程系统中可以保证数据同步,但是效率比较低;而StringBuilder 没有实现同步,线程不安全,在多线程系统中不能使用 StringBuilder,但是效率比较高。
如果我们在实际开发过程中需要对字符串进行频繁的修改,不要使用String,否则会造成内存空间的浪费;当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用 StringBuilder。

String,StringBuffer,StringBuilder知识梳理相关推荐

  1. String StringBuffer StringBuilder区别与联系

    String     StringBuffer     StringBuilder String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量 ...

  2. String StringBuffer StringBuilder的区别

    简单的事情做到极致也是一种能力. 首先,说一下目前我还没进行整理的情况下,我的理解: String 不可修改 修改后相当于又新创建创建一个字符串 比如: String a = "abc&qu ...

  3. String,StringBuffer,StringBuilder三者的异同

    String,StringBuffer,StringBuilder三者的异同:? String:不可变的字符序列;底层使用char[]存储(用final修饰) StringBuffer:可变的字符序列 ...

  4. 重温java中的String,StringBuffer,StringBuilder类

    不论什么一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类经常使用的有 3 个: String.StringBuffer.StringBuilder ...

  5. 浅谈 Java 字符串(String, StringBuffer, StringBuilder)

    我们先要记住三者的特征: String 字符串常量 StringBuffer 字符串变量(线程安全) StringBuilder 字符串变量(非线程安全) 一.定义 查看 API 会发现,String ...

  6. String, StringBuffer, StringBuilder之间的区别

    String与StringBuffer/StringBuilder之间的主要区别 1.String对象不可变, 如果修改会重新创建一个对象, 然后把值保存进去. StringBuffer/String ...

  7. java中 String StringBuffer StringBuilder的区别

    * String类是不可变类,只要对String进行修改,都会导致新的对象生成. * StringBuffer和StringBuilder都是可变类,任何对字符串的改变都不会产生新的对象. 在实际使用 ...

  8. String, StringBuffer,StringBuilder

    String, StringBuffer,StringBuilder的区别 java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,都实现了CharSe ...

  9. `java`学习笔记(十二)`Java`--`String``StringBuffer``StringBuilder`

    Java–String&&StringBuffer&&StringBuilder 文章目录 `Java`--`String`&&`StringBuffe ...

最新文章

  1. python 去掉字符串的
  2. android 开发 获取各种intent (图片、apk文件、excel、pdf等文件)
  3. 基于OpenCV完成离散傅里叶变换
  4. 强烈推荐10 个机器学习教程!(含视频链接)
  5. Pytorch使用Vision Transformer做肺癌和结肠癌组织病理学图像分类
  6. centOS chkconfig 使用
  7. 七阶拉丁方阵_【C语言】输出N阶拉丁方阵并统计个数
  8. 【Elasticsearch】ES 7.8 写入 查询 Normalizer 忽略 大小写
  9. ios simulator android,How to open IOS Simulator in Android Studio for Flutter application
  10. 移动端最小字体限制测试
  11. 三维点云数据处理软件供技术原理说明_三维点云处理软件需求说明
  12. Proe/Creo经典曲面造型实战案例大合集
  13. 【前端面试题】前端布局问题
  14. 面包板电源线怎么接_如何维修面包板电源
  15. OPPO云VPC网络实践
  16. minGw64编译Qt时遇到too many sections问题
  17. CentOS7系统root分区文件损坏修复的解决方法
  18. 计算机科学导论的探讨论文,计算机科学导论论文.doc
  19. 最小割与最大流(mincut maxflow)
  20. 基因测序与高通量测序区别

热门文章

  1. Android8.1 编写定时计划任务
  2. Ubuntu允许root远程登陆方法
  3. 【Linux】Shell(Bash)单引号、双引号、不加引号和反引号用法和区别详解
  4. navicat 导入/导出链接
  5. [开源]一言·古诗词 API,随机返回一条古诗词名句。采用 Vert.x 全异步开发,毫秒级稳定响应。支持 svg / png / json / txt 返回...
  6. Python Pygame 实现宝可梦对战场面
  7. 景深决定照相机什么特性_2018年自考《摄影技术基础》习题库及答案
  8. MySQL控制流函数-if 、elseif、else、case...when
  9. 鸿蒙有多少应用,鸿蒙APP应用上线,数量暂时稀缺,与安卓版有哪些不同?
  10. 仿天猫App可打开列表