String类被称为不可变字符串类型,它的对象在创建后不能被修改
可以图中得知输出结果为 传智教育中心,好似和前面所提的不能修改不符,下面将叙述原因。
首先要明确 " " 符号给出的字符串,都存储在字符串常量池中,字符串常量池在堆内存中。
从上图我们可以得知“传智”,“教育”,“中心”三个字符串都在字符串常量池中,但是“传智教育中心”,就不在字符串常量池中因为,“传智教育中心”并不是以“ ”的方式创造的。
name的值是由栈内存中的main方法中的地址确定的,我们对于name的修改只能修改它所指向的字符串的地址值,实际上并不能将String定义的值改变,只能重新开辟一个新的空间并指向这个字符串。
以""方式给出的字符串对象,在字符串常量池中存储,而且相同内容只会存储一份。(这样设计的目的是节省内存)以构造器new对象,每new一个都会产生一个新的对象,放在堆内存中,并且不放在字符串常量池中。
通过""定义字符串常量内存原理
从上图可以得知在s1和s2进行比较时比较的是两个字符串的地址,而不是"abc"值。
上图我们可看到由于new构造器所产生的“abc”并不存在于字符串常量池中,所以构造的两个“abc”
并不是同一个,所以s1和s2存储的地址并不一样。
String类常见面试题
String常用API
这段代码模拟用户登录,但是在判断用户登录名和密码是否正确时,即使输入了正确的用户名和密码,也会显示错误,原因在==运算符上,因为okName==name;实际比较的是两边的地址,所以显示用户名或者密码错误。为了解决这个问题我们可以使用equals方法。
使用equals方法,就可以正常的运行。
在验证码的判断上我们可以应用 equalsIgnoreCase方法,这样在输入时可以随意输入大小写都可以成功判断。
package com.String;
public class StringAPI {
public static void main(String[] args) {
//1.获得字符串长度public int length()
String name ="helloworld";
System.out.println(name.length());
//2.获取某个索引位置处的字符public char charAt(int index)
System.out.println(name.charAt(1));
//2.1遍历每个字符串的每个字符
for (int i = 0; i <name.length() ; i++) {
System.out.print(name.charAt(i)+" ");
}
System.out.println();
//3.把字符串转换成字符数组public char[] toCharArray()
char chars[]=name.toCharArray();
for (int i = 0; i < chars.length; i++) {
char ch=chars[i];
System.out.println(ch);
}
//4.截取内容
//4.1从当前索引开始一直截取到末尾substring(beginindex)
String tel="1234567890";
System.out.println(tel.substring(4));
//4.2包前不包后substring(beginindex,endindex)
System.out.println(tel.substring(2, 4));
//5.替代字符串中的某些字符
String name1="北京是国际化大都市,北京是中国的首都";
System.out.println(name1.replace("北京", "***"));
//6.判断是否包含字符或字符串contains
name1.contains("北京");//true
name1.contains("北京市");//false
//7.判断字符串是否以某一字符或字符串开始startwith
name1.startsWith("北京");
name1.startsWith("北京市");
//8.按照某个内容将字符串分割成字符串数组返回split
String name2="足球,篮球,乒乓球";
String[] names=name2.split(",");
for (int i = 0; i < names.length; i++) {
System.out.println(""+names[i]);
}
}
}