认识String类

常见构造String方式

//方式一
String str1 = "hello";
System.out.println(str1);

//方式二
String str2 = new String("hello");
System.out.println(str2);

//方式三
char[] c = {
    
    'h','e','l','l','0'};
String str3 = new String(c);
System.out.println(str3);

//执行结果
hello
hello
hello

String 在内存中的存储

拿上述代码来说,String是引用类型,通过String直接创建的str1字符串是存在堆区的字符串常量池中;
str2是通过new关键字创建出来的对象是存放在堆区,此时它会看字符串常量池有无需要的字符串hello,若有则直接拿来用,若没有则在常量池中创建一个字符串hello,再拿来用;
str3也是new出来的对象存放在堆区,它拿的是通过char c存放在堆区的字符数组通过拷贝得到的字符串。
他们的打印结果相同但是存储方式各不相同。

图一

在这里插入图片描述
再比如

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

//执行结果
hello
hello

图二

在这里插入图片描述

此时修改str2的值,str1的值并不会改变

 String str1 = "hello";
 String str2 = str1;
 System.out.println(str1);
 System.out.println(str2);
 str1 = "word";
 System.out.println(str1);
 System.out.println(str2);
 
//执行结果
hello
hello
world
hello

因为此时str2还是引用的最开始str1创建的hello字符串,而现在的str1重新在字符串常量池中创建了world字符串。

比较字符串

代码一

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

拿图二来说str1与str2引用的是同一个对象hello,所以他们是相等的。

代码二

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

//执行结果
false

图三

此时的str1与str2都是各自重新在堆区new一个新的对象,即使他俩拿到的是同一个常量池的hello,但存放字符串的地址是不一样的。
在这里插入图片描述

equals比较字符串

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)); // 或者这样写也行

//比较 str 和 "Hello" 两个字符串是否相等
String str3 = new String("hello");
System.out.println(str3.equals("hello"));
//System.out.println(str3.equals("hello")); //或者这样写

String str = null;
// 方式一
System.out.println(str.equals("Hello")); // 执行结果 抛出 java.lang.NullPointerException 异// 方式二
System.out.println("Hello".equals(str)); // 执行结果 false

//执行结果
true
true

总结

“==”比较的是存放字符串的地址,而equals比较的是字符串本身

字符,字节与字符串

字符与字符串

//遍历字符串
String str = "abcde";
for (int i = 0; i <str.length() ; i++) {
    
    
    System.out.print(str.charAt(i) + " ");
}
//执行结果
a b c d e

// 将字符数组全部转换为字符串
 char[] c = {
    
    'a','b','c','d','e'};
 String str = new String(c);
 System.out.println(str.toString());
//执行结果
abcde

//将部分字符数组中的内容转换为字符串
 char[] c = {
    
    'a','b','c','d','e'};
 String str = new String(c,2,3);
 System.out.println(str.toString());
 //执行结果
 cde

//取得指定索引位置的字符,索引从0开始
 char[] c = {
    
    'a','b','c','d','e'};
 String str = new String(c);
 System.out.println(str.charAt(3));
 //执行结果
 d

//将字符串变为字符数组
String str = "abcde";
char[] c = str.toCharArray();
//for循环遍历
for (int i = 0; i < c.length; i++) {
    
    
    System.out.print(c[i] + " ");
}
//toString打印
System.out.println(Arrays.toString(c));//在这里使用的java包中的Arrays类
//执行结果
a b c d e
[a, b, c, d, e]

字节与字符串

对照ASCII码表
在这里插入图片描述

 //字符串转化为字节
 String str = "abcde";
 byte[] bytes = str.getBytes();
 System.out.println(Arrays.toString(bytes));
//执行结果
[97, 98, 99, 100, 101]

//字节转化为字符串
 byte[] bytes= {
    
    65, 66, 67, 68, 69};
 String str = new String(bytes);
 System.out.println(str);
 //执行结果
 ABCDE

//将部分字节数组转化为字符串
 byte[] bytes= {
    
    65, 66, 67, 68, 69};
 String str = new String(bytes,1,3);
 System.out.println(str);
 //执行结果
 BCD

字符串比较

String str1 = "hello" ;
String str2 = "HELLO" ;
System.out.println(str1.equals(str2)); //区分大小写比较
System.out.println(str1.equalsIgnoreCase(str2)); //不区分大小写比较

//执行结果
false
true

//比较字符串大小
 String str1 = "hello World";
 String str2 = "hello";
 int ret = str1.compareTo(str2);//返回的是大小长度,空格也算一个字符
 System.out.println(ret);
 
 //执行结果
 6

字符串查找

//判断一个字串是否存在
 String str1 = "helloWorld";
 String str2 = "hello";
 String str3 = "hlod";
 System.out.println(str1.contains(str2));
 System.out.println(str1.contains(str3));
 System.out.println(str1.contains("World"));
 //执行结果
true
false
true

//查找指定字符串的位置,否则返回-1
String str = "helloWorld";
int ret = str.indexOf("h");
int ret1 = str.indexOf("o");
int ret2 = str.indexOf("a");
System.out.println(ret);
System.out.println(ret1);
System.out.println(ret2);
//执行结果
0
4
-1

//从指定位置开始查找
String str = "hello world";
String str1 = "llo"; //只看第一个字母
char ch = 'w';
int ret = str.indexOf(str1,1);
int ret1 = str.indexOf(ch,4);
System.out.println(ret);
System.out.println(ret1);
//执行结果
2
6

还有一些类似的方法,用法与上述相同:
1.从后向前查找子串的位置

public int lastIndexOf(String str)

2.从指定位置由后向前查找

public int lastIndexOf(String str,int fromIndex)

3.判断是否以指定字符串开头

public boolean startsWith(String prefix)

4.从指定位置开始判断是否以指定字符串开头

public boolean startsWith(String prefix,int toffset)

5.判断是否以指定字符串结尾

public boolean endsWith(String suffix)

字符串替换

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

//替换所有指定内容
 String str = "hello world";
 String str1 = "good";
 System.out.println(str.replaceAll(str,str1));
 System.out.println(str.replaceAll("hello","good"));//所有hello换成good
 System.out.println(str.replaceAll("l","o"));//所有的l换成o
 //执行结果
 good
 good world
 heooo worod

字符串拆分

//全部拆分
String str = "hello world good world";
String[] ret = str.split("l");//按l拆分,l成为空格
String[] ret1 = str.split(" ");//按空格拆分
System.out.println(Arrays.toString(ret));
System.out.println(Arrays.toString(ret1));
//执行结果
[he, , o wor, d good wor, d]
[hello, world, good, world]


//部分拆分
String str = "hello world good world";
String[] ret = str.split("l",2);//最多拆1次
String[] ret1 = str.split(" ",3);//最多拆2次
System.out.println(Arrays.toString(ret));
System.out.println(Arrays.toString(ret1));
//执行结果
[he, lo world good world]
[hello, world, good world]

字符串截取

String str = "helloGoodWorld";
System.out.println(str.substring(5));//指定位置截取到结尾
System.out.println(str.substring(3,8));//截取部分内容
//执行结果
GoodWorld
loGoo

其它方法

1.去掉字符串的左右空格,保留中间空格

String str = " hello world ";
System.out.println("[" + str + "]");//去掉前
System.out.println("[" + str.trim() + "]");//去掉后
//执行结果
[ hello world ]
[hello world]

2.字符串转大小写

 String str1 = "HELlo";
 String str2 = "woRLd";
 System.out.println(str1.toUpperCase());//小写转大写
 System.out.println(str2.toLowerCase());//大写转小写
 //执行结果
 HELLO
 world

3.字符串入常量池
相当于把new到的对象在堆区转到字符串常量区

String str = new String("hello world");
System.out.println(str.intern());
//执行结果
hello world

4.字符串连接,等同于“+”,不入池

String str1 = "hello";
String str2 = "world";
System.out.println(str1.concat(str2));

5.字符串长度

public int length()

6.判断是否为空字符,但不是null,而是长度为0

public boolean isEmpty()

Java本身有很多库函数供我们使用,只需要通过.操作符就可以访问到。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/XSAAA/article/details/112818775