String,StringBuffer,StringBuild

大佬的理解->《深入理解Java中的String》

1、String

1.1 String 实例化

String str1 = "xxx";

String string1 = "hello KH96";
System.out.println(string1); //hello KH96

String str1 = new String("xxx");

String string2 = "hello KH96";
System.out.println(string2); //hello KH96

String底层实现 private final char value[];

​ String底层是由私有final的数组实现的,对外没有提供修改的方法,字符串多次赋值,不是修改字符串的内容,而是改变字符串的引用地址

源码

1.2 String常用方法

方法 说明
length() 字符串的长度
equals() 比较的是字符串的内容
equalsIgnoreCase(String str) 忽略大小比较
toUpperCase() 转大写
toLowerCase() 转小写
concat(String str) 返回拼接后的字符串

length()

字符串的长度:length()方法,返回的是字符串的长度,即字符串的长度(不是字节数),区别去数组的length

String string1 = "hello KH96";
System.out.println(string1+"的长度:"+string1.length()); //hello KH96的长度:10

equals()

重写了Object类的equals方法,比较的是字符串的内容,不是对象

String string2 = "KH96";
String string3 = "KH97";
System.out.println(string2.equals(string3)); //false

equalsIgnoreCase(String str)

忽略大小比较

String string7 = "kh96";
String string8 = "KH96";
System.out.println("不忽略大小写比较:"+string7.equals(string8)); //false
System.out.println("忽略大小写比:"+string7.equalsIgnoreCase(string8)); //true

toUpperCase() 转大写 toLowerCase() 转小写

String string9 = "abCD";
System.out.println(string9.toUpperCase()); //ABCD
System.out.println(string9.toLowerCase());//abcd

concat(String str) 返回拼接后的字符串

"+"号也可以进行字符串拼接

concat(String str)

拼接字符串都创建了新的对象,在循环中尽量不要拼接字符串,会造成栈溢出;

String strig10 = "abc";
System.out.println(strig10.concat("bcd").concat("def"));//abcbcddef

1.3 String 字符查找/提取相关方法

方法 说明
indexOf(String str) 返回str首次出现的下标
lastIndexOf(String str) 返回str最后一次出现的下标
substring(int index1) 截取下标index1,及以后的所有字符
substring(int index1,int index2) 截取下标index1到index2之间的字符串,包括index1,不包括index2
trim() 去除字符串的首尾空格
startsWith(String str) 是否以str开头
endsWith(String str) 是否以str结尾
contains(String str) 是否包含str
split(String str) 根据指定分割字符,将字符串拆分成字符串数组返回
toCharArray() 将字符串转为字符数组
replace(String str1,String str2) 用 str2 替换 str1
getBytes() 字符串转换为字节数组
getBytes("UTF-8") 字符串转换为字节数组,可指定编码
new String(byte[] bytes)

indexOf(String str)

返回str首次出现的下标,没有查到就返回-1

String string11 = "I am a good student in kh96";
System.out.println("good首次出现的位置:"+string11.indexOf("good")); //7

还可以通过ascii码值查询

String string11 = "I am a good student in kh96";
char char1 = 97;
System.out.println(char1); //a
System.out.println("参数支持int assic码值:"+string11.indexOf(97)); //2

lastIndexOf(String str)

返回str最后一次出现的下标,没有就返回-1

String string11 = "I am a good student in kh96";
System.out.println(string11);
System.out.println("t最后一次出现的下标:"+string11.lastIndexOf("t")); //18

substring(int index1)

截取下标index1,及以后的所有字符

index的范围[0,string.length()]

String string12 = "abcdefghijklmn";
System.out.println(string12.substring(5)); //fghijklmn

substring(int index1,int index2)

截取下标index1到index2之间的字符串,包括index1,不包括index2

index的范围[0,string.length()]

String string12 = "abcdefghijklmn";
System.out.println(string12.substring(5,8)); //fgh

小应用

String string14 = "KH90,KH91,KH92,KH93,KH94,KH95,";
System.out.println(string14.substring(0,string14.lastIndexOf(",")));//KH90,KH91,KH92,KH93,KH94,KH95

trim()

去除字符串的首尾空格

String string13 = "  KH  96  ";
System.out.println("原始长度"+string13.length()); //10
System.out.println("取出空格后长度"+string13.trim().length()); //6 "KH 96"

startsWith(String str) endsWith(String str)

startsWith(String str) 是否以str开头

endsWith(String str) 是否以str结尾

String string15 = "KH96.mp3";
System.out.println("是否是KH开头?"+ string15.startsWith("KH")); //true
System.out.println("是否是.mp3结尾?"+ string15.endsWith(".mp3")); //true

contains(String str)

判断字符串是否包含str

String string16 = "aaa bbb cc ddd";
System.out.println("是否包含bbb:"+ string16.contains("bbb")); //true
System.out.println("是否包含eee:"+ string16.contains("eee")); //false

split(String str)

根据指定分割字符,将字符串拆分成字符串数组返回

String string17_1 = "13501020304;15801020304;18901020304";
String[] phoneNumbers1 = string17_1.split(";"); //一种字符分割
System.out.println("手机号数组内容:"+ Arrays.toString(phoneNumbers2)); String string17_2 = "13501020304;15801020304!18901020304";
String[] phoneNumbers2 = string17_2.split(";|!"); //多种字符分割 用 | 隔开
System.out.println("手机号数组内容:"+ Arrays.toString(phoneNumbers2));
//[13501020304, 15801020304, 18901020304]

toCharArray()

将字符串转为字符数组

char[] chars1 = string18.toCharArray();
System.out.println(Arrays.toString(chars1)); //[K, H, 9, 8, 正, 在, 学, 习, 实, 用, 类]

replace(String str1,String str2)

用 str2 替换 str1

//获取一个16位的随机字符串
String string19 = UUID.randomUUID().toString();
System.out.println(string19); //65c0844a-c437-4a65-89ca-84d4166325ff //转换字符串,将-转换为*
System.out.println(string19.replace("-","*"));//65c0844a*c437*4a65*89ca*84d4166325ff
//去除字符串,将所有的-去除
System.out.println(string19.replace("-",""));//65c0844ac4374a6589ca84d4166325ff
//去16位随机数
System.out.println(string19.replace("-","").substring(0,16));//65c0844ac4374a65

getBytes() getBytes("UTF-8")

字符串转换为字节数组

String string20 = "abcd";
//getBytes() 没有指定编码
byte[] bytes = string20.getBytes();
try {
//getBytes("UTF-8") 指定编码
byte[] bytes2 = string20.getBytes("UTF-8");
System.out.println(Arrays.toString(bytes2)); //[97, 98, 99, 100]
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println(Arrays.toString(bytes)); //Arrays.toString(bytes)

new String(byte[] bytes)

将字节数组转换为字符串

 byte[] bytes3 ={100,101,102}; //ascii码值
System.out.println(new String(bytes3)); //def
//配合上面getBytes进行转码
try {
System.out.println(new String(bytes3,"utf-8")); //可以指定编码 def
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} char[] chars3 = {'K','H','9','6'};
System.out.println(new String(chars3));//KH96

2、StringBuffer

可变字符串类:StringBuffer

不同于String类:可以实现动态拼接字符串,而不会创建新的对象;

即:是一个可变字符串的对象,改变的是字符串对象中的内容;

不可以直接赋值,必须通过new创建对象;

2.1 StringBuffer实例化

new StringBuffer()

默认初始容量 16

StringBuffer sbf1 = new StringBuffer();
System.out.println("默认初始容量:"+sbf1.capacity());//16

底层实现

//StringBuffer()
public StringBuffer() {
super(16); //初始容量16
} //AbstractStringBuilder(int capacity)
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}

new StringBuffer(int capacity)

指定初始容量

StringBuffer sbf2 = new StringBuffer(32);
System.out.println("只定始容量:"+sbf2.capacity()); //32

底层实现

public StringBuffer(int capacity) {
super(capacity); //指定初始容量
}

StringBuffer(String str)

指定初始字符串,容量为字符串长度+16

StringBuffer sbf3 = new StringBuffer("Kh96");
System.out.println("指定初始字符串初始容量:"+sbf3.capacity()); //20

底层实现

public StringBuffer(String str) {
super(str.length() + 16); //容量为字符串长度+16
append(str);
}

2.2 StringBuffer常用方法

append(String str)

拼接字符串

StringBuffer sbf4 = new StringBuffer("userId=");
sbf4.append("U0001")
.append(",userName=")
.append("张三,age=")
.append("18"); //userId=U0001,userName=张三,age=18

扩容机制

底层扩容,当拼接一个新的字符串,字符串数组长度不够,会进行动态扩容,

每次扩容都是前一个数组长度的2倍+2

最大扩容长度不能超过Integer的最大值 - 8;

void expandCapacity(int minimumCapacity) {
int newCapacity = value.length * 2 + 2; //每次扩容都是前一个数组长度的2倍+2
if (newCapacity - minimumCapacity < 0)
newCapacity = minimumCapacity;
if (newCapacity < 0) {
if (minimumCapacity < 0) // overflow
throw new OutOfMemoryError();
newCapacity = Integer.MAX_VALUE;
}
value = Arrays.copyOf(value, newCapacity);
}

toString()

获取动态字符串内容

StringBuffer sbf4 = new StringBuffer("userId=");
sbf4.append("U0001")
.append(",userName=")
.append("张三,age=")
.append("18");
String userInfo = sbf4.toString();
System.out.println(userInfo); //userId=U0001,userName=张三,age=18

3、StringBuilder

用法和StringBuffer没有区别,唯一的区别就是StringBuffer是线程安全的,StringBuilder是非线程安全的

Java使用类-String的更多相关文章

  1. 从字节码和JVM的角度解析Java核心类String的不可变特性

    1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...

  2. Java 常用类String类、StringBuffer类

    常用类 String类.StringBuffer类 String代表不可变的字符序列 "xxxxxxx"为该类的对象 举例(1) public class Test { publi ...

  3. 深入理解Java常用类----String

         Java中字符串的操作可谓是最常见的操作了,String这个类它封装了有关字符串操作的大部分方法,从构建一个字符串对象到对字符串的各种操作都封装在该类中,本篇我们通过阅读String类的源码 ...

  4. 深入理解Java常用类----String(二)

    上篇介绍了String类的构造器,获取内部属性等方法,最后留下了最常用的局部操作函数没有介绍,本篇将接着上篇内容,从这些最常见的函数的操作说起,看看我们日常经常使用的这些方法的内部是怎么实现的.第一个 ...

  5. java常用类-String类

    * 字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. * 通过查看API,我们可以知道 * A:字符串字面值"abc"也可以看成是一个字符串对象. * B:字符串是 ...

  6. java常用类String

    String: String类: 代表字符串 是一个final类,代表不可变的字符序列 字符串是常量,用双引号引起来表示.值在创建后不可更改 String对象的字符内容是存储在一个字符数组Value[ ...

  7. Java常用类String的面试题汇总

    比较两个字符串时使用"=="还是equals()方法? 当然是equals方法."=="测试的是两个对象的引用是否相同,而equals()比较的是两个字符串的值 ...

  8. java.lang 类String

    方法摘要1  charcharAt(int index) 返回指定索引处的 char 值.               index - char 值的索引.2 string       concat( ...

  9. Java常用类:String

    一.介绍 String:不可变的Unicode字符序列     例如:"Java"   就是4个Unicode字符J,a,v,a组成的 Java没有内置的字符串类型,而是在标准的J ...

随机推荐

  1. MFC---文档与视图结构

    文档与视图结构 文档.视图的关系,是一对多的映射,一个文档可以对应多个视图,而一个视图只能对应一个文档.例如,一个.html文件,可以用记事本打开,也可以用浏览器打开,这里的.html文件就是文档,记 ...

  2. Python自动批量修改服务器密码

    工作中,我们经常会定期更换服务器密码,如果手动去修改,不仅费时,而且容易出错.下面提供了一种思路,可以实现批量.自动修改服务器密码. 大致思路:首先,为每一台服务器设定一个唯一标识:其次,将每台服务器 ...

  3. Codeforces Round #720 (Div. 2) B. Nastia and a Good Array(被坑好几次)1300

    原题链接 Problem - B - Codeforces 题意 给一串数,要把任意两个相邻的数的最大公约数=1 每次可以进行一个操作: 取下标为i, j的数,和任意二数x,y,且min(ai,aj) ...

  4. 安全开发运维必备,如何进行Nginx代理Web服务器性能优化与安全加固配置,看这篇指南就够了

    本章目录 1.引言 1.1 目的 1.2 目标范围 1.3 读者对象 2.参考说明 2.1 帮助参考 2.2 参数说明 3.3 模块说明 3.服务优化 3.1 系统内核 3.2 编译优化 3.3 性能 ...

  5. python黑帽子(第三章)

    Windows/Linux下包的嗅探 根据os.name判断操作系统 下面是os的源码 posix是Linux nt是Windows 在windows中需要管理员权限.linux中需要root权限 因 ...

  6. Go语言 时间函数

    @ 目录 引言 1. 时间格式化 2. 示例 引言 1946年2月14日,人类历史上公认的第一台现代电子计算机"埃尼阿克"(ENIAC)诞生. 计算机语言时间戳是以1970年1月1 ...

  7. MyBatis插件 - 通用mapper

    1.简单认识通用mapper 1.1.了解mapper 作用:就是为了帮助我们自动的生成sql语句 [ ps:MyBatis需要编写xxxMapper.xml,而逆向工程是根据entity实体类来进行 ...

  8. 论文解读(Graphormer)《Do Transformers Really Perform Bad for Graph Representation?》

    论文信息 论文标题:Do Transformers Really Perform Bad for Graph Representation?论文作者:Chengxuan Ying, Tianle Ca ...

  9. 关于JS精度缺失问题

    问题描述 在Java后端传一个比较大的Long值的时候 前端接收值的时候会出现精度的缺失: 解决办法 添加一个转换类 点击查看代码 public class JacksonObjectMapper e ...

  10. 1.5 Linux中大量使用脚本语言,而不是C语言!

    说到在 Linux 下的编程,很多人会想到用C语言,Linux 的内核.shell.基础命令程序,也的确是用C语言编写的,这首先证明了一点,C语言很强很通用. 到目前为止,C语言依然垄断着计算机工业中 ...