总结String类

String 类的定义方式

// 方式一 
String str1 = "hhh";
// 方式二 
String str2 = new String("hhh");
// 方式三 
char[] array = {'a', 'b', 'c'}; 
String str3 = new String(array)

在内存中的存储方式(在jdk1.7之后常量池放在了堆中):
在这里插入图片描述
由于 String 是引用类型, 所以对于下面的代码,str1和str2指向的都是常量池中的"hhh".

String str1 = "hhh"; 
String str2 = str1; 
str1 = ""hahaha";//此操作是将str1的引用重新指向"hahaha",不会改变str2。

字符串比较相等
那么字符串如何比较相等呢,先来看几段代码:

public static void main(String[] args) {
    String str1 = "hhh";
    String str2 = "hhh";
    System.out.println(str1 == str2);//true
    
    String str3 = new String("hhh");
    System.out.println(str1 == str3);//false
	
	System.out.println(str1.equals(str2));//true
	System.out.println(str1.equals(str3));//true

}

运行结果分别为ture,false.
在这里插入图片描述
"=="比较地址
str1和str2在内存中的存储方式如上图,因为它们同时指向同一个对象,即结果为true。
str1和str3在内存中的存储方式如第一张图(字符串定义处的图),str3保存的是new String的地址,而str1保存的是"hhh"的地址,所以结果为false。

"equal"比较内容
str1,str2,str3中存放的都是"hhh",所以结果都为true。

再来放一段代码感受一下:

public static void main(String[] args) {
    String str1 = "abcdef";
    String str2 = new String("abcdef");
    System.out.println(str1 == str2);//false

    String str3 = new String("abcdef");
    System.out.println(str2 == str3);//false

    String str4 = "ab"+"cdef";//字符串在编译期间已经被处理为两个字符串拼接的结果。
    System.out.println(str1 == str4);//true

    String str5 = "ab" + new String("cdef");
    System.out.println(str1 == str5);//false
    System.out.println(str1.equals(str5));//true

    String str6 = "ab";
    String str7 = "cdef";
    String str8 = str6+str7;
    System.out.println(str1 == str8);// false
    System.out.println(str1.equals(str8));//true

    String str9 = str6+"cdef";
    System.out.println(str1 == str9);//false

    String str10 = "hello" + 10;//"hello10"
    String str11 = "hello10";
    System.out.println(str10 == str11);//true
}

从内存上分析使用String str2 = new String(“hhh”),需要引用两次,即需要开辟两块内存,而使用intern()方法手动入池,只需要开辟一块内存,在内存中的存储方式如下图:

在这里插入图片描述

String str1 = new String("hello").intern() ;  
String str2 = "hello" ;  
System.out.println(str1 == str2); //true

字符串查找

序号方法描述
1public boolean contains(CharSequence s)判断一个字符串是否存在
2public int indexOf(String str)从开始位置查找字符串,找到返回下标位置,找不到返回-1
3public int indexOf(String str, int fromIndex)从指定位置开始查找字符串,找到返回下标位置,找不到返回-1
4public int lastIndexOf(String str)从后往前查找字符串,找到返回下标位置,找不到返回-1
5public int lastIndexOf(String str, int fromIndex)从指定位置往前查找字符串,找到返回下标位置,找不到返回-1
6public boolean startsWith(String prefix)判断是否以字符串开头
7public boolean startsWith(String prefix, int toffset)判断指定位置是不是以字符串开头
8public boolean endsWith(String suffix)判断是否以指定字符串结尾

使用方式如下代码:

public static void main(String[] args) {
    String str1 = "hello,world";
    
    System.out.println(str1.contains("w"));//true contains底层调用indexOf方法。

    int tmp = str1.indexOf("s");//找不到返回-1
    int ret = str1.indexOf("w",2);//从2号下标开始查找
    System.out.println(tmp);//-1
    System.out.println(ret);//6

    int tmp1 = str1.lastIndexOf("w");
    int ret1 = str1.lastIndexOf("w",5);
    System.out.println(tmp1);//6  从后往前查找
    System.out.println(ret1);//-1 从指定位置往前查找

    boolean ret3 = str1.startsWith("w");
    boolean ret4 = str1.startsWith("w",6);
    System.out.println(ret3);//false,判断字符串是否以“w”开头。
    System.out.println(ret4);//true,判断字符串从指定位置是不是以“w”开头。
        
    System.out.println(str1.endsWith("o"));//false,判断字符串是否以“o”结尾。
}

字符串替换

序号方法描述
1public String replace(CharSequence target, CharSequence replacement)用指定字符替换原字符串中的所有字符
2public String replaceAll(String regex, String replacement)用指定字符串替换原字符串中的所有字符
3public String replaceFirst(String regex, String replacement)用指定字符串替换原字符串中第一个出现字符

使用方法如下:

public static void main(String[] args){
    String str1 = "hello,world";
    String ret = str1.replace("l","y");//用“y”替换字符串中的所有“l”
    System.out.println(ret);//heyyo,woryd

    String ret1 = str1.replaceAll("o","sy");//替换所有内容 
    System.out.println(ret1);//hellsy,wsyrld

    String ret2 = str1.replaceFirst("l","s");//用“s”替换第一个出现的“l”
    System.out.println(ret2);//heslo,world
}

字符串拆分

序列方法描述
1public String[] split(String regex)将字符串全部拆分
2public String[] split(String regex, int limit)将字符串部分拆分,最大拆分为limit

使用方法:

public static void main(String[] args){
        String str1 = "hello,wor,ld";
        String[] ret = str1.split(",");
        for(String s: ret) {
            System.out.println(s);
        }

        String[] ret1 = str1.split(",",2);
        for(String s: ret1) {
            System.out.println(s);
        }
    }

字符串截取

方法名称描述
public String substring(int beginIndex)从指定位置截取到结尾
public String substring(int beginIndex, int endIndex)从指定区间进行截取

使用方法:

public static void main(String[] args){
        String str1 = "hello,world";
        String ret = str1.substring(4);
        System.out.println(ret);//o,world

        String ret1 = str1.substring(2,6);//截取区间[2,6)
        System.out.println(ret1);//llo,
    }

其他用法:

 public static void main(String[] args){
        String str1 = "  hello world  ";
        String ret = str1.trim();//去掉字符串左右空格,保留中间空格
        System.out.println(ret);

        String ret1 = ret.toUpperCase();//将字符串全部转为大写
        System.out.println(ret1);

        String ret2 = ret1.toLowerCase();//将字符串全部转为小写
        System.out.println(ret2);

        String str = ret1.concat(str1);//将字符串拼接(将str1拼接到ret1后面)
        System.out.println(str);// HELLO WORLD  hello world 
        
        String s = "";
        boolean tmp = s.isEmpty();//判断字符串是否为空,但是不是null。
        System.out.println(tmp);//true
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值