Java中String类的使用

1.String类:即字符串类,其主要构造方法为:

 String(String Original),把字符串封装成字符串对象;

   

 举例:String s1 = new String(“hello”);

 String(char[] value),把字符数组的数据封装成字符串对象;

 举例:char[] chs = {‘h’,‘e’,‘l’,‘l’,‘o’};  

 

String s2 = new String(chs);

 String(char[] value,int index, int count),从索引index开始把count个字符数组值封装成字符串对象。

举例:char[] chs = {‘h’,‘e’,‘l’,‘l’,‘o’}; 
String s3 = new String(chs,1,3);

 最为简单的一种方法是直接构造法:

 举例:String s4 = “hello”;

2.new创建与直接赋值:针对创建的String类的对象,通过构造方法创建的String对象,存放在java虚拟机的堆内存,堆内存里存放的是字符串常量的地址,字符串常量存放在方法区的常量池中;通过直接赋值所创建的对象直接是方法区中的常量池中的字符串常量。而语句(s1==s2)是比较s1和s2中存放的地址,显然不相同,但是s2和s3的地址相同,则会得到true结果。其示意图如下图所示:

 

字符串的不变性


1.String类中定义了常量字符数组,一旦赋值,这个字符数组的值不能被改变
2.字符串修改值的时候,不是修改的字符串的本身,而是更新修改字符串的地址引用
3,经常需要变化的字符串建议使用StringBuffer定义
Java有垃圾回收机制,自动释放内存的资源

代码示例:

/**
 * @author ZhangXiaoDie  2022/12/1  18:31
 * @version 1.0
 */
public class StringTest01 {
    public static void main(String[] args) {
        /*字符串的不变性
        1.String类中定义了常量字符数组,一旦赋值,这个字符数组的值不能被改变
        2.字符串修改值的时候,不是修改的字符串的本身,而是更新修改字符串的地址引用
        3,经常需要变化的字符串建议使用StringBuffer定义
        Java有垃圾回收机制,自动释放内存的资源
        * */
      String   str=new String("abc");
      String s1="luck";//在内存中查找是否存在luck这个字符串,不存在则创建一个luck字符串,然后把该字符串地址放入s1栈内存中
      String s2="luck";//在内存中查找是否存在luck这个字符串,存在则把该字符串地址放入s2栈内存中
        System.out.println(s1==s2);
        s1="jack";//不是修改s1地址映射的字符串的内容,重新在内存中查找字符串,存在就赋值,不存在就创建后赋地址
        StringBuffer sb1=new StringBuffer("zhangsan");
        sb1.append("xxx");
        System.out.println(sb1);
    }
}

String常用的方法:

int length():返回字符串的长度
char charAt(int index):返回指定索引处的字符
boolean isEmpty():判断字符串是否为空
String toLowerCase():将字符串中的所有字符转换为小写
String toUpperCase():将字符串中的所有字符转换为大写
String trim():返回字符串的副本,去掉前导空白和尾部空白,中间的空白不会被去掉
boolean equals(Object obj):比较字符串的内容是否相同
boolean equalsIgnoreCase(String anotherString):忽略大小写,比较字符串的内容是否相同
String concat(String str):将指定字符串连接到此字符串的结尾,等价于用“+”
int compareTo(String anotherString):比较两个字符串的大小
String substring(int beginIndex):返回从beginIndex到末尾的子字符串
String substring(int beginIndex, int endIndex):返回从beginIndex到endIndex前一位的子字符串,不包括endIndex

boolean endsWith(String suffix): 判断字符串是否以指定的后缀结束
boolean startsWith(String prefix):判断字符串是否以指定的前缀开始
boolean startsWith(String prefix, int toffset):判断字符串在指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s):判断当前字符串中是否包含指定的字符串

int indexOf(String str):返回指定子字符串在当前字符串中第一次出现处的索引
int indexOf(String str, int fromIndex):返回从指定的索引后,指定子字符串在当前字符串中第一次出现处的索引
int lastIndexOf(String str):返回指定子字符串在当前字符串中最后一次出现处的索引
int lastIndexOf(String str, int fromIndex):返回从指定的索引后,指定子字符串在当前字符串中最后一次出现处的索引
注:indexOf和lastIndexOf方法如果未查找到指定子字符串时,返回值都为-1。

String replace(char oldChar, char newChar):替换当前字符串中指定的子字符串
String[] split(String regex):根据指定的符号拆分当前字符串,然后返回一个String数组

 

个别使用方法代码的示例 如下:

/**
 * @author ZhangXiaoDie 2022/12/1  18:47
 * @version 1.0
 */
public class StringTest02 {
    public static void main(String[] args) {
        String s1="abc";//引用abc字符串的地址
        System.out.println("s1:"+s1);//abc


        String s2=new String();//创建一个空字符串
        System.out.println("s2:"+s2);


        String s3=new String("xyz");//引用堆中的xyz字符串地址
        System.out.println("s3:"+s3);//xyz


        byte[] bytes1={97,98,99,100,101,102};//byte的取值范围是:-128到127
        String s4=new String(bytes1);//把字节整数数组按照ASCII码表解析成字符串
        System.out.println("s4:"+s4);//abcdef

        byte[] bytes2={97,98,99,100,101,102};//byte的取值范围是:-128到127
        String s5=new String(bytes2,2,2);//对bytes2数组从索引2开始解析2个长度
        System.out.println("s5:"+s5);//cd


        char[] char1={'a','b','c','d','e','f'};
        String s6=new String (char1);
        System.out.println("s6:"+s6);


        char[] char2={'a','b','c','d','e','f'};
        String s7=new String (char2,2,2);
        System.out.println("s7:"+s7);
    }
}





/**
 * @author ZhangXiaoDie 2022/12/1  18:59
 * @version 1.0
 */
public class StringTest03 {
    public static void main(String[] args) {
        //方法调用:1,调用方法  对象.方法名();2,传入参数  3,接受方法的返回值
        String s1="abcdef";
        char ch1=s1.charAt(2);//获取字符串中指定索引位置的字母
        System.out.println(ch1);

        String s2=s1.concat("xyz");
        System.out.println(s2);

       boolean b1=s1.contains("x");
       boolean b2=s2.contains("x");
        System.out.println(b1);
        System.out.println(b2);


        String s3="zhangsan.jpg";
        boolean b3=s3.endsWith(".jpg");//常用来判断文件名的后缀
        System.out.println(b3);


        byte[] bytes1=s1.getBytes();//把字符串按照ASCII码表解析成byte数组  bytes1={97,98,99,100,101,102}

面试题:String、StringBuffer和StringBuilder的异同?

相同点:底层都是通过char数组实现的

不同点:

1,String对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空间来存储修改之后的对象;而StringBuffer和StringBuilder对象的值是可以被修改的;

2,StringBuffer几乎所有的方法都使用synchronized实现了同步,线程比较安全,在多线程系统中可以保证数据同步,但是效率比较低;而StringBuilder 没有实现同步,线程不安全,在多线程系统中不能使用 StringBuilder,但是效率比较高。

3,如果我们在实际开发过程中需要对字符串进行频繁的修改,不要使用String,否则会造成内存空间的浪费;当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用 StringBuilder。

 

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值