String类的基本概念
- java.lang.String类用于描述字符串,Java程序中所有的字符串字面值都可以使用该类的对象加以描述,如:“abc”。
- 该类由final关键字修饰,表示该类不能被继承(笔试题中会考如:出一个题继承自String类问有没有错误)。同时String类是继承自Object的
- 该类的底层不使用char[]来存储数据,而是改成 byte[]加上编码标记,从而节约了一些空间
- 该类描述的字符串内容是个常量不可更改,因此可以被共享使用
- String str1 = “abc”; - 其中"abc"这个字符串是个常量不可改变;
- str1 = “123”; 将“123”字符串的地址赋值给变量str1,改变str1的指向并没有改变指向的内容
注意:以前new对象都在堆区申请内存空,但String类是在栈区,里面放了字符串在方法区的地址
常量池的概念
由于String类型描述的字符串内容是常量不可改变,因此Java虚拟机将首次出现的字符串放入常量池(常量池可以理解为方法区的一块空间)中,若后续代码中出现了相同字符串内容则直接使用池中已有的字符串对象而无需申请内存及创建对象,从而提高了性能
常用的构造方法
代码展示
public class StringExamTest {
public static void main(String[] args) {
//1.请问下面的代码会创建几个对象?分别存放在什么地方?
String str1 = "abc";//一个对象,存放在常量池中(String str1是在栈区申请内存,指向常量池)
String str11 = new String("hello");//构造方法的最后一条,两个对象 一个在常量池中 new的那个在堆区的内存空间中(str11最终指向堆区)
String str2 = "abc";
System.out.println(str1==str2);//比较地址
System.out.println(str1==str11);//比较地址
System.out.println(str1.equals(str2));//比较内容
System.out.println(str1.equals(str2));//比较内容
}
}
还可以这样考 String的常量优化机制
public class StringExamTest {
public static void main(String[] args) {
//常量优化机制
String str5 = "abcd";
String str6 = "ab"+"cd";
System.out.println(str5==str6);
String str7 = "ab";
String str8 = str7+"cd";//str7不是常量了,不适合常量优化
System.out.println(str7==str8);
}
}
常用的成员方法
笔试考点:使用两种方式实现字符串“12345”转换为整数12345并打印
另外:parseInt()
方法用于将字符串参数作为有符号的十进制整数进行解析
public class CharAtTest {
public static void main(String[] args) {
//方式1 调用Integer类中的parseInt()方法即可
String str2 = new String("12345");
int ia = Integer.parseInt(str2);
System.out.println("转换出来的整数是"+ia);//12345
//方式二:利用ASCII来实现类型转换并打印
//字符0的ASCII是48,且'1'-'0'=>1 '2'-'0'=>2
int ib=0;
for(int i=0;i<str2.length();i++){
ib=ib*10+(str2.charAt(i)-'0');
}
System.out.println("转换出来的结果是"+ib);
}
}
案例解决
判断字符串“上海自来水来自海上”是否为回文并打印,所谓回文是指一个字符序列无论从左向右读还是从右向左读都是相同的句子
public class StringJudge {
public static void main(String[] args) {
//1.创建字符串对象并打印
String str1 = new String("上海自来水来自海上");
System.out.println("str1="+str1);
//2.判断该字符串内容是否为回文
for(int i=0;i<str1.length()/2;i++){
if(str1.charAt(i)!=str1.charAt(str1.length()-i-1)){
System.out.println("不是回文");
return;//仅仅是用于方法的结束 这里会直接结束main方法
}
}
System.out.println("是回文");
}
}
小知识点
- String类是一个不可变的类,一旦创建就不可以修改。
- String是final类,不能被继承
- String实现了equals()方法和hashCode()方法