publicstaticvoidmain(String[] args){
int j =0;int i =0;int m =0;int n =0;for(; i <10; i++){
m = j++;
n = n++;}
System.out.println("i:"+ i);
System.out.println("j:"+ j);
System.out.println("n:"+ n);
System.out.println("m:"+ m);}
你是不是以为输出
i:0
j:10
n:9
m:9
正确答案是
i:10
j:10
n:0
m:9
原因
i 一般是眼误,以为只存在于循环内,实际上它是定义在循环外的,所以值会一直被保存下来。
j 没什么好说的。
j++是先赋值,再加加,所以 m 比 j 慢一拍。
同样的道理,n每次赋值给自己都是原始值,它的加加也就显得没有意义。
= i++ 这一过程的伪代码类似于
publicvoidipp(){
int i_temp = i;
i+1;return i_temp;//返回的是原始值}
【2】关于list删除元素
下面的运行结果应该输出什么?
publicstaticvoidmain(String[] args){
List<Integer> list =newArrayList();
list.add(1);
list.add(3);
list.add(4);
list.add(7);
list.add(8);
list.add(9);
list.add(2);
list.add(5);
list.add(6);for(int i =0; i <9; i++){
if((list.get(i)&1)==1){
list.remove(i);}}for(int i =0; i < list.size(); i++){
System.out.println(list.get(i));}}
会出现如下异常
Exception in thread "main"----------------
java.lang.IndexOutOfBoundsException: Index:6, Size:5
at java.util.ArrayList.rangeCheck(ArrayList.java:657)
at java.util.ArrayList.get(ArrayList.java:433)
at HttpServer.wwvae.main(wwvae.java:27)
原因
移除元素后,list大小不再是9,因此 i 的增加会导致空指针异常。
那么修改 9 为 list.size() ,是否正常输出所有的偶数
for(int i =0; i < list.size(); i++){
if((list.get(i)&1)==1){
list.remove(i);}}
输出结果
34826
原因
还是因为移除元素后,原来的 i+1 变成了 i,躲过了检查,所以漏删。
修改办法
办法一:加上i--;for(int i =0; i < list.size(); i++){
if((list.get(i)&1)==1){
list.remove(i);
i--;}}
有同学提出,换一种迭代方式删
for(int i : list){
if((i &1)==1){
list.remove(i);}}
会出现如下异常
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at HttpServer.wwvae.main(wwvae.java:32)
int max = Integer.MAX_VALUE;
System.out.println("max:"+ max);int result = max *3/4;int result1 = max /4*3;
System.out.println("max * 3 / 4:"+ result);
System.out.println("max / 4 * 3:"+ result1);
结果
max:2147483647
max *3/4:536870911
max /4*3:1610612733
很明显,根据数学尝试我们知道,第一个运算结果是假的,为什么呢?因为 int 类型发送溢出了。
如何修改:为了防止溢出,需要进行先除后乘。
第二个答案就正确么?也不正确,正确答案是:1610612735.25,因为 int 是整数,所以进行了截取,这里跟第四问一样有趣,改写成double就行了(float依然有精度缺失)。
max:2.147483647E9
max *3/4:1.61061273525E9
max /4*3:1.61061273525E9
【5】关于继承和多态
下面的运行结果应该输出什么?
classA{
public String show(D obj){
return("A and D");}public String show(A obj){
return("A and A");}}classBextendsA{
public String show(B obj){
return("B and B");}@Overridepublic String show(A obj){
return("B and A");}}classCextendsB{
}classDextendsB{
}classTest{
publicstaticvoidmain(String[] args){
A a1 =newA();
A a2 =newB();
B b =newB();
C c =newC();
D d =newD();
System.out.println("1--"+ a1.show(b));
System.out.println("2--"+ a1.show(c));
System.out.println("3--"+ a1.show(d));
System.out.println("4--"+ a2.show(b));
System.out.println("5--"+ a2.show(c));
System.out.println("6--"+ a2.show(d));
System.out.println("7--"+ b.show(b));
System.out.println("8--"+ b.show(c));
System.out.println("9--"+ b.show(d));}}
结果
1--A and A
2--A and A
3--A and D
4--B and A
5--B and A
6--A and D
7--B and B
8--B and B
9--A and D
publicclassfvybhj{
publicstaticvoidmain(String[] args){
int n =3;
System.out.println("Before change, n = "+ n);changeData(n);
System.out.println("After changeData(n), n = "+ n);}publicstaticvoidchangeData(int nn){
nn =10;}}