String类

一、String类

1.1字符数组转换为字符串

char[] array = {'a''b''c'}String str = new String(array)System.out.println(str)

1.2计算字符串长度

str.length();或者"hello".length()

1.3判断字符串是不是空的

String str1 = "";
System.out.println(str1.isEmpty());

输出结果是true

String str2 = null;
System.out.println(str2.isEmpty());

运行时出现空指针异常

1.4比较字符串

String str1 = new String("abcd");
String str2 = new String("abcd");
System.out.println(str1 == str2);//输出结果是false,因为str1和str2存的是不同对象的引用,==两边比较的是地址,equals比较的是字符串具体的内容
System.out.println(str1.equals(str2));//输出结果是true,String类中重写了Object类中的equals方法,所以优先调用重写的equals方法

String str3 = ("abcd");
String str4 = ("abcd");
System.out.println(str3 = str4);//输出结果是true,字符串常量池,涉及哈希表的知识。堆中会有一个常量池(StringTable),其实就是一个哈希表,用来提高存储效率,存储双引号引起来的字符串(存储字符串的常量值),1.看常量池是否存在当前字符串,2.没有则存进去,3.有则获取这个字符串在常量池当中的地址

String str1 = "abcd";
String str2 = "abcdef";
System.out.println(str1.compareTo(str2));//输出结果是负数,String类实现了Comparable接口,重写了Comparable中的compareTo方法

String str1 = "abcd";
String str2 = "Abcd";
System.out.println(str1.compareToIgnoreCase(str2));//输出结果是0,忽略大小写进行比较

1.5查找字符串

String str1 = "abcdef";
char ch = str1.charAt(2);
System.out.println(ch);//输出结果是c

int index = str1.indexOf('c');
System.out.println(index);//输出结果是2,获取'c'首次出现位置的下标,indexOf函数实现了重载

int index = str1.indexOf("de");
System.out.println(index);//输出结果是3,获取"de"首次出现位置的下标

int index = str1.indexOf('c', 3);
System.out.println(index);//输出结果是-1,从下标为3的位置开始找'c',找不到返回-1

int index = str1.indexOf("ab", 3);//从下标为3的位置开始找"ab",找不到返回-1
        
String str2 = "ababcdabcdef";
int index2= str2.lastIndexOf('a');
System.out.println(index2);//输出结果是6,从后往前找,获取'a'首次出现位置的下标(而下标却是从前往后递增的)

String str2 = "ababcdabcdef";
int index2 = str2.lastIndexOf('a', 5);
System.out.println(index2);//输出结果是2,从下标为5的位置开始从后往前找,获取'a'首次出现位置的下标,下标为5的是'd',从'd'开始从后往前找,找到'a'的下标为2

还有lastIndexOf(“ab”)和lastIndexOf(“ab”,5),即把字符改为字符串

1.6字符串转换

String s1 =String.valueOf(1234);//将整型数据1234转换为字符串

String s1 =String.valueOf(12.34);//将浮点型数据12.34转换为字符串

String s1 =String.valueOf(true);//将布尔型数据转换为字符串

int data1=Integer.parseInt("1234");//将字符串"1234"转换为整型数值1234

double data2=Double.parseDouble("12.34");//将字符串"12.34"转换为浮点型数值12.34

String str1="heLLo";
String ret1=str1.toUpperCase();
System.out.println(ret1);//输出HELLO,将字符串全部内容转换为大写
String ret2=str1.toLowerCase();
System.out.println(ret2);//输出hello,将字符串全部内容转换为小写

String str="hello";
char[] array=str.toCharArray();//将字符串转换为数组
for(int i=0; i < array.length; i++){
System.out.print(array[i]+" ");//输出h e l l o
}

String s=String.format("%d-%d-%d", 2019914);
System.out.println(s);//输出2019-9-14,将数值格式化地转换为字符串

在Java中字符串是不可变的,如"heLLo"转换为"hello"这个转换不是在原来的字符串上面进行转换,而是生成了一个新的对象

1.7字符串替换

String str="ababababcd";
String ret=str.replace("ab", "oo");//将字符串中的ab全部替换为oo,将字符串中的某个字符串全部替换为另外一个字符串,这个替换也不是在原来字符串上替换,而是生成了一个新的对象

String ret=str.replace('a', 'z');//将字符串中的a全部替换为z,将字符串中的某个字符全部替换为另外一个字符

replace有replace(char oldChar,char newChar)和replace(CharSequence target,CharSequence replacement),String类实现了CharSequence接口,所以可以传字符串作为replace的参数(即向上转型)

String ret=str.replaceFirst("ab", "kk");//从头到尾查找遇到第一个ab就替换为kk

String ret=str.replaceall("ab", "kk");//将所有的ab都替换为kk

1.8字符串分割

String str="hello word hello";
String[] string=str.split(" ");//以空格字符为分隔符将字符串分割,因为字符串里有两个空格,所以分成了三段,分割后要用字符串类型的数组进行接收
for(int i=0; i < string.length; i++){
System.out.println(string[i]);
}

打印结果:
在这里插入图片描述

String str = "hello word hello";
        String[] string = str.split(" ",2);//以空格字符为分隔符将字符串分割为两段
        for(int i = 0; i < string.length; i++){
            System.out.println(string[i]);
        }

打印结果为:
在这里插入图片描述
以I、*、.、+作为分隔符分割字符串时,I、*、.、+前面都要加上转义字符\\,如:

String[] string=str.split("\\.");
String str="hello\\word\\hello";//输出结果是hello\word\hello
String[] string=str.split("\\\\");//可以认为两个\\是一个\,\\\\就表示\\

分割后打印结果为:
在这里插入图片描述

String str = "name=hello&10";
String[] string=str.split("&|=");//以两个分隔符分割,分割为三段

1.9字符串截取

String s = "abcdef";
String ret = s.substring(1);//从1下标开始截取字符串
System.out.println(ret);//输出结果为bcdef。如果从0下标开始截取,那么输出原字符串,如果从其它下标开始截取,那么输出的字符串是一个新创建的对象

String ret = s.substring(1, 4);//截取1到4下标的内容,因为Java左闭右开二百[1,4),所以截取到的是bcd
String s=" abc def ";
String ret=s.trim();//去除字符串两边的空格

在Java中字符串是不可变的,如"heLLo"转换为"hello"这个转换不是在原来的字符串上面进行转换,而是生成了一个新的对象。原因在于在String类中,private final char value[]有private修饰(只能在String类当中使用),final说明的是value的指向不能改变,但不能代表value指向的内容不能发生改变

final int[] array = {123};
array[0] = 10;//不会报错
array = new int[3];//会报错

1.10StringBuffer和StringBuilder

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    String s = "";
    for(int i = 0; i < 10000; i++){
        s += i;
    }
    long end = System.currentTimeMillis();
    System.out.println(end - start);

    start = System.currentTimeMillis();
    StringBuffer s1 = new StringBuffer("");
    for(int i = 0; i < 10000; i++){
        s1.append(i);
    }
    end = System.currentTimeMillis();
    System.out.println(end - start);
    start = System.currentTimeMillis();

    StringBuilder s2 = new StringBuilder();
    for(int i = 0; i < 10000; i++){
        s2.append(i);
    }
    end = System.currentTimeMillis();
    System.out.println(end - start);
}

打印结果是:
在这里插入图片描述
因为String类型的内容不能被修改,所以在这里用+=修改String类型的字符串每次在后面追加修改都要创建新对象,会耗费时间和资源,相比之下修改StringBuffer和StringBuilder类型的字符串不会创建新对象,效率高,StringBuilder效率最高
StringBuffer和StringBuilder之间的方法很多是类似的,下面展示的是StringBuilder的一些方法:

class Test3 {
    public static void main(String[] args) {
        StringBuilder stringBuilder = new StringBuilder("abcd");//String变为StringBuilder,利用StringBuilder的构造方法或append方法
        stringBuilder.append(1);
        stringBuilder.append("abc").append(10.0);//在原对象后面追加字符串
        System.out.println(stringBuilder);

        stringBuilder.setCharAt(0, 'z');//将0下标位置的字符改为z
        System.out.println(stringBuilder);

        stringBuilder.insert(1, "AAAAAAAA");//在1下标位置插入字符串AAAAAAAA
        System.out.println(stringBuilder);

        stringBuilder.reverse();//没有创建新对象,在原对象上翻转字符串
        System.out.println(stringBuilder);

        String str = stringBuilder.toString();
        System.out.println(str);//StringBuilder变为String;调用toString方法
    }
}

输出结果为:
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值