Java使用类-String
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的更多相关文章
- 从字节码和JVM的角度解析Java核心类String的不可变特性
1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用Stri ...
- Java 常用类String类、StringBuffer类
常用类 String类.StringBuffer类 String代表不可变的字符序列 "xxxxxxx"为该类的对象 举例(1) public class Test { publi ...
- 深入理解Java常用类----String
Java中字符串的操作可谓是最常见的操作了,String这个类它封装了有关字符串操作的大部分方法,从构建一个字符串对象到对字符串的各种操作都封装在该类中,本篇我们通过阅读String类的源码 ...
- 深入理解Java常用类----String(二)
上篇介绍了String类的构造器,获取内部属性等方法,最后留下了最常用的局部操作函数没有介绍,本篇将接着上篇内容,从这些最常见的函数的操作说起,看看我们日常经常使用的这些方法的内部是怎么实现的.第一个 ...
- java常用类-String类
* 字符串:就是由多个字符组成的一串数据.也可以看成是一个字符数组. * 通过查看API,我们可以知道 * A:字符串字面值"abc"也可以看成是一个字符串对象. * B:字符串是 ...
- java常用类String
String: String类: 代表字符串 是一个final类,代表不可变的字符序列 字符串是常量,用双引号引起来表示.值在创建后不可更改 String对象的字符内容是存储在一个字符数组Value[ ...
- Java常用类String的面试题汇总
比较两个字符串时使用"=="还是equals()方法? 当然是equals方法."=="测试的是两个对象的引用是否相同,而equals()比较的是两个字符串的值 ...
- java.lang 类String
方法摘要1 charcharAt(int index) 返回指定索引处的 char 值. index - char 值的索引.2 string concat( ...
- Java常用类:String
一.介绍 String:不可变的Unicode字符序列 例如:"Java" 就是4个Unicode字符J,a,v,a组成的 Java没有内置的字符串类型,而是在标准的J ...
随机推荐
- JWT&RSA实现单点登录(详细介绍)
今天给大家讲一下基于JWT&RSA的单点登录(Single Sign On,简称SSO)解决方案 概念 首先要了解几个概念 单点登录(Single Sign On) JWT RSA 背景 为什 ...
- 【LeetCode】358.K 距离间隔重排字符串
358.K 距离间隔重排字符串 知识点:哈希表:贪心:堆:队列 题目描述 给你一个非空的字符串 s 和一个整数 k,你要将这个字符串中的字母进行重新排列,使得重排后的字符串中相同字母的位置间隔距离至少 ...
- netty系列之:java中的base64编码器
简介 什么是Base64编码呢?在回答这个问题之前,我们需要了解一下计算机中文件的分类,对于计算机来说文件可以分为两类,一类是文本文件,一类是二进制文件. 对于二进制文件来说,其内容是用二进制来表示的 ...
- 新手小白入门C语言第六章:C运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号.C 语言内置了丰富的运算符,并提供了以下类型的运算符: 算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 杂项运算符 小编将会为大家逐一介 ...
- 群晖下虚拟机编译部署WOW服务端TrinityCore
前言 前几天突然想玩WOW了,但是我是一个特别轻度的玩家,以前点卡的时候,我就是上去一个人做做任务,跑跑地图,不怎么玩副本和PVP,现在让我花钱充月卡,不太现实,没那个时间玩,所以,就考虑玩个私服,但 ...
- Java语言学习day32--8月07日
###07正则表达式邮箱地址验证 * A: 正则表达式邮箱地址验证 * a: 案例代码 public class RegexDemo2 { public static void main(String ...
- 2021.08.16 P1300 城市街道交通费系统(dfs)
2021.08.16 P1300 城市街道交通费系统(dfs) P1300 城市街道交通费系统 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 城市街道交费系统最近创立了.一 ...
- .Net中字符串不变性与相等判断的特殊场景
今天写bug的时候帮同事解决了一个有趣的问题,可能很多人都会答错.分享给大家. 问题 请看以下例子,并回答问题. var s1 = "12"; var s2 = "12& ...
- Oracle 存储过程使用总结
参考 https://blog.csdn.net/weixin_41968788/article/details/83659164/ 创建 注意:一定不要漏掉了语句末尾的分号 DBMS_OUTPUT. ...
- 如何使用phpstudy搭建sqli-lab靶场
一.环境准备 下载并安装phpstudy,链接如下: phpstudy下载 选择自己想要的版本,安装目录自己选,其他的一路默认即可 二.下载源码 源码链接:sqli-labs源码下载 选择Downlo ...