引用数据类型存的都是地址,通过地址指向对象;
基本数据类型存的都是具体值;
字符串 (String) 类型
特点:
1、字符创都是对象;
2、一旦初始化,不能被更改,字符串缓冲区支持可变的字符串,因为 String 对象是不可变的,所以可以共享;
3、共享;
eg:
public class Demo06 {
public static void main(String[] args) {
String str = "abcd";
System.out.println("str = " + str);
str = "wxyz";
System.out.println("str = " + str);
String str1 = "啵斯喵";
String str2 = "啵斯喵";
System.out.println(str1 == str2);
/*重点:
这里比较的是地址,第一次创建 "啵斯喵" 后创建地址,之后创建先查看缓冲区种有没有 "啵斯喵"
创建规则:
有则创建的变量指向此地址,没有则重新在缓冲区中创建该字符
*/
}
}
若使用 new 关键字,则比较会出现不同情况
public class Demo07 {
public static void main(String[] args) {
String str1 = "abcd";
String str2 = new String("abcd");
System.out.println(str1 == str2); //flase
// == 比较的是两个字符串的地址,故结果为 false
System.out.println(str1.equals(str2)); //true
// equals 方法比较的是两个字符串的值,故结果为true
// 由上可得:
// 字符串 String 类中重写了 equals方法;
}
}
字符串和 new 字符串的区别:
package Demo;
public class Demo08 {
public static void main(String[] args) {
String str1 = "abc";
String str2 = new String("abd");
System.out.println(str1.hashCode());
System.out.println(str2.hashCode());
}
}
字符串创建过程:
字符串 str1 没有通过 new 关键字创建,则主方法压栈后,在方法区中的常量池中创建常量,主方法中的 String 变量 str1 指向常量池中的地址;
字符串 str2 通过 new 关键字创建,则主方法压栈后,在方法区中的常量池中创建常量后,在堆中通过 new 关键字来创建 str2 ,并由 str2 指向常量池中的常量,在主方法中,则创建的字符串变量 str2 指向堆中开辟的空间的地址;
String 类的常用基本方法
public class Demo09 {
public static void main(String[] args) {
/* 字符串类的方法:
* 1.有多少个字符(长度)
* 2.获取字符在字符串中第一次出现的位置
* 3.获取所需位置上的字符
* 4.获取部分字符串
* 5.将指定字符串替换成另一个字符串
* 6.将字符串转换成字节数组或字符数组
* 7.字符大小写互相转换
* 8.将字符串按照指定方式分割成多个字符串
* 9.字符的比较
*/
String str = "abcderfgabcdersholgpqweiop";
//1.获取字符串长度
int length;
length = str.length();
System.out.println("字符串的长度为:" + length);
System.out.println("-----------------------------------------");
//2.获取字符在字符串中第一次出现的位置
int index;
index = str.indexOf('e');
System.out.println("字符串中字符 e 出现的位置为:" + index);
//实例:遍历字符串,找到字符串中出现的指定字符的所有位置;
/*注意:indexOf方法,寻找字符串中从 index+1 开始寻找下一次字符 ‘e’ 出现的位置,
查找到最后一个位置后,再查找下一次返回的值就为 -1 ;*/
while(index != -1){
System.out.println(index);
index = str.indexOf('e', index+1);
}
System.out.println("-----------------------------------------");
//3.获取所需位置上的字符
//注意:String 中字符的位置都是从零开始
char i ;
i = str.charAt(2);
System.out.println("字符串中第 2 个字符是:" + i);
System.out.println("-----------------------------------------");