黑马程序员Java培训和Android培训-就业面试题学习

黑马程序员Java培训和Android培训-就业面试题学习

经典问题:

(1)在JAVA中如何跳出当前的多重嵌套循环

法一:在Java中,要想跳出多重循环,可以在外面的循环语句前定义一个标号,然后在里层循环体的代码中使用带有标号的break 语句,即可跳出外层循环。例如,

ok:

for(int i=0;i<10;i++)< p="">

{

for(int j=0;j<10;j++)< p="">

{

tln(“i=” + i + “,j=” + j);

if(j == 5) break ok;

}

}

法二:让外层的循环条件表达式的结果可以受到里层循环体代码的控制,例如,要在二维数组中查找到某个数字。

int arr[][] = {{1,2,3},{4,5,6,7},{9}};

boolean found = false;

for(int i=0;i<th p="" !found;i++)<="">

{

for(int j=0;j

{

tln(“i=” + i + “,j=” + j);

if(arr[i][j] == 5)

{

found = true;

break;

}

}

}

(2)在switch(expr1)中,expr1只能是一个整数表达式或者枚举常量(更大字体),整数表达式可以是int基本类型或Integer包装类型(JDK1.5新特性,拆包),由于,byte,short,char都可以隐含转换为int,所以些类型以及这些类型的包装类型也是可以的作为expr1的类型

(3)使用final关键字修饰一个变量时,是指引用变量(存储对象地址的变量)不能变,即其中存储的对象地址值不能变,也就是说引用变量不能指向另外一个对象,存储另外一个对象的地址,引用变量所指向的对象中的内容还是可以改变的。例如,对于如下语句:个

finalStringBuffera=newStringBuffer("immutable");

执行如下语句将报告编译期错误:

a=newStringBuffer("");

但是,执行如下语句则可以通过编译:

nd("broken!");

有人在定义方法的参数时,可能想采用如下形式来阻止方法内部修改传进来的参数对象:

public void method(final StringBuffer param)

{

}

实际上,这是办不到的,在该方法内部仍然可以增加如下代码来修改参数对象:

nd("a");

(4)字符串的比较基本上都是使用equals方法

(5)27、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别?

两个或一个,”xyz”对应一个对象,这个对象放在字符串常量缓冲区,常量”xyz”不管出现多少遍,都是缓冲区中的那一个。New String每写一遍,就创建一个新的对象,它一句那个常量”xyz”对象的内容来创建出一个新String对象。如果以前就用过’xyz’,这句代表就不会创建”xyz”自己了,直接从缓冲区拿。

关于字符串的研究:

清晰的学习String需具备的知识:

1.内存栈与堆

详细知识请看我回答的内容:

ng的关键知识点

String是常量,其对象一旦创建完毕就无法改变。当使用+拼接字符串时,会生成新的String对象,而不是向原有的'String对象追加内容。

String pool(字符串池)内存栈即你上面说的缓冲池

String s = “aaa”;(采用字面值方式赋值)

1) 查找String pool中是否存在“aaa”这个对象,如果不存在,则在String pool中创建一个“aaa”对象,然后将String pool中的这个“aaa”对象的地址返回来,赋给引用变量s,这样s会指向String pool中的这个“aaa”字符串对象

2) 如果存在,则不创建任何对象,直接将String pool中的这个“aaa”对象地址返回来,赋给s引用。

String s = new String(“aaa”); 堆内存

1) 首先在String pool中查找有没有“aaa”这个字符串对象,如果有,则不在String pool中再去创建“aaa”这个对象了,直接在堆中(heap)中创建一个“aaa”字符串对象,然后将堆中的这个“aaa”对象的地址返回来,赋给s引用,导致s指向了堆中创建的这个“aaa”字符串对象。

2) 如果没有,则首先在String pool中创建一个“aaa“对象,然后再在堆中(heap)创建一个”aaa“对象,然后将堆中的这个”aaa“对象的地址返回来,赋给s引用,导致s指向了堆中所创建的这个”aaa“对象。