String----最终类---charAt()方法---length()方法---toCharArray()方法

本文详细介绍了Java中的String类,它是一个最终类,其对象不可变,存储在方法区的运行时常量池。文章讨论了StringBuilder和StringBuffer的区别,并着重讲解了String类的重要方法,包括charAt()用于获取指定位置字符,length()返回字符串长度,toCharArray()转换为字符数组。此外,还提及了compareTo()、contains()、startsWith()、endsWith()、equals()和equalsIgnoreCase()等其他常用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String

最终类

java中所有的字符串常量都是String类的对象

String类底层是根据不可改变字符数组来实现数据存储,String类对象的内容无法改变(常量)

Java中所有的常量存储方式在方法区的运行时常量池

当常量池中已经存在引用,如果后续有同名的引用那么共享同一个引用(共享)

在这里插入图片描述
在这里插入图片描述

StringBuilder与StringBuffer

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

package cn.r.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";
        String s5="a";
        //s5=s5+="b";
        //有String类不能直接拼接
        //所以底层是由     s5=new StringBuilder("a").append("b").toString();
        //toString方法底部是new一个新的String类对象返回
        //s5指向堆内存
        s5+="b";

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


    }
}

运行结果:

在这里插入图片描述
重要方法

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

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

3.toCharArray():把字符串对象的内存转换成字符数组

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

package cn.r.string;

public class StringDemo2 {
    public static void main(String[] args) {
        //
        String str="huttfgftgsdf";
        //指代String类对象的下标来返回对应的字符
        /*System.out.println(str.charAt(2));//可以获取字符串对象中任意一个字符

        //遍历字符串对象的内容
        //length()---返回字符串对象的长度值
        //length属性---返回数组长度值
        for(int i=0;i<str.length();i++){
            System.out.println(str.charAt(i));
        }*/
        //把String类对象的内容转换成字符数组
        char [] cs=str.toCharArray();
        //把字符数组内容转换成字符串对象
        //String s=new String(cs);
        String s=new String(cs,1,3);

        System.out.println(s);
    }
}

运行结果:

在这里插入图片描述
5.compareTo():根据字典比较来确定两个字符串对象的大小

6.compareToIgnoreCase():按字典顺序比较两个字符串,忽略大小写

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

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

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

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

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

9.startsWith/endsWith:判断是否以子串开头/结尾

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

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

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

package cn.r.string;
 
public class StringDemo5{
public static void main(String[]args){
//
String str1="abc";
String str2=new String("Abc");
//instanceof---判断对象和类之间的关系
//instanceof,左边是对象,右边是子类、本类、父类
//对Object类里equals方法进行重写
//重写之后根据对象的地址值以及对象的内容来综合判断
System.out.println(str1.equals(str2));
//忽略大小写进行比较---验证码
System.out.println(str1.equalsIgnoreCase(str2));
}
}

12.getBytes():把字符串对象内容转成字节数组

13.new String(byte[] bs,int offset,int length,CharSet charset):可以把字节数组部分内容按照指定码表转成新的字符串对象

package cn.r.string;
 
import java.io.UnsupportedEncodingException;
 
public class StringDemo6{
public static void main(String[]args)throws UnsupportedEncodingException{
//
String str="订外卖";
 
//把字符串对象内容转成字节数组
//把字符串对象(字符形式)按照码表转成字节---编码
byte[] bs=str.getBytes("gbk");
//把字节数组转成新的字符串对象
//根据指定码表把字节形式数据转成字符形式数据---解码
//由于编码和解码使用的码表不一致产生乱码
//Strings=newString(bs,"gbk");
//把字节数组的部分内容转成新的字符串对象
String s=new String(bs,0,4,"gbk");
//
System.out.println(s);
}
}

14.hashcode():计算哈希码值过程只和对象内容有关系

String str1="abc";
String str2=new String("abc");
 
//重写Object类里hashcode方法
//哈希码值的计算过程只和对象的内容有关系
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());

15.indexOf():根据指定内容返回在对象内容中的第一次出现下标值

String str="adsfbdsf";
//返回指定内容第一次出现下标值
//如果没有查找到返回-1
System.out.println(str.indexOf("df"));
//根据指定的起始下标(包含)来进行查找返回第一次出现的下标值
System.out.println(str.indexOf("dsf",5));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值