Java字符串操作类学习笔记:String、StringBuffer、StringBuilder

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

字符串或串(String)是由数字、字母、下划线组成的一串字符。一般记为 s=“a1a2···an”(n>=0)。

字符串是编程语言中表示文本的数据类型,在程序设计中,字符串(string)为符号或数值的一个连续序列,如符号串(一串字符)或二进制数字串(一串二进制数字)。

在C语言中没有字符串类型,用字符数组处理字符串。类似的,Java也没有一个字符串类型,其字符串是以 String 类型的对象来实现的。

String 是一个类,当创建一个 String 对象后,所创建的字符串是不能改变的。 在需要使用可修改的字符串时,Java提供两个选择 StringBuffer 和 StringBuilder 。

String 类

String 字符串是只读的,不可变的。 可以查看 String 类的源码,String 类是被 final 关键字修饰的;

创建并初始化字符串:

1). 使用字符串常量直接初始化

String s="hello!";

2). 使用构造方法创建并初始化

String(); //初始化一个对象,表示空字符序列

String(value); //利用已存在的字符串常量创建一个新的对象

String (char[] value); //利用一个字符数组创建一个字符串

String(char[] value,int offset,int count); //截取字符数组offset到count的字符创建一个非空串

String(StringBuffer buffer); //利用StringBuffer对象初始化String对象

String 类常用的方法:

1、字符串的长度:

int length ();

2 、字符串转换

每个类都会实现 toString 方法,因为它是由 Object 定义的,对于大多数的自创建的类来说,通常要重写 toString () 并提供自己的字符串表达式。

3 、字符抽取

charAt(): 返回指定索引处的 char 值。

getChars(): 一次抽取多个字符。

getBytes(): 将字符存储在字节数组里。

4、字符串比较

equals()方法 和 双等号 (==) 运算符 :

equals () 方法是比较 String 对象中的字符. “ == ” 运算符是比较两个对象是否引用同一实例。

boolean startsWith(String prefix): 判断给定的String是否以特定的字符串开始。

boolean startsWith(String prefix,int toffset): 判断此字符从指定索引开始的字符串是否以指定的前缀开始。

endsWith(): 判断给定的String是否是以特定的字符串结束。

compareTo(): 用于比较字符串大小,并考虑大小写字母。

compareIgnoreCase():比较字符串大小并忽略大小写字母。

5、查找字符串

indexOf(): 返回指定子字符串在此字符串中第一次出现处的索引。

lastIndexOf(): 返回指定字符在此字符串中最后一次出现处的索引。

6、更改字符串

因为 String 对象是不能改变的,当需要更改一个字符串时,就必须将他复制到一个 StringBuffered 中,后者使用下列方法,在更改后会构造一个新的字符串副本。

substring(int startIndex): 返回从startIndex开始到调用字符串结束的子串的一个副本

substring(int startIndex,int endIndex),指定起点和终点,返回这中间的字符串,不包括终点。

replace(char originial,char replacement):用一个字符在调用字符串中所有出现另一个字符的地方进行替换。

replace(CharSequence originial,CharSequence replacement):用一个字符串序列替换另一个字符串序列。

trim(): 返回调用字符串对象的一个副本,但是所有起始和结尾的空白符都被删除了(字符中间的空白符未被删除)。

7、字符串大小写

toLowerCase(): 将所有字符改为小写

toUpperCase(): 将所有字符改为大写

8. 连接字符串

连接字符串有两种方式: 使用 concat() 方法、 使用 “+” 运算符:

concat(): 连接两个字符串,与“+”运算符相同。

8. String.format 格式化

String.format 方法: String 类的静态方法,在其内部实际上也是通过创建 Formatter 对象实现的;

System.out.println(String.format("%5d: %2f", 101, 1.131452));

StringBuffer 类

StringBuffer 是 String 的一个对等类,提供了字符串的许多功能,可增长、可改写。

这里只介绍几个StringBuffer类的方法函数:

**1、 append **

append(): 将任何数据类型的字符串表示连接到调用的 StringBuffer 对象的末尾。

当定String对象使用“+”运算符时,经常要调用append方法。

StringBuffer s = new StringBuffer("Hello");
s.append(" World");
s.append(" !");
System.out.println(s); // 输出字符串 “Hello World !”

**2、insert **:

insert(int index,String str) 将一个字符串插入到另一个字符串中。

**3、reverse **

reverse(): 颠倒 StringBuffer 对象中的字符

4、delete

delete(int startIndex,int endIndex),delete(int loc): 调用对象中删除一串字符。

StringBuilder 类

StringBuilder 类是jdk1.5 新增的操作字符串的类,与 StringBuffer 相似,唯一不同的是这个StringBuilder类不是同步的,意味着他不是线程安全的,其优势是更快的性能。

Java 8 默认使用 StringBuilder 拼接字符串。

Java字符串操作类学习笔记:String、StringBuffer、StringBuilder_第1张图片

字符串类 String 、StringBuffer 、StringBuilder 的区别

String 字符串常量, 内容不可变, 是线程安全的

StringBuffer 字符串变量(线程安全, 多线程使用)

StringBuilder 字符串变量, 非线程安全, 单线程使用)

如果程序不是多线程的,那么使用 StringBuilder 效率高于 StringBuffer。

String 在修改时不会改变对象自身。在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String 。

String str = "abc"; //地址str1

str = "def"; //地址str2

StringBuffer在修改时会改变对象自身。每次结果都会对 StringBuffer 对象本身进行操作,而不是生成新的对象,再改变对象引用。所以在一般情况下我们推荐使用 StringBuffer ,特别是字符串对象经常改变的情况下。StringBuffer 上的主要操作是 append 和 insert 方法。

StringBuffer strBuffer = new StringBuffer("abc"); //地址strBuffer,值是abc

strBuffer.append("def"); //地址strBuffer,值是abcdef

拓展内容

检测变量是否为数字或数字字符串

PHP 中有一个有用的方法 is_numeric,检测变量是否是数字型的,Java一样可以实现,只需要自己封装一下即可。

/
  检测变量是否为数字或数字字符串
  
  @param str
  @return
 /
public static boolean is_numeric(String str) {  
    try {  
        Double d= Double.valueOf(str);  
    } catch (java.lang.Exception e) {  
        return false;  
    }  
    return true;  
}

测试 String 、StringBuffer 、StringBuilder 三个类的执行效率

public class StringDemo {
​    public static void main( String[] args ) {
​        final int num = 100000; // 循环次数
        
        // 测试1: String类
​        long start_1 = System.currentTimeMillis();
​        String s1 = "";
​        for (int i = 0; i <= num; i++) {
​            s1 += i;
​        }
​        long end_1 = System.currentTimeMillis();
​        long t1 = end_1 - start_1;
​        System.out.println("String: " + t1);

        // 测试2: StringBuffer类
​        long start_2 = System.currentTimeMillis();
​        StringBuffer sb = new StringBuffer();
​        for (int i = 0; i < num; i++) {
​            sb .append(i);
​        }
​        long end_2 = System.currentTimeMillis();
​        long t2 = end_2 - start_2;
​        System.out.println("StringBuffer: " + t2);

        // 测试3: StringBuilder类
​        long start_3 = System.currentTimeMillis();
​        StringBuilder sBuilder = new StringBuilder();
​        for (int i = 0; i < num; i++) {
​            sBuilder .append(i);
​        }
​        long end_3 = System.currentTimeMillis();
​        long t3 = end_3 - start_3;
​        System.out.println("StringBuilder: " + t3);
​    }
}

在Eclipse中,JDK1.8 测试结果:

// 执行10万次
String: 23755
StringBuffer: 4
StringBuilder: 3

// 执行100万次:
String: 1876562
StringBuffer: 30
StringBuilder: 27

速度: StringBuilder > StringBuffer > String。 但是,可以看到 StringBuilder 与 StringBuffer 速度差距也不是很明显。

参考地址:

https://blog.csdn.net/chenliguan/article/details/51911906
https://blog.csdn.net/longlong2015/article/details/48134701 https://mp.weixin.qq.com/s/Wryv_Psks2teC1JZPQuyGg?

转载于:https://my.oschina.net/wangyongtao/blog/1824202

你可能感兴趣的:(Java字符串操作类学习笔记:String、StringBuffer、StringBuilder)