Java String 面试总结

1、String类型特点

        String是封装数据类型,String类是final类,它是不可变的,不能被继承。

2、String s=”Hello”;s=s+”world!”;这两句代码执行后,原始的String对象中的内容变没?

        没有,因为String被设计成为不可变类,不能修改,继承,代码执行后,s所指向的对象”hello”没有改变.不过s不指向s,而是指向了另外一个String.原来的对象还在内存中,只是不指向了。

3、Strings=new String(“xyz”);创建了几个String Object?二者之间有什么区别?

        两个或一个。

        当字符串“xyz”已存在时,只创建一个String对象,当“xyz”不存在时,创建两个对象。

4、String和StringBuffer的区别是什么?

        1、String是不可变的,StringBuffer是可变的。如果已知字符串要改变就用StringBuffer.

        2、String实现了equals和hashcode,而StringBuffer没有实现equals和hashcode。比如new String(“abc”).equals(new String(“abc”)的结果为true,

new StringBuffer(“abc”).equals(new StringBuffer(“abc”)

5、StringBuffer与StringBuilder的区别

        StringBuffer和StringBuilder类都表示内容可以被修改的字符串,

        StringBuilder是线程不安全的,运行效率高,StringBuffer是线程安全的,运行效率低。

        如果一个字符串变量是在方法里面定义,这种情况只可能有一个线程访问它,不存在不安全的因素了,则用StringBuilder。

        如果要在类里面定义成员变量,并且这个类的实例对象会在多线程环境下使用,那么最好用StringBuffer。

6、equals 与 “==”的区别

        equals比较的是两个字符串的值是否相等(内容是否相同);“==”比较的是两个字符串是否为同一个对象(同一内存地址)

7、String题目

        String a = "abcd";   

        String b = "ab" + "cd";

        System.out.println(a == b);//true

        String t  =  "cd";

        String c = "ab"+t;

        System.out.println(a == c);//false

        final String s = "cd";

        String d = "ab" + s;

        System.out.println(a == d);//true

        String r = "ab";

        String e = r + t;

        System.out.println(a == e);//false

        System.out.println(e.intern() == a);//true

        String f = new String("abcd");

        System.out.println(a == f);//false

        System.out.println(f.intern() == a);//false

        System.out.println(f.intern() == a.intern())//true

ps:JDK API文档中对intern()方法的描述是:

    返回字符串对象的规范化表示形式。
    一个初始为空的字符串池,它由类 String 私有地维护。

    当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。

    它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。

    所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。

8、String内存分配详解:

String x = "abc"; 

String y = new String("abcd");

内存分配情况如下图:


可以看出,x与y存在栈中,它们保存了相应对象的引用。第一条语句没有在堆中分配内存,而是将“abc”保存在常量池中。对于第二条语句,同样会在常量池中有一个“abcd”的字符串,当new时,会拷贝一份该字符串存放到堆中,于是y指向了堆中的那个“abcd”字符串。

本文摘自微信公众号——Java小笔记(iJavaNote),敬请您的关注!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值