String类

String类型

目录:

1.常用方法

在java中,字符串是一种引用类型,String类中有着很多方法方便我们使用,其功能适用于各种场景,下面我们就介绍一下这些常用方法。

1.1构造方法

大家可以进入官方的帮助手册搜一下String类,我们可以看到String类在java.lang包里是默认导入的,以及它是被final所修饰的。

在这里插入图片描述

字符串构造方法有很多种,常用的构造方法有三种

  1. String s1 = "hello";//简写
    
  2. String s1 = new String("hello");
    
  3. char[] ch = new char[]{'a','b','c'};
    String s1 = new String(ch);
    

第一种方法用的最多,最简单。

下面我们来分析这几种构造方法的内存分布

在这里插入图片描述

1.2字符串的查找(indexOf)

方法用法
string.charAt(index)用来通过下标直接拿到字符串中的某个字符
string.indexOf(char ch)用来查找字符串中第一次出现字符ch的位置
string.lastindexOf(char ch)从后往前查找字符ch第一次出现的位置
string.indexOf(string ch)lastindexof也可以用来查找字符串ch第一次出现的位置
string.indexOf(char ch ,int fromindex)last也可以前面不变,fromindex表示从此位置开始找
    public static void main5(String[] args) {
        String s1 = "ababacabcdaseasq";
        String s2 ="www.baidu.com";
        System.out.println(s2.lastIndexOf('.',4));
        System.out.println(s2.lastIndexOf('.'));
        System.out.println(s1.lastIndexOf('ab'));
    }
    public static void main4(String[] args) {
        String s1 = "hello";
        for (int i = 0; i < s1.length(); i++) {
            System.out.println(s1.charAt(i));
        }
        System.out.println("====================");
        System.out.println(s1.indexOf('h'));//查找第一次出现的字符
        System.out.println(s1.indexOf('l',3));
        System.out.println("====================");
        String s2 = "abaabcabcdabsaea";
        System.out.println(s2.indexOf("abcd"));
    }

1.3字符串的比较(equals,compareTo)

一般我们进行比较是否相等时都用==来表示,对于基本类型来说 == 比较的是内容是否相同,但是对于引用类型 == 比较的就是是否引用的同一个对象,这就无法达到我们的要比较内容的要求。

对于引用类型我们使用equals进行比较,equals方法的返回值是boolean,java中还提供了忽略大小写的equalsIgnoreCase方法。

String s1 = "hello";
String s2 = "hello";
String s3 = "HELLO";
System.out.println(s1.equals(s2));//true
System.out.println(s1.equalsIgnoreCase(s3));//true

equals只能比较两个字符串是否相同,比较大小我们就需要使用compareTo方法了因为String实现了CompareTo接口,compareTo的返回值类型是int,同样java中也提供了忽略大小写的比较compareToIgnoreCase方法。

String s1 = "hello";
String s2 = "hello";
String s3 = "HELLO";
System.out.println(s1.compareTo(s2));//0
System.out.println(s1.compareToIgnoreCase(s3));//0

1.4转换

  1. 大小写转换
方法功能
toUpperCase()将字符串所有的小写改为大写(字母)
toLowerCase()将字符串所有的大写改为小写(字母)
        String s1 = "hello";
        String s2 = "HELLO";
        System.out.println(s1.toUpperCase());//HELLO
        System.out.println(s2.toLowerCase());//hello
        System.out.println(s1);//hello
        System.out.println(s2);//HELLO

中文不管

  1. 字符串转数组(toCharArray)
String s1 = "hello";
char[] ch = s1.toCharArray();
for (char x : ch) {
    System.out.println(x);
}
  1. 数值转换字符串(valueOf)
方法功能
string.valueOf(基本类型 i)将基本类型i转换为string类型
基本类型.valueOf(String s)将string类型转换为基本类型
基本类型.parse***(String s)(一般用这种转换)将string类型转换为基本类型
基本类型.valueOf(String s radix x) radix表示x进制(parse***也有)将String类型的值按x进制转换为十进制
        String s1 = String.valueOf(123);
        String s2 = String.valueOf(12.5);
        System.out.println(s1);
        System.out.println(s2);

        String s3 = String.valueOf(new Student(12));//也可以是一个对象
        System.out.println(s3);

        int a = Integer.valueOf("0101",2);//5
        System.out.println(a);
        int b = Integer.parseInt("1000");//1000
        System.out.println(b);

1.5字符串的替换(replace)

方法功能
String replaceAll(String regex, String replacement)替换所有的指定内容
String replaceFirst(String regex, String replacement)替换首个内容
        String s1 = "ababcabcdeaaweqggh";
        System.out.println(s1);
        System.out.println(s1.replace('a', 'k'));//kbkbckbcdekkweqggh
        System.out.println(s1.replace("ab", "wt"));//wtwtcwtcdeaaweqggh
        System.out.println(s1.replaceAll("ab","zc"));//zczcczccdeaaweqggh
        System.out.println(s1.replaceFirst("ab","1122"));//1122abcabcdeaaweqggh

1.6字符串拆分(split)

将字符串按指定的分隔符划分为几个字符串

方法功能
String[] split(String regex)将字符串全部拆分
String[] split(String regex, int limit)将字符串以指定的格式,拆分为limit组
        String s1 = "ni hao ma zui jin";
        String[] s2 = s1.split(" ",3);
        for (String x : s2) {
            System.out.println(x);
            //ni
            //hao
            //ma zui jin
        }

对于指定的特殊分隔符要进行转义如:,.

        String s1 = "255\\255\\255\\255";
        //特殊的字符要进行转义
        String[] s2 = s1.split("\\\\");//因为字符串那里也需要转义,所以有两次转义
        for (String x : s2) {
            System.out.println(x);
        }
        String s1 = "255.255.255.255";
        //特殊的字符要进行转义
        String[] s2 = s1.split("\\.");
        for (String x : s2) {
            System.out.println(x);
        }

还可以给定多个分隔符进行多次拆分

        String s1 = "zaiganma nihao&=nibuhao";
        String[] s2 = s1.split(" |&");
		for(Stiring x : s2){
                System.out.println(x);
        }
        //多次拆分
		s2 = s1.split(" ");
        for (String x : s2) {
            String[] s3 = x.split("=");
            for (String x1 : s3) {
                System.out.println(x1);
            }
        }

1.7字符串截取(substring)

这个没什么好说的简单

        String s1 = "liuyuhao";
        System.out.println(s1.substring(3));
        System.out.println(s1.substring(2, 5));//[2,5)左闭右开

1.8其他操作

trim()删除字符串左右两边的空格,制表,换行等

        String s1 = "     liu yu     ";
        System.out.println(s1);
        System.out.println(s1.trim());

intern()手动入池,内容下面常量池中讲

        char[] ch = {'a','b','c'};
        String s1 = new String(ch);
        s1.intern();//手动入池
        String s2 = "abc";
        System.out.println(s1 == s2);

String类的方法,如果返回基本上都是新的String对象。因为String里的内容创建后就不可以修改了,String是一种不可改变的对象,所以尽量避免对字符串的直接修改

        String s1 = "hello";
        s1 += " word";
        System.out.println(s1);

        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("hello");
        stringBuilder.append(" word");

因为它的底层其实是借助了StringBuilder类,中间会创建很多临时变量,所以对于字符串修改我们直接使用StringBuilder和StringBuffer。String的内容不能被改变的原因是String类里的字段value被final修饰,表明value不能引用其它字符数组,但是可以修改引用数组的内容。

1.9String常量池

字符串常量池又名StringTable其实是一种高效的查询数据结构。
在这里插入图片描述
inter()手动入池
在这里插入图片描述

2.StringBuilder和StringBuffer

注意String,StringBuffer,StringBuilder三者的区别

  1. String的内容是不可以被修改的,StringBuffer和StringBuilder的内容是可以被修改的
  2. StringBuffer和StringBuilder两者的方法都大致相同
  3. StringBuffer采用同步处理,多线程时很安全,StringBuilder未采用通不处理,多线程时不安全。

这里重点提几个String没有的方法,StringBuffer的方法也一样

        StringBuilder stringBuilder = new StringBuilder();
        String s1 = "hello";
        stringBuilder.append(s1);//将字符串转为StringBuilder
        stringBuilder.insert(0,"lyh ");//在0下标位置开始插入,lyh
        stringBuilder.insert(1,1);//在1下标位置插入,1
        stringBuilder.deleteCharAt(1);//删除1下标位置的1
        stringBuilder.setCharAt(0,'z');//将0下标位置的字符改为z
        stringBuilder.codePointAt(1);//返回1下标字符的ASCII码值
        stringBuilder.reverse();//字符串逆转
        String str = stringBuilder.toString();//StringBuilder转String
        stringBuilder.append("how are you");//String转StringBuilder
        int num = stringBuilder.capacity();
        System.out.println(num);//获取底层保存字符串空间的总大小
        System.out.println(stringBuilder);

补充:

  1. 字符串的格式输出
        String s1 = String.format("%d-%d-%d",2002,06,24);
        System.out.println(s1);
  1. 求字符串长度和数组不一样,字符串求长度调用的是一个方法,数组调用的是一个字段
        String s1 = "hello";
        System.out.println(s1.length());
        
        int[] array = {1,2,3,4};
        System.out.println(array.length);
  1. 关于字符串匹配的三种算法,BF,BM,KMP,这里简单给大家介绍一下,BF算法就是简单的暴力匹配两层循环搞定,BM算法就引用了一个好数对和坏数对的思想对子串进行处理,KMP算法引用了一个next数组对子串进行处理还有next数组的优化,nextval数组,具体相关内容大家可以去学习一下。

本节学习结果

  1. 了解了String类
  2. 熟练掌握了String类中的各种方法
  3. 理解了String常量池
  4. 认识了StringBuilder和StringBuffer也掌握了他们的各种方法
  5. 掌握String,StringBuffer和StringBuilder的区别
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值