今天在观看java基础视频中关于String类的几个面试题的时候,发现虽然只有短短的几行代码,却隐藏了很多知识点,所以自己在看完视频后简单的整理了一下,其中不乏存在疏漏,不足之处还请个位指出!
- public class Test_String {
- public static void main(String[] args) {
- // test1();
- // test2();
- // test3();
- // test4();
- test5();
- }
- private static void test5() {
- /*
- * str2指向的是常量池中“abc”的地址值
- * str1指向的是常量池中“ab”的地址值
- * String中通过 “+” 来使字符串串联,而字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的
- * 系统会先创建一个StringBuilder对象获得值“abc”,由于无法将StringBuilder对象传给String对象,所以需要调用toString方法来创建一个String对象
- * str3指向的实际是堆内存中利用toString方法创建的String对象,所以和指向常量池中“abc”的str2地址是不同的,结果为false
- *
- * String中重写了equals方法,比较的是内容,结果为true
- */
- String str1 = "ab";
- String str2 = "abc";
- String str3 = str1 + "c";
- System.out.println(str2 == str3);
- System.out.println(str2.equals(str3));
- }
- private static void test4() {
- /*
- * true java中存在常量优化机制,"a"+"b"+"c"系统会默认变成“abc”来存放,str1在创建的时候就已经在常量池中创建了abc,所以str2会直接使用
- * true 比较的是内容,同为abc,所以肯定是为true
- */
- String str1 = "a"+"b"+"c";
- String str2 = "abc";
- System.out.println(str2 == str1);
- System.out.println(str1.equals(str2));
- }
- private static void test3() {
- /*
- * flase
- * true
- *
- * new String("abc")中存放的是常量池中“abc”的副本,地址值是在堆内存中分配的
- * str1指向的是常量池中“abc”
- * 所以这里str和str1的地址肯定不相同,但是String类中重写了equals方法这里比较的是str和str1的值,都是abc所以相等
- */
- String str = new String("abc");
- String str1 = "abc";
- System.out.println(str == str1);
- System.out.println(str1.equals(str1));
- }
- private static void test2() {
- /*
- * 创建了几个对象?
- *
- * public String(String original)
- * 初始化一个新创建的 String 对象,使其表示一个与参数相同的字符序列;换句话说,新创建的字符串是该参数字符串的副本。
- * 由于 String 是不可变的,所以无需使用此构造方法,除非需要 original 的显式副本。
- *
- * 1、首先在常量池中创建一个abc字符串
- * 2、在堆内存中创建一个String对象
- * 3、将常量池中abc的副本传给堆中的String对象
- * 4、String对象将地址值返回给引用
- *
- * 所以这里一共创建了两个对象,常量池中的“abc”和堆内存中“abc”的副本String对象
- */
- String str = new String("abc");
- }
- private static void test1() {
- /*
- * String 类代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现。
- * 字符串是常量;它们的值在创建之后不能更改,存放在常量池
- *
- * String类型属于引用数据类型 String str1 = "abc",实际上是类似于Student stu = new Student();
- * 简而言之就是说这里的“abc”实际上是String类的实现,并且是final修饰的,所以系统会在常量池中分配一个地址值
- * 接下来的String str2 ="abc",这个语句实际上是把abc的地址传给str2,所以这里str1和str2指向的是同一个对象
- * 既然是同一个对象,那么地址值肯定是一样的,所以使用==来比较肯定是true
- * 而String类中是有重写equals方法的,当内容相同的时候比较结果是true
- */
-
- String str1 = "abc";
- String str2 = "abc";
- System.out.println(str1 == str2);
- System.out.println(str1.equals(str2));
- // System.out.println(str1.hashCode());
- // System.out.println(str2.hashCode());
- }
- }
复制代码 |
|