
目录
1.String类的介绍
1.1 创建字符串
1.2 字符串查找
1.3 转化
1.4 字符串的拆分
1.5 字符串截取
1.6 去掉两边空格
2.常量池
使用intern将对象添加到常量池
String类的两种实例化方式
3.字符串的不可变性
4.StringBuffer和StringBuilder
面试题
在Java语言中,提供一个字符串类型,也就是String,但是它不同于int、char等基本数据类型
String是属于引用数据类型,只要是双引号修饰的字符串都是String对象
使用常量串构造
String s1 = "hello bit";
直接newString对象
String s2 = new String("hello bit");
使用字符数组进行构造
char[] array = {'h','e','l','l','o','b','i','t'};
String类内部不存在字符串本身,其源码中含有value字符数组和hash成员变量
实际上字符串是存在char类型的数组中
| 方法 | 功能 |
| char charAt(int index) | 返回 index 位置上字符,如果 index 为负数或者越界,抛出 IndexOutOfBoundsException 异常 |
| int indexOf(int ch) | 返回 ch 第一次出现的位置,没有返回 -1 |
| int indexOf(int ch, int fromIndex) | 从 fromIndex 位置开始找 ch 第一次出现的位置,没有返回 -1 |
| int indexOf(String str) | 返回 str 第一次出现的位置,没有返回 -1 |
| int indexOf(String str, int fromIndex) | 从 fromIndex 位置开始找 str 第一次出现的位置,没有返回 -1 |
| int lastIndexOf(int ch) | 从后往前找,返回 ch 第一次出现的位置,没有返回 -1 |
| int lastIndexOf(int ch, int fromIndex) | 从 fromIndex 位置开始找,从后往前找 ch 第一次出现的位置,没有返 回-1 |
| int lastIndexOf(String str) | 从后往前找,返回 str 第一次出现的位置,没有返回 -1 |
| int lastIndexOf(String str, int fromIndex) | 从 fromIndex 位置开始找,从后往前找 str 第一次出现的位置,没有返 回-1 |
String s = "aaabbbcccaaabbbccc";
System.out.println(s.charAt(3)); // 'b'
System.out.println(s.indexOf('c')); // 6
System.out.println(s.indexOf('c', 10)); // 15
System.out.println(s.indexOf("bbb")); // 3
System.out.println(s.indexOf("bbb", 10)); // 12
System.out.println(s.lastIndexOf('c')); // 17
System.out.println(s.lastIndexOf('c', 10)); // 8
System.out.println(s.lastIndexOf("bbb")); // 12
System.out.println(s.lastIndexOf("bbb", 10)); // 3
数值和字符串转化
// 数字转字符串
String s1 = String.valueOf(1234);
String s2 = String.valueOf(12.34);
String s3 = String.valueOf(true);
String s4 = String.valueOf(new Student("Hanmeimei", 18));
// 字符串转数字
int data1 = Integer.parseInt("1234");
double data2 = Double.parseDouble("12.34");
System.out.println(data1);
System.out.println(data2);
大小写转换
| 方法 | 功能 |
| String toUpperCase() | 字符串转大写 |
| String toLowerCase() | 字符串转小写 |
String s1 = "hello"; String s2 = "HELLO"; // 小写转大写 System.out.println(s1.toUpperCase()); // 大写转小写 System.out.println(s2.toLowerCase());
字符串转数组
String s = "hello";
// 字符串转数组
char[] ch = s.toCharArray();
for (int i = 0; i < ch.length; i++) {
System.out.print(ch[i]);
}
格式化
public static void main(String[] args) {
String s = String.format("%d-%d-%d", 2019, 9,14);
System.out.println(s);
}
指定字符串替换
| 方法 | 功能 |
| String replaceAll(String regex, String replacement) | 替换所有的指定内容 |
| String replaceFirst(String regex, String replacement) | 替换收个内容 |
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_")); //he__o wor_d
System.out.println(str.replaceFirst("l", "_"));//he_lo world
| 方法 | 功能 |
| String[] split(String regex) | 将字符串全部拆分 |
| String[] split(String regex, int limit) | 将字符串以指定的格式,拆分为 limit 组 |
String str = "hello world hello bit" ;
String[] result = str.split(" ") ;// 按照空格拆分
for(String s: result) {
System.out.println(s);
}
注:1. 字符"|","*","+"都得加上转义字符,前面加上 "\" .
2. 而如果是 "" ,那么就得写成 "\\" .
3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.
| 方法 | 功能 |
| String substring(int beginIndex) | 从指定索引截取到结尾 |
| String substring(int beginIndex, int endIndex) | 截取部分内容 |
String str = "helloworld" ; System.out.println(str.substring(5));//world System.out.println(str.substring(0, 5));//hello
| 方法 | 功能 |
| String trim() | 去掉字符串中的左右空格 , 保留中间空格 |
String str = " hello world " ;
System.out.println("["+str+"]");//[ hello world ]
System.out.println("["+str.trim()+"]");[hello world]
为了方便创建String对象,相同的值只储存一份,节省内存,共同访问
只要是双引号修饰的字符串都放入常量池中
Java中实现了常量池技术,除此之外,还有"内存池", "线程池", "数据库连接池"等池思想
设置有常量池的基本类型的包装类:
boolean、byte、short、integer、long、character
基本类型包装类没有设置常量池的:
float、double
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");
System.out.println(s1 == s2); // true
System.out.println(s1 == s3); // false
System.out.println(s3 == s4); // false
String s1="hello";
String s2="hello";
String s3=new String("world");
String s4=new String("world");
intern 是一个native方法(Native方法指:底层使用C++实现的,看不到其实现的源代码),该方法的作用是手动将创建的String对象添加到常量池中。
public static void main(String[] args) {
char[] ch = new char[]{'a', 'b', 'c'};
String s1 = new String(ch); // s1对象并不在常量池中
//s1.intern(); // s1.intern();调用之后,会将s1对象的引用放入到常量池中 String s2 = "abc";
// "abc" 在常量池中存在了,s2创建时直接用常量池中"abc"的引用
System.out.println(s1 == s2);
}
// 输出false
// 将上述方法打开之后,就会输出true
| 实例化方式 | 产生实例化对象数 | 是否入字符串常量池 | 是否可以实现重用 |
| 直接赋值(String str = "hello") | 一个 | 自动加入字符串常量池 | 可以重用 |
| 构造方法(String str = new String("hello") ) | 两个 | 不会自动入池,可以手工入池 | 注入池中才可重用 |
对字符串的操作,无论是字符串的拆分,大小写的转化、还是替换都是产生了新的对象
也就是说,String原来的对象并没有发生改变,因为String类在修饰时就是不可改变
其内部时通过final修饰的,意味着String类不能被继承
并且value字符数组本身也被final修饰,表明自身的值也是不能被修改的,即不能引用其他字符数
组,但是其引用空间中的内容可以修改
字符串中的引用空间中的内容不可通过外部修改,是因为String类中没有get set方法,并且value通过private修饰,不是由于final的原因
由于String类有不可变性,为了方便字符串的修改,Java提供了StringBuffer和StringBuilder
String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可 以修改。
频繁修改字符串的情况考虑使用StringBuilder.
两者的用法差不多,StringBuffer和String具有线程安全性,但StringBuilder没有
这两个类在String类的基础之上添加了比较重要的一个方法append
| StringBuff append(String str) | 在尾部追加,相当于 String 的 += ,可以追加: boolean 、 char 、 char[] 、double、 flfloat 、 int 、 long 、 Object 、 String 、 StringBuffff 的变量 |
| char charAt(int index) | 获取 index 位置的字符 |
| int length() | 获取字符串的长度 |
| int capacity() | 获取底层保存字符串空间总的大小 |
| void ensureCapacity(int mininmumCapacity) | 扩容 |
| void setCharAt(int index, char ch) | 将 index 位置的字符设置为 ch |
| int indexOf(String str) | 返回 str 第一次出现的位置 |
| int indexOf(String str, int fromIndex) | 从 fromIndex 位置开始查找 str 第一次出现的位置 |
| int lastIndexOf(String str) | 返回最后一次出现 str 的位置 |
| int lastIndexOf(String str, int fromIndex) | 从 fromIndex 位置开始找 str 最后一次出现的位置 |
| StringBuffff insert(int offffset, String str) | 在 offffset 位置插入:八种基类类型 & String 类型 & Object 类型数据 |
| StringBuffffer deleteCharAt(int index) | 删除 index 位置字符 |
| StringBuffffer delete(int start, int end) | 删除 [start, end) 区间内的字符 |
| StringBuffffer replace(int start, int end, String str) | 将 [start, end) 位置的字符替换为 str |
| String substring(int start) | 从 start 开始一直到末尾的字符以 String 的方式返回 |
| String substring(int start , int end) | 将 [start, end) 范围内的字符以 String 的方式返回 |
| StringBuffffer reverse() | 反转字符串 |
| String toString() | 将所有字符按照 String 的方式返回 |
以下总共创建了多少个String对象
String str = new String("ab"); // 会创建2个对象
String str = new String("a") + new String("b"); // 会创建6个对象