今天分享一下关于最近面试的问题,临近春节,而我在茫茫人海中奔波,今天面试了来到了中关村科技园,挺气派的,之前也是在外面看看,今天就去了,心里有点激动,恰好,正好赶上了上班时,看见它们的努力,我感到再累也值!
废话不说了,我就说一下今天遇到的面试题,感到自己有点危机感,之后下来我在这里总结总结:
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)。
今天就总结到““后续有更多精彩!