Java String 类超全整理常用方法、不可变性、常量池、StringBuilderString 的创建方式字符串比较、equals()、compareTo() 比较的是什么equals()比较的是什么compareTo()比较大小String 常用方法整理获取长度与判空 length() 和 isEmpty()获取字符与查找字符数值和字符串互转数字转字符串字符串转数字大小写转换字符串转字符数组格式化字符串字符串替换、拆分、截取字符串替换字符串拆分 split()字符串截取 substring()其他常用操作trim()toUpperCase() / toLowerCase()为什么 String 是不可变对象String 不可变有什么好处一个常见误区频繁拼接字符串为什么不推荐直接用 什么是字符串常量池StringBuilder 和 StringBufferStringBuilderStringBuffer三者区别总结学习 String 最容易踩的坑总结常见坑 1用 比较字符串内容常见坑 2以为 String 能原地修改常见坑 3循环中疯狂用 常见坑 4split() 忘了它用的是正则常见坑 5substring() 边界没搞清笔试面试题例1参数传递 String 的不可变性例2参数传递 的意义这篇文章基于 JavaString类课件内容整理并做了博客化重构。适合Java 初学者复习、面试前快速回顾、写代码时查常用 API。看完这篇文章应该能搞懂下面这些问题String为什么这么重要String有哪些创建方式和equals()到底有什么区别常用字符串 API 该怎么用为什么说String是不可变对象什么是字符串常量池什么时候该用StringBuilder什么时候该用StringBufferString 的创建方式常见写法主要有三种Strings1hello bit;Strings2newString(hello bit);char[]array{h,e,l,l,o};Strings3newString(array);直接使用字符串字面量创建使用new String(...)显式创建对象通过字符数组构造字符串字符串比较、equals()、compareTo() 比较的是什么对于基本类型比较的是值。对于引用类型比较的是是否引用同一个对象。Strings1newString(hello);Strings2newString(hello);Strings3s1;System.out.println(s1s2);// falseSystem.out.println(s1s3);// true虽然s1和s2内容相同但它们是两个不同对象所以结果是false。equals()比较的是什么String重写了Object的equals()方法比较的是字符串内容是否相同。Strings1newString(hello);Strings2newString(hello);Strings3newString(world);System.out.println(s1.equals(s2));// trueSystem.out.println(s1.equals(s3));// falseString重写Object的equals()方法源码部分compareTo()比较大小如果不仅想知道“相不相等”还想知道“谁大谁小”就要用compareTo()。规则如下从前往后逐个字符比较一旦发现不同字符返回字符差值如果前面都相同则返回长度差值System.out.println(abc.compareTo(ac));// -1System.out.println(abc.compareTo(abc));// 0System.out.println(abc.compareTo(abcdef));// -3如果想忽略大小写可以使用compareToIgnoreCase()判断“是不是同一个对象”用判断“内容是不是一样”用equals()判断“字符串大小”用compareTo()String 常用方法整理下面这部分基本就是开发中最常用的字符串 API。获取长度与判空 length() 和 isEmpty()Stringshello;System.out.println(s.length());// 5System.out.println(s.isEmpty());// falselength()获取字符串长度isEmpty()判断字符串长度是否为0获取字符与查找字符常见方法charAt(int index)indexOf(...)lastIndexOf(...)示例Stringsaaabbbcccaaabbbccc;System.out.println(s.charAt(3));// bSystem.out.println(s.indexOf(c));// 6System.out.println(s.indexOf(bbb));// 3System.out.println(s.lastIndexOf(c));// 17数值和字符串互转数字转字符串Strings1String.valueOf(1234);Strings2String.valueOf(12.34);Strings3String.valueOf(true);字符串转数字intnumInteger.parseInt(1234);doubledDouble.parseDouble(12.34);这个在处理输入、配置、接口参数时特别常见。大小写转换Strings1hello;Strings2HELLO;System.out.println(s1.toUpperCase());// HELLOSystem.out.println(s2.toLowerCase());// hello说明toUpperCase()转大写toLowerCase()转小写只会影响字母不会影响数字和符号字符串转字符数组Stringshello;char[]charss.toCharArray();这个方法在做字符统计、双指针、回文判断时特别好用。格式化字符串StringresultString.format(姓名%s年龄%d,张三,18);相比直接使用拼接这种方式更规整也更适合模板化输出。字符串替换、拆分、截取这几个操作在实际开发中非常高频尤其是处理配置、参数、IP、路径时。字符串替换Stringstrhelloworld;System.out.println(str.replaceAll(l,_));System.out.println(str.replaceFirst(l,_));常见方法replaceAll()替换所有匹配项replaceFirst()替换第一个匹配项String是不可变对象替换不会修改原字符串而是返回一个新字符串。字符串拆分 split()Stringstrhello world hello bit;String[]resultstr.split( );如果只想拆成固定组数可以这样写String[]resultstr.split( ,2);拆分特殊字符要注意转义例如拆分 IP 地址Stringip192.168.1.1;String[]arrip.split(\\.);这是因为.在正则表达式中有特殊含义。再比如解析参数Stringstrnamezhangsanage18;String[]itemsstr.split();for(Stringitem:items){String[]pairitem.split();System.out.println(pair[0] pair[1]);}字符串截取 substring()Stringstrhelloworld;System.out.println(str.substring(5));// worldSystem.out.println(str.substring(0,5));// hello索引从0开始substring(begin, end)是前闭后开也就是说substring(0,5)表示包含下标0但不包含下标5。其他常用操作trim()Stringstr hello world ;System.out.println([str.trim()]);作用去掉字符串开头和结尾的空白字符中间空格会保留toUpperCase() / toLowerCase()这两个方法在忽略大小写比较、规范化输入时非常实用。为什么 String 是不可变对象这是String最核心的知识点之一。所谓不可变就是一个String对象一旦创建内容就不能被修改。Stringshello;s world;看起来像是在原字符串上追加内容实际上不是。 真正发生的是原来的hello对象还在新创建了一个hello world对象变量s重新指向新对象所以String的“修改”本质上是创建新对象。String 不可变有什么好处1便于实现字符串常量池如果字符串内容可以随意改常量池中的共享对象就会变得非常危险。2线程安全不可变对象天然更适合多线程场景。3便于缓存哈希值因为内容不会变所以字符串作为HashMap的 key 更稳定。一个常见误区很多人会说String不可变是因为内部数组被final修饰了。这句话并不严谨。final修饰引用表示引用不能再指向别的对象 但并不等于“引用对象内部内容绝对不能改”。String真正不可变的根本原因是它的设计就是如此所有可能改变内容的操作都会返回新对象而不是修改原对象。频繁拼接字符串为什么不推荐直接用因为String不可变。如果我们这样写Strings;for(inti0;i10000;i){si;}每次拼接都会创建新对象中间还会产生很多临时对象性能很差。所以频繁修改字符串时不推荐直接使用String。什么是字符串常量池JVM字符串常量池位置、创建流程、对象个数与intern()StringBuilder 和 StringBuffer为了解决String不适合频繁修改的问题Java 提供了两个可变字符串类StringBuilderStringBufferStringBuilder适合单线程环境下频繁拼接和修改字符串。常用方法append()insert()delete()deleteCharAt()setCharAt()reverse()substring()toString()示例StringBuildersbnewStringBuilder(hello);sb.append( world);sb.append(123);sb.setCharAt(0,H);System.out.println(sb.toString());StringBufferStringBuffer和StringBuilder的功能很像区别在于StringBuffer是线程安全的StringBuilder是线程不安全的但效率通常更高三者区别总结这部分是面试高频题可以直接背下来类型是否可变线程安全效率String不可变是低频繁修改时StringBuilder可变否高StringBuffer可变是相对较低学习 String 最容易踩的坑总结常见坑 1用比较字符串内容错误示例StringanewString(hello);StringbnewString(hello);System.out.println(ab);// false应该用a.equals(b)常见坑 2以为 String 能原地修改实际上每次“修改”都是在创建新对象。常见坑 3循环中疯狂用拼接次数一多性能会明显下降应优先考虑StringBuilder。常见坑 4split()忘了它用的是正则像.、|、*、这种字符直接写可能得不到预期结果。常见坑 5substring()边界没搞清记住四个字就行前闭后开笔试面试题例1参数传递 String 的不可变性StringstrnewString(good);char[]ch{a,b,c};publicstaticvoidmain(Stringargs[]){TestexnewTest();ex.change(ex.str,ex.ch);System.out.print(ex.str and );//good andSystem.out.print(ex.ch);//gbc}publicvoidchange(Stringstr,charch[]){strtest ok;ch[0]g;}1Java 只有值传递调用change(ex.str, ex.ch)时方法形参拿到的是“实参值的拷贝”。但这个“值”如果是对象/数组本质是引用地址的拷贝两份引用都指向同一个对象/数组。2String 是不可变对象immutablepublicvoidchange(Stringstr,charch[]){strtest ok;}这一句只是让“形参 str”改为指向新的字符串test ok。不会影响 ex.str因为 ex.str 仍然指向原来的good。3数组是可变对象ch[0]g;这里没有让ch指向新数组而是通过引用修改了数组内容。因为ex.ch和形参ch指向的是同一个数组所以修改会反映到外面。例2参数传递 的意义publicclassSystemUtil{publicstaticbooleanisAdmin(StringuserId){returnuserId.toLowerCase()admin;}publicstaticvoidmain(String[]args){System.out.println(isAdmin(Admin));}}这题考点字符串比较用vsequals以及String不可变/字符串常量池、toLowerCase()可能返回新对象、空指针风险。比较的是“引用是否同一个对象”不是内容。admin是字符串字面量通常在常量池里userId.toLowerCase()返回的字符串不保证就是常量池里的同一个对象即使内容是admin所以 admin可能为false。
【Java SE】Java String 类超全整理:常用方法、不可变性、常量池、StringBuilder
发布时间:2026/6/7 0:15:38
Java String 类超全整理常用方法、不可变性、常量池、StringBuilderString 的创建方式字符串比较、equals()、compareTo() 比较的是什么equals()比较的是什么compareTo()比较大小String 常用方法整理获取长度与判空 length() 和 isEmpty()获取字符与查找字符数值和字符串互转数字转字符串字符串转数字大小写转换字符串转字符数组格式化字符串字符串替换、拆分、截取字符串替换字符串拆分 split()字符串截取 substring()其他常用操作trim()toUpperCase() / toLowerCase()为什么 String 是不可变对象String 不可变有什么好处一个常见误区频繁拼接字符串为什么不推荐直接用 什么是字符串常量池StringBuilder 和 StringBufferStringBuilderStringBuffer三者区别总结学习 String 最容易踩的坑总结常见坑 1用 比较字符串内容常见坑 2以为 String 能原地修改常见坑 3循环中疯狂用 常见坑 4split() 忘了它用的是正则常见坑 5substring() 边界没搞清笔试面试题例1参数传递 String 的不可变性例2参数传递 的意义这篇文章基于 JavaString类课件内容整理并做了博客化重构。适合Java 初学者复习、面试前快速回顾、写代码时查常用 API。看完这篇文章应该能搞懂下面这些问题String为什么这么重要String有哪些创建方式和equals()到底有什么区别常用字符串 API 该怎么用为什么说String是不可变对象什么是字符串常量池什么时候该用StringBuilder什么时候该用StringBufferString 的创建方式常见写法主要有三种Strings1hello bit;Strings2newString(hello bit);char[]array{h,e,l,l,o};Strings3newString(array);直接使用字符串字面量创建使用new String(...)显式创建对象通过字符数组构造字符串字符串比较、equals()、compareTo() 比较的是什么对于基本类型比较的是值。对于引用类型比较的是是否引用同一个对象。Strings1newString(hello);Strings2newString(hello);Strings3s1;System.out.println(s1s2);// falseSystem.out.println(s1s3);// true虽然s1和s2内容相同但它们是两个不同对象所以结果是false。equals()比较的是什么String重写了Object的equals()方法比较的是字符串内容是否相同。Strings1newString(hello);Strings2newString(hello);Strings3newString(world);System.out.println(s1.equals(s2));// trueSystem.out.println(s1.equals(s3));// falseString重写Object的equals()方法源码部分compareTo()比较大小如果不仅想知道“相不相等”还想知道“谁大谁小”就要用compareTo()。规则如下从前往后逐个字符比较一旦发现不同字符返回字符差值如果前面都相同则返回长度差值System.out.println(abc.compareTo(ac));// -1System.out.println(abc.compareTo(abc));// 0System.out.println(abc.compareTo(abcdef));// -3如果想忽略大小写可以使用compareToIgnoreCase()判断“是不是同一个对象”用判断“内容是不是一样”用equals()判断“字符串大小”用compareTo()String 常用方法整理下面这部分基本就是开发中最常用的字符串 API。获取长度与判空 length() 和 isEmpty()Stringshello;System.out.println(s.length());// 5System.out.println(s.isEmpty());// falselength()获取字符串长度isEmpty()判断字符串长度是否为0获取字符与查找字符常见方法charAt(int index)indexOf(...)lastIndexOf(...)示例Stringsaaabbbcccaaabbbccc;System.out.println(s.charAt(3));// bSystem.out.println(s.indexOf(c));// 6System.out.println(s.indexOf(bbb));// 3System.out.println(s.lastIndexOf(c));// 17数值和字符串互转数字转字符串Strings1String.valueOf(1234);Strings2String.valueOf(12.34);Strings3String.valueOf(true);字符串转数字intnumInteger.parseInt(1234);doubledDouble.parseDouble(12.34);这个在处理输入、配置、接口参数时特别常见。大小写转换Strings1hello;Strings2HELLO;System.out.println(s1.toUpperCase());// HELLOSystem.out.println(s2.toLowerCase());// hello说明toUpperCase()转大写toLowerCase()转小写只会影响字母不会影响数字和符号字符串转字符数组Stringshello;char[]charss.toCharArray();这个方法在做字符统计、双指针、回文判断时特别好用。格式化字符串StringresultString.format(姓名%s年龄%d,张三,18);相比直接使用拼接这种方式更规整也更适合模板化输出。字符串替换、拆分、截取这几个操作在实际开发中非常高频尤其是处理配置、参数、IP、路径时。字符串替换Stringstrhelloworld;System.out.println(str.replaceAll(l,_));System.out.println(str.replaceFirst(l,_));常见方法replaceAll()替换所有匹配项replaceFirst()替换第一个匹配项String是不可变对象替换不会修改原字符串而是返回一个新字符串。字符串拆分 split()Stringstrhello world hello bit;String[]resultstr.split( );如果只想拆成固定组数可以这样写String[]resultstr.split( ,2);拆分特殊字符要注意转义例如拆分 IP 地址Stringip192.168.1.1;String[]arrip.split(\\.);这是因为.在正则表达式中有特殊含义。再比如解析参数Stringstrnamezhangsanage18;String[]itemsstr.split();for(Stringitem:items){String[]pairitem.split();System.out.println(pair[0] pair[1]);}字符串截取 substring()Stringstrhelloworld;System.out.println(str.substring(5));// worldSystem.out.println(str.substring(0,5));// hello索引从0开始substring(begin, end)是前闭后开也就是说substring(0,5)表示包含下标0但不包含下标5。其他常用操作trim()Stringstr hello world ;System.out.println([str.trim()]);作用去掉字符串开头和结尾的空白字符中间空格会保留toUpperCase() / toLowerCase()这两个方法在忽略大小写比较、规范化输入时非常实用。为什么 String 是不可变对象这是String最核心的知识点之一。所谓不可变就是一个String对象一旦创建内容就不能被修改。Stringshello;s world;看起来像是在原字符串上追加内容实际上不是。 真正发生的是原来的hello对象还在新创建了一个hello world对象变量s重新指向新对象所以String的“修改”本质上是创建新对象。String 不可变有什么好处1便于实现字符串常量池如果字符串内容可以随意改常量池中的共享对象就会变得非常危险。2线程安全不可变对象天然更适合多线程场景。3便于缓存哈希值因为内容不会变所以字符串作为HashMap的 key 更稳定。一个常见误区很多人会说String不可变是因为内部数组被final修饰了。这句话并不严谨。final修饰引用表示引用不能再指向别的对象 但并不等于“引用对象内部内容绝对不能改”。String真正不可变的根本原因是它的设计就是如此所有可能改变内容的操作都会返回新对象而不是修改原对象。频繁拼接字符串为什么不推荐直接用因为String不可变。如果我们这样写Strings;for(inti0;i10000;i){si;}每次拼接都会创建新对象中间还会产生很多临时对象性能很差。所以频繁修改字符串时不推荐直接使用String。什么是字符串常量池JVM字符串常量池位置、创建流程、对象个数与intern()StringBuilder 和 StringBuffer为了解决String不适合频繁修改的问题Java 提供了两个可变字符串类StringBuilderStringBufferStringBuilder适合单线程环境下频繁拼接和修改字符串。常用方法append()insert()delete()deleteCharAt()setCharAt()reverse()substring()toString()示例StringBuildersbnewStringBuilder(hello);sb.append( world);sb.append(123);sb.setCharAt(0,H);System.out.println(sb.toString());StringBufferStringBuffer和StringBuilder的功能很像区别在于StringBuffer是线程安全的StringBuilder是线程不安全的但效率通常更高三者区别总结这部分是面试高频题可以直接背下来类型是否可变线程安全效率String不可变是低频繁修改时StringBuilder可变否高StringBuffer可变是相对较低学习 String 最容易踩的坑总结常见坑 1用比较字符串内容错误示例StringanewString(hello);StringbnewString(hello);System.out.println(ab);// false应该用a.equals(b)常见坑 2以为 String 能原地修改实际上每次“修改”都是在创建新对象。常见坑 3循环中疯狂用拼接次数一多性能会明显下降应优先考虑StringBuilder。常见坑 4split()忘了它用的是正则像.、|、*、这种字符直接写可能得不到预期结果。常见坑 5substring()边界没搞清记住四个字就行前闭后开笔试面试题例1参数传递 String 的不可变性StringstrnewString(good);char[]ch{a,b,c};publicstaticvoidmain(Stringargs[]){TestexnewTest();ex.change(ex.str,ex.ch);System.out.print(ex.str and );//good andSystem.out.print(ex.ch);//gbc}publicvoidchange(Stringstr,charch[]){strtest ok;ch[0]g;}1Java 只有值传递调用change(ex.str, ex.ch)时方法形参拿到的是“实参值的拷贝”。但这个“值”如果是对象/数组本质是引用地址的拷贝两份引用都指向同一个对象/数组。2String 是不可变对象immutablepublicvoidchange(Stringstr,charch[]){strtest ok;}这一句只是让“形参 str”改为指向新的字符串test ok。不会影响 ex.str因为 ex.str 仍然指向原来的good。3数组是可变对象ch[0]g;这里没有让ch指向新数组而是通过引用修改了数组内容。因为ex.ch和形参ch指向的是同一个数组所以修改会反映到外面。例2参数传递 的意义publicclassSystemUtil{publicstaticbooleanisAdmin(StringuserId){returnuserId.toLowerCase()admin;}publicstaticvoidmain(String[]args){System.out.println(isAdmin(Admin));}}这题考点字符串比较用vsequals以及String不可变/字符串常量池、toLowerCase()可能返回新对象、空指针风险。比较的是“引用是否同一个对象”不是内容。admin是字符串字面量通常在常量池里userId.toLowerCase()返回的字符串不保证就是常量池里的同一个对象即使内容是admin所以 admin可能为false。