String与Integer问题

今天分享一下关于最近面试的问题,临近春节,而我在茫茫人海中奔波,今天面试了来到了中关村科技园,挺气派的,之前也是在外面看看,今天就去了,心里有点激动,恰好,正好赶上了上班时,看见它们的努力,我感到再累也值!
废话不说了,我就说一下今天遇到的面试题,感到自己有点危机感,之后下来我在这里总结总结:
String 与Integer 相关的问题;

第一题:

//Integer n1 = new Integer(11); 
//Integer n2 = new Integer(11);

//Integer n3 = 11;
//Integer n4 = 11;
//System.out.println(n1 == n2);  false
//System.out.println(n1 != n2);  true

//System.out.println(n3 == n4);  true
//System.out.println(n3 != n4);  false

//String str1 = "1234";
//String str2 = new String("1234");

//System.out.println(str1 == str2); false
//System.out.println(str1.equals(str2));  true

//System.out.println("12" + "34" == "1234");  true

第二题:

public class Test1{
        String str = new String("good");
        char[] ch = {'a','b','c'};
        public static void main(String[] args){
            Test1 test1 = new Test1();
            test1.changer(test1.str,test1.ch);
            System.out.print(test1.str+" and ");
            System.out.print(test1.ch);
        }
        public void changer(String str,char ch[]){
            str = "test ok";
            ch[0] = 'g';
        }
  }

这个我需要把print给贴出来:

public void print(char s[]) {
        write(s);
}

private void write(char buf[]) {
        try {
            synchronized (this) {
                ensureOpen();
                textOut.write(buf);
                textOut.flushBuffer();
                charOut.flushBuffer();
                if (autoFlush) {
                    for (int i = 0; i < buf.length; i++)
                        if (buf[i] == '\n')
                            out.flush();
                }
            }
        }
        catch (InterruptedIOException x) {
            Thread.currentThread().interrupt();
        }
        catch (IOException x) {
            trouble = true;
        }
    }

输出为 good and gbc(而不是地址)

总结:

Integer:

Integer.valueOf(11) 比直接 new Integer(11) 性能更好,因为valueOf直接从缓存中返回Integer对象,只有数字在>=-128 && <=127这个区域会直接读缓存,否则调用new Integer新创建一个对象.所以说valueOf性能更好.因为它一开始就被缓存了.

 public static Integer valueOf(int i) {
    final int offset = 128;
    if (i >= -128 && i <= 127) { // must cache
        return IntegerCache.cache[i + offset];
    }
        return new Integer(i);
    }
 private static class IntegerCache {
      private IntegerCache(){}

      static final Integer cache[] = new Integer[-(-128) + 127 + 1];
     static {
        for(int i = 0; i < cache.length; i++)
        cache[i] = new Integer(i - 128);
     }
    }

String
1、String类是final的,不可被继承。
2、String类是的本质是字符数组char[], 并且其值不可改变。
3、String类对象有个特殊的创建的方式,就是直接指定比如String x = “abc”,”abc”就表示一个字符串对象。而x是”abc”对象的地址,也叫做”abc”对象的引用。
4、String对象可以通过“+”串联。串联后会生成新的字符串。
5、Java运行时会维护一个String Pool(String池),JavaDoc翻译很模糊“字符串缓冲区”。String池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。而一般对象不存在这个缓冲池,并且创建的对象仅仅存在于方法的堆栈区。
6、创建字符串的方式很多,归纳起来有三类:
其一,使用new关键字创建字符串,比如String s1 = new String(“abc”);
其二,直接指定。比如String s2 = “abc”;
其三,使用串联生成新的字符串。比如String s3 = “ab” + “c”;

String 是如何创建的
原理1:
当使用任何方式来创建一个字符串对象s=X时,Java运行时(运行中JVM)会拿着这个X在String池中找是否存在内容相同的字符串对象,如果不存在,则在池中创建一个字符串s,否则,不在池中添加。

原理2:
Java中,只要使用new关键字来创建对象,则一定会(在堆区或栈区)创建一个新的对象。
String str1 = “abc”;
步骤:
1) 栈中开辟一块空间存放引用str1;

2) String池中开辟一块空间,存放String常量”abc”;

3) 引用str1指向池中String常量”abc”;

4) str1所指代的地址即常量”abc”所在地址
String str2 = new String(“abc”);
步骤:
1) 栈中开辟一块空间存放引用str2;

2) 堆中开辟一块空间存放一个新建的String对象”abc”;

3) 引用str2指向堆中的新建的String对象”abc”;

4) str2所指代的对象地址为堆中地址,而常量”abc”地址在池中

4.”abc”.equals(str)和str.equals(”abc”)的区别

“abc”.equals(str)避免空指针异常。

如果str为空,str.equals(”abc”)就会报空指针异常。

所以在字符串比较的时候一定要用”abc”.equals(str)。

今天就总结到““后续有更多精彩!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值