Java基础(九)API之String类中的一些重要方法及应用(使用频率极高!)

本文深入解析 Java 中 String 类的概念、特点及其实现原理,包括字符串常量存储、String、StringBuilder 与 StringBuffer 的区别,以及 String 类的重要方法如 charAt、length、toCharArray 等的使用方法。

String类

1.概念

最终类
Java中所有的字符串常量都是String类的对象
String类底层是根据不可改变的字符数组来实现数据存储,String类对象的内容就无法改变(常量)
Java中所有的常量存储在方法区的运行时常量池
当常量池中已经存在引用,如果后续有同名的引用那么共享同一个引用

package cn.tedu.string;

public class StringDemo1 {
    public static void main(String[] args) {
       //字符串常量存储在方法区的运行时常量池中
        //s1指向方法区常量池
        String s1="ab";
        //s2指向堆内存
        String s2=new String("ab");
        //当常量池中已经存在引用,如果后续有同名的引用,那么共享同一个引用
        //s3指向s1指向的内存
        String s3="ab";
        //byte b=128-1;
        //当参与运算的都是常量那么在编译时期就会进行优化直接计算结果再进行赋值
        //String s4="ab";,s4和s1指向同一个常量池
        String s4="a"+"b";
        //s5=s5+"b";
        //有String类不能直接做拼接
        //所以底层是由  s5=new StringBuilder("a").append("b").toString();
        //toString方法底层是new一个新的String类对象返回
        //s5指向堆内存
        String s5="a";
        s5 +="b";

        //s1指向方法区,s2指向堆内存,地址值不一样
        System.out.println(s1==s2);//false
        //s1和s3指向同一个常量池,地址值一样
        System.out.println(s1==s3);//true
        //s1和s4指向同一个常量池,地址值一样
        System.out.println(s1==s4);//true
        //s1指向方法区,s5指向堆内存,地址值不一样
        System.out.println(s1==s5);//false
        System.out.println(s2==s5);//false
    }
}

2.StringBuilder与StringBuffer

从jdk1.0开始String类做拼接使用的是StringBuffer,安全可靠但是拼接效率低
从jdk1.5开始String类做拼接使用的是StringBuilder,不安全但是拼接效率高

*3.重要方法

1.charAt():根据指定下标值返回字符串对象对应的字符

2.length():返回字符串对象的长度值

        String str="wertrfe";
        //指定String类对象的下标来返回对应字符
        System.out.println(str.charAt(2));//可以获取字符串对象中任意一个字符

        //遍历字符串对象的内容
        //length()方法--返回字符串对象的长度值
        //length属性--返回数组长度值
        for (int i=0;i<str.length();i++){
            System.out.println(str.charAt(i));
        }

3.toCharArray():把字符串内容转成字符数组

4.new String(char[] cs,int count,int offset):指定字符数组内容转成新的字符串对象


        String str="wertrfe";
        //把String类对象的内容转成字符数组
        char[] cs=str.toCharArray();

        //把字符数组的内容转成新的字符串对象
        //String s=new String(cs);

        //把字符数组指定内容转成新的字符串对象
        String s=new String(cs,1,3);//ert
        System.out.println(s);


5.compareTo():根据字典比较来确定两个字符串对象的大小

String str1="cat";
String str2="pig";

//把两个字符串对象内容转到两个字符数组
//根据对应位置的两个字符数组的字符求差值
//如果差值不为0就当做返回值来返回,如果差值为0挪到下一位继续求差值
//如果每个差值都为0,最后就以两个字符串对象的长度之差当做返回值来返回
//如果方法返回值为正数,说明前面的对象大于后面的对象
//如果方法返回值为负数,说明前面的对象小于后面的对象
//如果方法返回值为0,说明前面的对象和后面的对象的内容一致
//根据字典来比较确定对象的大小关系
System.out.println(str1.compareTo(str2));//-13

6.compareToIgnoreCase():忽略大小来进行字典比较

7.concat():底层是根据数组扩容来进行拼接字符串,把指定字符串内容拼接到原串的末尾

String str="abc";
//把指定字符串内容拼接到原串的末尾
//底层是根据数组扩容来进行拼接
//+和concat拼接的区别?1.底层实现不同 2.+可以拼接任意数据,但是concat只能拼接字符串
System.out.println(str.concat("123"));//abc123

8.contains():判断指定内容是否是原串的子串

String str="sdgvdss";
//原串中连续区域---子串
//判断指定内容是否是原串的子串
System.out.println(str.contains("gvds"));//true

9.endswith():判断是否以子串来结尾
startswith():判断是否以子串来开头

String str="abdvgd";
//判断是否以子串来结尾
//文件后缀 .doc  .txt  .zip
System.out.println(str.endsWith("vgd"));//true
//判断是否以子串来开头
//火车  (G-高铁)、D(动车)、T(特快)、Z(直达)
//车牌   (渝---重庆)、(川---四川)、(鲁---山东)
//身份证号 (前六位---户籍所在地)
System.out.println(str.startsWith("fhg"));//false

10.equals():根据字符串对象的地址值和内容来综合判断对象是否相等

equalsIgnoreCase():忽略大小写进行比较

String str1="abc";
       String str2=new String("abc");

        //instanceof---判断对象和类之间的关系
        //instanceof,左边是对象,右边是子类、本类、父类
        //对Object类里的equals方法进行重写
        //重写之后根据对象的地址值以及对象的内容来综合判断
        System.out.println(str1.equals(str2));//true
        //忽略大小写来比较---验证码
        System.out.println(str1.equalsIgnoreCase(str2));//true

11.getBytes():把字符串对象内容转成字节数组进行返回

12.new String(byte[] bs,int offset, int length,charset charsetName):把字节数组部分内容转成新的字符串对象来进行返回

packagecn.tedu.string;

 

import java.io.Unsupported Encoding Exception;

 

public class StringDemo3{

public static void main(String[]args)throws Unsupported Encoding Exception{

//

Stringstr="时间管理者";


//把字符串对象内容转成字节数组

//给定码表来进行编码

//把字符转成字节---编码

byte[]bs=str.getBytes("gbk");


//把字节数组内容转成新的字符串对象

//把字节转成字符---解码

//编码和解码使用的码表不一致导致乱码

//String s=new String(bs,"gbk");

//把字节数组内容部分转换成新的字符串对象

String s=new String(bs,0,5,"gbk");

//

System.out.println(s);

}

}

13.hashcode():重写Object类里的hashcode方法,计算过程只和对象的内容有关系

String str1="abc";

String str2=new String("abc");

//重写hashcode方法计算过程只和对象的内容有关系

System.out.println(str1.hashCode());

System.out.println(str2.hashCode());

14.indexOf():返回子串第一次出现的下标值

String str="dsvbfefdsv";

 

//返回子串第一次出现的下标值

//如果没有找到返回-1

System.out.println(str.indexOf("sv"));

//指定起始(包含)下标来返回第一次出现下标值

System.out.println(str.indexOf("sv",2))

15.intern():把引用转向指向到方法区

String str1="abc";

String str2=new String("abc");

//把指向堆的引用转向到指向方法区

str2=str2.intern();

//

System.out.println(str1==str2);

16.isEmpty():判断字符串对象是否为空串

String str="";//空串

String str1=new String("");//空串

Stringstr2=new String();//空串

//空不是null,null不是空

//空代表底层有内存空间但是没有给值

//null代表不指向任何内存区域

String str3=null;

//判断字符串对象是否为空串

System.out.println(str3.isEmpty());

17.matches():根据填入的正则语法功能来匹配对应信息

package cn.tedu.pattern;

 

public class PatternDemo1{

public static void main(String[] args){

//

Stringstr="7";


//匹配内容只有abc的字符串对象

//System.out.println(str.equals("abc"));

//给定指定内容,根据指定内容进行匹配

//System.out.println(str.matches("abc"));



//匹配一个数字的字符串

//[起始-结束]匹配到起始和结束范围内的任意一个值

//System.out.println(str.matches("[0-9]"));

//\\d--字符串转义--\d--正则转义--[0-9]

System.out.println(str.matches("\\d"));

//.代表任意字符

//*是数量词表示前面的符号可以出现多次,一次,不出现

//System.out.println(str.matches(".*"));

 

}

}

18.replaceAll():根据填入正则语法来匹配把匹配到的信息进行替换

package cn.tedu.pattern;

 

import java.util.Arrays;

 

public class PatternDemo2{

public static void main(String[]args){

//

String str="sdhf7rg3d546w6sgf";


//根据正则匹配到信息替换成对应的信息

//System.out.println(str.replaceAll("\\d","*"));



//对字符串里的数字进行排序

//把字符串中的所有非数字字符替换成空串

str=str.replaceAll("\\D","");

//把字符串对象转成字符数组

char[] cs=str.toCharArray();

//对数组排序

Arrays.sort(cs);

//输出数组

System.out.println(Arrays.toString(cs));

}

}

19.split():根据填入的正则语法来匹配信息,把匹配到的信息当做成切割符

把字符串切割成字符串数组进行返回

package cn.tedu.pattern;

 

import java.util.Arrays;

 

public class PatternDemo3{

public static void main(String[] args){



String str="18dwsv97bvdws4v6sdf5xb00";

//根据正则匹配到的信息进行切分

//匹配到的信息都作为切割符来切分字符串

//当切割符出现在最前面会切成空串

//当切割符出现在末尾会被一并切割掉

//当多个切割符出现在最开始与中间时有几个

//就切割出几个区域,当同时出现在末尾时

//直接切掉

String[] ss=str.split("\\d");

//遍历数组

System.out.println(Arrays.toString(ss));

for(Strings:ss){

System.out.println(s);

}

}

}
 

20.replace():把指定内容替换成新的内容

String str="edwedfesjhder";

//把指定的内容替换成新的内容

System.out.println(str.replace("e","+"));

21.toUpperCase()/toLowerCase():转大小写

22.toString():保证输出字符串对象的是内容

23.subString():根据指定下标截取子串

//

String str="edsgfed";

//根据指定的下标截取子串

//System.out.println(str.substring(4));

//左包右不包

System.out.println(str.substring(1,3));

//默认调用String类重写的toString方法输出

//对象内容

System.out.println(str);

24.trim():删除前面和末尾的空格

//

String str="ed\tfv";

 

System.out.println(str+"a");

//把前面和末尾的空格删除---掐头去尾

System.out.println(str.trim()+"a");

25.valueOf():支持所有的数据类型的数据转成字符串形式

package cn.tedu.string;

 

public class StringDemo7{

public static void main(String[] args){

//把基本类型的数据转成字符串形式

//String str=String.valueOf(123);

//把引用类型的数据转成字符串形式

//支持把所有的数据类型的数据转成字符串形式

//String str1=String.valueOf(newObject());

//System.out.println(str1);



//

int[] arr={1,2,3};

//[I@28d93b30整型数组地址值

//把整型数组传入到String类的valueOf方法

//默认调用Object类里的toString方法来拼接地址值

System.out.println(arr);

//

char[] cs={'3','a','j'};

//3aj字符数组元素内容

//底层没有把字符数组传入到String类的valueOf方法

//没有调用到Object类里toString方法

//System.out.println(cs);

//调用Object类里toString方法

System.out.println(cs.toString());

}

}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张艳霞zhangyx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值