Java容器深入浅出之String、StringBuffer、StringBuilder

简介: 对字符串的花式处理一直是现代应用系统的主要操作之一,也是对Java基础知识考察的重要方面。事实上,Java字符串类的底层是通过数组来实现的。具体来说,String类是固定长度的数组,StringBuffer和StringBuilder则是可变长度的,其底层是通过Arrays.copyOf的方法,复制了另外的一个数组,实现了一个内部扩容机制,从而实现一种“伪可变”。

对字符串的花式处理一直是现代应用系统的主要操作之一,也是对Java基础知识考察的重要方面。事实上,Java字符串类的底层是通过数组来实现的。具体来说,String类是固定长度的数组,StringBuffer和StringBuilder则是可变长度的,其底层是通过Arrays.copyOf的方法,复制了另外的一个数组,实现了一个内部扩容机制,从而实现一种“伪可变”。

Java字符串要点

1. String类是不可变类,一旦创建,包含在String对象中的字符数组是不可变的,直至该对象被回收。但是正如数组一样,可以更改对象的引用,指向另一个String对象。

2. StringBuffer在使用上呈现出一个可变的字符数组的对象,因此有增删查改的方法。该类通过synchronized同步方法实现线程安全。

3. StringBuilder的构造方法和API与StringBuffer类似,不过是线程不安全的,因此性能较高。

String类构造方法和方法说明

 1 package org.leo.demo.arrays;
 2 
 3 import java.io.UnsupportedEncodingException;
 4 //因为String类的不可变性,因此所有的连接、截取操作,都不改变原字符串的值。
 5 public class TestString {
 6 
 7     public static void main(String[] args) throws UnsupportedEncodingException {
 8         //字符串初始化
 9         String s1 = "Hello World!";
10         System.out.println(s1);
11         //通过byte[]和码表来构造字符串
12         byte[] b = {21, 97, 12, 100};
13         String s3 = new String(b, "utf-8");//有UnsupportedEncodingException异常抛出
14         System.out.println(s3);
15 
16         //返回字符串长度
17         String s2 = new String("aeiou");
18         System.out.println(s2.replace('a', '$'));
19         System.out.println("s2.length()" + s2.length());
20         //通过索引查找字符
21         System.out.println("s2.charAt(2):" + s2.charAt(2));
22         //查找索引
23         System.out.println("s2.indexOf('o')" + s2.indexOf('o'));
24         System.out.println("s2.indexOf(\"io\")" + s2.indexOf("io"));
25         //查找前缀/后缀
26         System.out.println("s2.endsWith(\"ih\")"+s2.endsWith("ih"));
27         System.out.println("s2.startsWith(\"ae\")" + s2.startsWith("ae"));
28         //字符串的比较
29         String s21 = new String("aeiouwww");
30         String s22 = new String("aewou");
31         System.out.println("s2.compareTo(s21):"+s2.compareTo(s21));
32         System.out.println("s2.compareTo(s22):"+s2.compareTo(s22));
33         StringBuffer sb1 = new StringBuffer("aeiousss");
34         System.out.println("s2.contentEquals(sb1):"+s2.contentEquals(sb1));
35         System.out.println("s2.equals(s22)"+s2.equals(s22));
36         //连接
37         System.out.println(s1.concat(s2));//相当于"+"
38         char[] c = new char[] {'a','e','i','h','h','j'};
39         String s4 = String.copyValueOf(c, 1, 3);
40         System.out.println(s4);
41         //数组化
42         byte[] b1 = s4.getBytes();
43         System.out.println(b1.toString());
44         s4.getChars(1, 2, c, 2);
45         System.out.println(c.toString());
46         System.out.println(s4.toCharArray());
47         
48         for(byte cc:b1) {
49             System.out.print(cc + " ");
50         }
51     }
52 
53 }

StringBuilder常用方法说明

 1 package org.leo.demo.string;
 2 
 3 public class TestStringBuilder {
 4 
 5     public static void main(String[] args) {
 6 
 7         StringBuilder sb = new StringBuilder();
 8         System.out.println(sb.hashCode());
 9         //增(追加)
10         sb.append("Java");
11         //增(插入)
12         sb.insert(0, "Hello ");
13         //
14         sb.replace(5, 6, ",");
15         //
16         sb.delete(5, 6);
17         System.out.println(sb);
18         //
19         char c = sb.charAt(5);
20         System.out.println(c);
21         //反转
22         sb.reverse();
23         System.out.println(sb);
24         //长度及容量
25         System.out.println("sb.length():" + sb.length());
26         System.out.println("sb.capacity():" + sb.capacity());
27         //取子串
28         String string = sb.substring(2, 6);
29         System.out.println(string);
30         //改变长度,将保留前n的StringBuilder对象
31         sb.setLength(4);
32         System.out.println(sb);
33         System.out.println(sb.hashCode());
34     }
35 
36 }
目录
相关文章
|
4月前
|
Java 虚拟化 容器
(Java)Java里JFrame窗体的基本操作(容器布局篇-1)
容器 容器,我的理解是可以包容其他东西的玩意。它可以是一个盒子,可以是一个虚拟化的物品,可只要能包裹住其他存在质体的东西,那么都可以称作是容器。例如:JPanel组件和JScollPane组件两者都是容器也是组件。 既然有容器,那么容器中的布局就必不可少了。不然不规矩的摆放物品,人类看不习惯,我也看不习惯 ???? 本篇内容,将说明java JFrame窗体里容器中几类布局。 说明:所有在JFrame窗体里的容器布局都会使用setLayout()方法,采用的布局参数都将放进这个方法里 绝对布局 调用窗体容器
161 2
|
4月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
354 5
|
6月前
|
存储 SQL 缓存
Java字符串处理:String、StringBuilder与StringBuffer
本文深入解析Java中String、StringBuilder和StringBuffer的核心区别与使用场景。涵盖字符串不可变性、常量池、intern方法、可变字符串构建器的扩容机制及线程安全实现。通过性能测试对比三者差异,并提供最佳实践与高频面试问题解析,助你掌握Java字符串处理精髓。
|
7月前
|
自然语言处理 Java Apache
在Java中将String字符串转换为算术表达式并计算
具体的实现逻辑需要填写在 `Tokenizer`和 `ExpressionParser`类中,这里只提供了大概的框架。在实际实现时 `Tokenizer`应该提供分词逻辑,把输入的字符串转换成Token序列。而 `ExpressionParser`应当通过递归下降的方式依次解析
419 14
|
8月前
|
存储 缓存 安全
Java 集合容器常见面试题及详细解析
本文全面解析Java集合框架,涵盖基础概念、常见接口与类的特点及区别、底层数据结构、线程安全等内容。通过实例讲解List(如ArrayList、LinkedList)、Set(如HashSet、TreeSet)、Map(如HashMap、TreeMap)等核心组件,帮助读者深入理解集合容器的使用场景与性能优化。适合准备面试或提升开发技能的开发者阅读。
140 0
|
8月前
|
缓存 Java API
Java 集合容器实操技巧与案例详解
本教程基于Java 8+新特性和现代开发实践,深入讲解Java集合容器的实操技巧。通过具体场景演示Stream API数据处理、ConcurrentHashMap并发控制、LinkedHashMap实现LRU缓存、TreeSet自定义排序等高级特性。同时涵盖computeIfAbsent优化操作、EnumMap专用集合使用、集合统计与运算(交集、并集、差集)等内容。代码示例丰富,助力掌握高效编程方法。[点击获取完整代码](https://pan.quark.cn/s/14fcf913bae6)。
141 0
|
存储 安全 算法
Java容器及其常用方法汇总
Java Collections框架提供了丰富的接口和实现类,用于管理和操作集合数据。
235 2
Java容器及其常用方法汇总
|
11月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
311 11
|
11月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、"+"操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
335 9