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. python---插入排序的实现

    插入排序 思想 ​ 列表被分为有序区和无序区两个部分, 最初有序区只有一个元素, 每次从无序区选择一个元素, 插入到有序区的位置, 直到无序区变空 import random from cal_tim ...

  2. ArcGIS使用技巧(七)——批量导出

    新手,若有错误还请指正! 在ArcGIS中如何将栅格数据批量导出?用到"复制栅格这个工具",这里我用的例子是:将ArcGIS默认输出的DEM文件夹批量导出为tif格式.(如果是文件 ...

  3. 机器学习基础:奇异值分解(SVD)

    SVD 原理 奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解,也是在机器学习领域广泛应用的算法,它不光可以用于降维算法中的特征分解,还可以用于推荐 ...

  4. 被人DDoS攻击了,分析一下原理和防护

    一.行业现象 1.1 为什么要攻击? 常见的,一个是同行恶意竞争,一个是敲诈勒索. 无论是传统行业的线下门店,还是互联网行业的门户网站.APP产品,都存在着竞争关系,争相获得更多客源,究其目的,无非是 ...

  5. 攻防世界-MISC:pdf

    这是攻防世界新手练习区的第二题,题目如下: 点击附件1下载,打开后发现是一个pdf文件,里面只有一张图片 用WPS打开,没发现有什么不对的地方,参考一下WP,说是要转为word格式.随便找一个在线转换 ...

  6. XCTF练习题---MISC---适合作为桌面

    XCTF练习题---适合作为桌面 flag:flag{38a57032085441e7} 解题步骤: 1.观察题目,下载附件 2.拿到题目以后是一张图片,切换一下通道,发现一张二维码,使用QR进行翻译 ...

  7. 浅谈Nginx性能调优

    点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! Linux系统参数优化 下文中提到的一些配置,需要较新的 ...

  8. 《手把手教你》系列基础篇(九十七)-java+ selenium自动化测试-框架设计篇-Selenium方法的二次封装和页面基类(详解教程)

    1.简介 上一篇宏哥介绍了如何设计支持不同浏览器测试,宏哥的方法就是通过来切换配置文件设置的浏览器名称的值,来确定启动什么浏览器进行脚本测试.宏哥将这个叫做浏览器引擎类.这个类负责获取浏览器类型和启动 ...

  9. 公众号走走看看——js

    1.数字转换字符串/字符串转换数字 2.短循环 3.性能测试(执行时间) 4.交换值 5.合并数组(IE不兼容) 6.数组去重 7.判断给定参数是否是数字 8.获取最大最小值.取随机数(arr.len ...

  10. VUE3 之 Teleport - 这个系列的教程通俗易懂,适合新手

    1. 概述 老话说的好:宰相肚里能撑船,但凡成功的人,都有一种博大的胸怀. 言归正传,今天我们来聊聊 VUE 中 Teleport 的使用. 2. Teleport 2.1 遮罩效果的实现  < ...