String 在Java中的使用

1、创建字符串:

(1)常见的构造String的方式:

① 方式一:(直接赋值)

String str1 = "hello";

② 方式二:(构造方法)

String str2 = new String("hello");

③ 方式三:

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

三种方式的区别:
在这里插入图片描述
面试: String 类中两种对象实例化的区别

1、直接赋值:只会开辟一块对内存空间,并且该字符串对象可以自动保存在对象池中以供下次使用。
2、构造方法:会开辟两块堆内存空间,不会自动保存在对象池中,可以使用 intern() 方法手工入池

(2)String的基本概念:

string 是一种 引用类型,类似于 C语言中的指针
引用: 只能指向对象的数据结构
(我们可以把引用想象成一个标签,“贴”到一个对象上,一个对象可以贴一个或多个标签;如果一个对象没有一个标签就会被JVM当垃圾回收掉)

String str = "cool";
String str2 = "cool";

在这里插入图片描述
这时可能有人就会问了:
如果修改了 str ,str2 会随之改变嘛?

String str = "cool";
String str2 = "cool";
str = "beautiful";
System.out.println(str2);

//执行结果:  cool

在这里插入图片描述
事实上,str = “beautiful” 这样的代码并不能修改字符串,而是让 str 这个引用指向了一个新的 String 对象。(字符串内容不可变)

2、字符串比较相等:

(1)== 型:
基本数据类型比较的是数值的大小

int x = 10 ;
int y = 10 ;
System.out.println(x == y); 
// 执行结果
true

对于String来说,如果是直接赋值的话,因为两个引用指向字符串常量池中同一个对象,所以返回 true

String str1 = "Hello";
String str2 = "Hello"; 
System.out.println(str1 == str2); 
// 执行结果
true

若是构造方法的话,两个引用各自指向两个对象,因为new了两个对象,所以结果是false

String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 执行结果
false

所以,String使用 == 比较的 并不是在比较字符串的内容,而是比较两个引用是否指向同一个对象

(2)在 Java 中,要想比较字符串的内容,必须采用 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

3、字符、字节、字符串的转换

(1)字符与字符串

String 可以和 char[] 相互转换
在这里插入图片描述
代码实例:

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

字符串与字符数组的转换

String str = "helloworld" ; 
// 将字符串变为字符数组
char[] data = str.toCharArray() ; 
for (int i = 0; i < data.length; i++) {
    
     
 System.out.print(data[i]+" "); 
} 
// 字符数组转为字符串
System.out.println(new String(data)); // 全部转换
System.out.println(new String(data,5,5)); // 部分转换

(2)字节与字符串

String 和 byte[] 相互转换
在这里插入图片描述
代码实例:

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));

那么何时使用 byte[], 何时使用 char[] 呢?
byte[] : 是把 String 按照一个字节一个字节的方式处理,这种合适在网络传输,数据存储这样的场景下使用,更适合针对二进制数据来操作。
char[] : 是把 String 按照一个字符一个字符的方式处理,更适合针对文本数据来操作,尤其是包含中文的时候。

4、字符串常见操作:

(1)字符串比较:

在这里插入图片描述

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

(2)字符串查找:

在这里插入图片描述
代码示例:
字符串查找,最好用最方便的就是 contains()

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

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

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

判断开头或结尾:

String str = "**@@helloworld!!" ; 
System.out.println(str.startsWith("**")); // true 
System.out.println(str.startsWith("@@",2)); // ture 
System.out.println(str.endwith("!!")); // true

(3)字符串替换:

在这里插入图片描述
字符串的替换处理:

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

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

(4)字符串拆分:

在这里插入图片描述
实现字符串的拆分处理:

String str = "hello world " ; 
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) {
    
     
 System.out.println(s); 
}

字符串的部分拆分:

String str = "hello world " ; 
String[] result = str.split(" ",2) ; 
for(String s: result) {
    
     
 System.out.println(s); 
}

拆分IP地址:

String str = "192.168.1.1" ; 
String[] result = str.split("\\.") ; 
for(String s: result) {
    
     
 System.out.println(s); 
}

注意:

  1. 字符" | “,” * “,” + " 都得加上转义字符,前面加上" \ ".
  2. 而如果是"",那么就得写成" \ \ ".
  3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符.

多次拆分:

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)其他操作:

在这里插入图片描述
观察 trim() 方法的使用:

String str = " hello world " ; 
System.out.println("["+str+"]"); 
System.out.println("["+str.trim()+"]");

观察 isEmpty() 方法:

System.out.println("hello".isEmpty()); 
System.out.println("".isEmpty()); 
System.out.println(new String().isEmpty());

首字母大写:

public static void main(String[] args) {
    
     
 System.out.println(fistUpper("yuisama")); 
 System.out.println(fistUpper("")); 
 System.out.println(fistUpper("a")); 
 } 
 public static String fistUpper(String str) {
    
     
 if ("".equals(str)||str==null) {
    
     
 return str ; 
 } 
 if (str.length()>1) {
    
     
 return str.substring(0, 1).toUpperCase()+str.substring(1) ; 
 } 
 return str.toUpperCase() ; 
 }

5、String、StringBuffer、StringBuilder区别(面试)

(1)String 的内容不可修改,而 StringBuffer 和 StringBuilder 的内容可以修改,频繁修改字符串的情况考虑使用StingBuffer。
(2)String 、 StringBuilder 适合于 单线程
StringBuffer 适合于 多线程 ,安全
(3)对于 String 来说,其拼接是被底层优化为了 StringBuilder

猜你喜欢

转载自blog.csdn.net/qq_45658339/article/details/109106930