java面试题day06(String、StringBuffer)

1. Math.round(11.5)等于多少?Math.round(- 11.5) 又等于多少?
Math.round(11.5)的返回值是 12,Math.round(-11.5)的返回值是-11。
四舍五入的原理是在参数上加 0.5然后进行取整。
floor()地板的意思,即向下取整-取比当前数字小的整数。
ceil()是天花板的意思,即向上取整-取比当前数字大的整数。

2、switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String上?
Java5 以前 switch(expr)中,expr 只能是 byte、short、char、int。
从 Java 5 开始,Java 中引入了枚举类型,expr 也可以是 enum 类型。
从 Java 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。

3. 数组有没有 length() 方法?String 有没有 length() 方法?
数组没有 length()方法,而是有 length 的属性。String 有 length()方法。JavaScript 中,获得字符串的长度是通过 length 属性得到的。

4、String 、StringBuilder 、StringBuffer 的区别?

在 Java 中无论使用何种方式进行字符串连接,实际上都使用的是 StringBuilder。
1)String 是只读字符串,也就意味着 一旦赋值或实例化后就不可更改,如果赋予新值将会重新开辟内存地址进行存储。
2)StringBuffer类使用append和insert等方法改变字符串值时只是在原有对象存储的内存地址上进行连续操作,减少了资源的开销。
StringBuilder [线程安全]是 Java5 中引入的,它和 StringBuffer[线程不安全] 的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比 StringBuffer 要高。

5、请说出下面程序的输出

    public static void main(String[] args) {
        String s1 = "Programming";
        String s2 = new String("Programming");
        String s3 = "Program";
        String s4 = "ming";
        String s5 = "Program" + "ming";
        String s6 = s3 + s4;
        System.out.println(s1 == s2); //false
        System.out.println(s1 == s5); //true
        System.out.println(s1 == s6); //false
        System.out.println(s1 == s6.intern()); //true
        System.out.println(s2 == s2.intern()); //false
    }

String 对象的 intern()方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与
String 对象的 equals 结果是 true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返
回常量池中字符串的引用;

在调用”ab”.intern()方法的时候会返回”ab”,但是这个方法会首先检查字符串池中是否有”ab”这个字符串,如果存在则返回这个字符串的引用,否则就将这个字符串添加到字符串池中,然会返回这个字符串的引用。
java中String new和直接赋值的区别

对于字符串:其对象的引用都是存储在栈中的,
如果是编译期已经创建好(直接用双引号定义的)的就存储在常量池中,
如果是运行期(new出来的)才能确定的就存储在堆中。
对于equals相等的字符串,在常量池中永远只有一份,在堆中有多份。

例如:

 String str1="ABC";
 String str2 = new String("ABC"); 

String str1=“ABC” 可能创建一个对象或者不创建对象,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象(“ABC”).如果已经存在,str1直接reference to 这个String池里的对象。
String str2 = new String(“ABC”) 至少创建一个对象,也可能两个。因为用到new 关键字,会在heap创建一个 str2 的String 对象,它的value 是 “ABC”.同时,如果"ABC"这个字符串在java String池里不存在,会在java String池创建这个一个String对象(“ABC”).

也就是有道面试题: String s = new String(“xyz”); 产生几个对象?

一个或两个。如果常量池中原来没有 ”xyz”, 就是两个。如果原来的常量池中存在“xyz”时,就是一个。
对于基础类型的变量和常量:变量和引用存储在栈中,常量存储在常量池中。

intern()方法设计的初衷,就是重用String对象,以节省内存消耗。

详解

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值