【JAVA】String类(比较/查找/替换/拆分/截取/转换等)

一、常见的构造 String 的方式
//方式一

String str = "Hello Bit";

//方式二

String str2 = new String("Hello Bit");

//方式三

char[] array = {'a', 'b', 'c'}; String str3 = new String(array)

二、字符串比较
① 比较地址

例1:

String str1 = "Hello"; 
String str2 = "Hello"; 
System.out.println(str1 == str2); 

//执行结果 true   

例2:

String str1 = new String("Hello"); 
String str2 = new String("Hello"); 
System.out.println(str1 == str2);

// 执行结果 false 

② 比较字符串内容
必须采用String类提供的equals方法

String str1 = new String("Hello"); 
String str2 = new String("Hello"); System.out.println(str1.equals(str2)); //System.out.println(str2.equals(str1)); 
// 或者这样写也行
// 执行结果 true

③比较大小

String str1 = "Hello"; 
String str2 = "joosd"; 
System.out.println(str1.compareTo(str2));

注意
常量在编译时就已经编译好了

  1. String str4=“abc”+“def”+360;
    编译时一个对象:编译时就已经是abcdef360
    “abc”+“def”:字符常量
    360:常量

  2. int a =360;
    String str4=“abc”+“def”+a;
    编译时2个对象:”abcdef”拼接好产生一个对象;此时a是一个变量,拼接时需要在产生一个对象;

面试题:请解释String类中两种对象实例化的区别
1.直接赋值:只会开辟一 块堆内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。

2.构造方法:会开辟两块堆内存空间,其中-块成为垃圾空间,不会自动保存在对象池中,可以使用intern0方法手工入池。

String str="abcdef";//放在常量池
String str2=new String("abcdef").intern();

(1)常量池当中存在 返回常量池当中字符串对象的地址;

char[] array = {'a','b','c','d','e','f'};
String str3=new String(array).intern();

(2) 如果常量池中不存在,那么在常量池中生成该对象的引用

String str="abcdef";
System.out.println(str==str3);//true

字符串是一种不可变对象. 它的内容不可改变

在这里插入图片描述
需要修改字符串:

方法1:
在这里插入图片描述
【str.substring(1):提取一个子串:从1号下标开始 ello】

方法2:反射

指的是程序运行过程中, 获取/修改某个对象的详细信息(类型信息, 属性信息等), 相当于让一个对象更好的 “认清自己” .
在这里插入图片描述

三、字符, 字节与字符串
1、字符与字符串
字符串内部包含一个字符数组,String 可以和 char[] 相互转换.
在这里插入图片描述
(1) 获取指定位置的字符

String str = "hello" ;  System.out.println(str.charAt(0));  
// 下标从 0 开始 
// 执行结果 h 

(2)字符串与字符数组的转换
a.数组转化为字符串
在这里插入图片描述
b.字符串转化为数组
方法一:
在这里插入图片描述

方法二:
在这里插入图片描述
2、字节与字符串
在这里插入图片描述
例:实现字符串与字节数组的转换处理

String str = "helloworld" ;  

// String 转 byte[] 
byte[] data = str.getBytes() ;  

for (int i = 0; i < data.length; i++) {      System.out.print(data[i]+" "); } 
 
// byte[] 转 String 
System.out.println(new String(data));

【注意】

1.byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合 针对二进制数据来操作.

2.char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.

四、字符串常见操作

1.字符串比较
在这里插入图片描述
代码示例: 不区分大小写比较

String str1 = "hello" ;  String str2 = "Hello" ;  System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true

在String类中compareTo()方法是一个非常重要的方法,一个可以区分大小关系的方法,该方法返回一个整型,该数据会根据大小关系返回三类内 容:
在这里插入图片描述
在这里插入图片描述
2 .字符串查找
在这里插入图片描述
例1:contains()

String str = "helloworld" ;  
System.out.println(str.contains("world")); // true 

例2:使用indexOf()方法进行位置查找

String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w开始的索引 
System.out.println(str.indexOf("bit")); // -1,没有查到 if 
(str.indexOf("hello") != -1) {    
System.out.println("可以查到指定字符串!"); 
}

①.indexOf效率略高于contains(contains底层调用indexOf)
②.使用indexOf()需要注意的是,如果内容重复,它只能返回查找的第一个位置

例: 使用indexOf()的注意点

String str = "helloworld" ;  
System.out.println(str.indexOf("l")); // 2 
System.out.println(str.indexOf("l",5)); // 8 
System.out.println(str.lastIndexOf("l")); // 8 从后往前找(默认从最后一个元素开始

在进行查找的时候往往会判断开头或结尾:

String str = "**@@helloworld!!" ;  
System.out.println(str.startsWith("**")); // true 判断是否从指定字符串开头
System.out.println(str.startsWith("@@",2)); // ture
System.out.println(str.endsWith("!!")); // true

3.字符串替换
在这里插入图片描述
例:字符串的替换

String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_")); 

注意: 由于字符串是不可变对象, 替换不修改当前字符串, 而是产生一个新的字符串.

4.字符串拆分
在这里插入图片描述
例:实现字符串的拆分

String str = "hello world hello bit" ; 
String[] result = str.split(" ") ; // 按照空格拆分 
for(String s: result) {   //输出数组
System.out.println(s); 
} 
String str = "ab-cd-ef";//数组接收
String[] strings = str.split("-");//用-分组
System.out.println(Arrays.toString(strings));//输出数组

例:部分拆分

String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) { 
  System.out.println(s); 
} 
String str = "ab-cd-ef";
String[] strings=str.split("-",2);
//最多分成两组 优先分组ab 后面为一组

例:拆分IP地址
字符" | " , " * " , “+” 都得加上转义字符,前面加上"" , 而如果是"",那么就得写成"\ \"

String str = "192.168.1.1" ; 
String[] result = str.split("\\.") ; 
//第一个\表示将后面的一个\转化为真正的\ 而\.才能变为.
for(String s: result) {    
  System.out.println(s); 
}

例:多次拆分

String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++) 
{  
   String[] temp = result[i].split("=") ;
   System.out.println(temp[0]+" = "+temp[1]); 
} 

5.字符串截取
在这里插入图片描述
例:

String str = "helloworld" ; 
System.out.println(str.substring(5)); 
System.out.println(str.substring(0, 5));

注意:

  1. 索引从0开始
  2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标

6.其他操作方法
在这里插入图片描述

        String str = " abc def ";
        str = str.trim();
        System.out.println(str);//删除空格

        String str1 = " abc def ";
        str1 = str1.toLowerCase();
        System.out.println(str1);//变成大写

        String str2 = " abc def ";
        str2 = str2.concat("hello");
        System.out.println(str2);//拼接
    }

    public static void main(String[] args) {
        String str="";//空串
        String str1=null;//空指针引用

        if(str1.isEmpty()){
            System.out.println("abcd");
    }
       if(str.isEmpty()) {
           System.out.println("abcd");//空指针异常
        }
    }

7. StringBuffer 和 StringBuilder

String和StringBuffer大的区别在于:
String的内容无法修改,而StringBuffer的内容可以修改。频繁修改字符串的 情况考虑使用StingBuffer。

注意
String和StringBuffer类不能直接转换。如果要想互相转换,可以采用如下原则:
String变为StringBuffer: 利用StringBuffer的构造方法append()方法

      StringBuffer a = new StringBuffer("abcdef");
      a.append("JAVA");//拼接
      System.out.println(a);

在String中使用"+"来进行字符串连接,但是这个操作在StringBuffer类中需要更改为append()方法

StringBuffer变为String: 调用toString()方法。

    StringBuilder b = new StringBuilder();
        b.append("abcde");
        b.append("gh");
        String s=b.toString();
        //把StringBuilder类型转化为String
        System.out.println(s);

请解释String、StringBuffer、StringBuilder的区别:
1.String的内容不可修改,StringBuffer与StringBuilder的内容可以修改.

2.StringBuffer与StringBuilder大部分功能是相似的 StringBuffer采用同步处理,属于线程安全操作;而StringBuilder采用异步处理,属于线程不安全操作.

发布了20 篇原创文章 · 获赞 23 · 访问量 562

猜你喜欢

转载自blog.csdn.net/m0_45097186/article/details/103448732
今日推荐