Java题目详解

来源:互联网 发布:oracle调用java http 编辑:程序博客网 时间:2024/05/22 00:46

1、求打印结果

int num = 0;for(int i=0;i<100;i++){    num=num++;}System.out.print(num);这一题考虑的是num++,num++ => num=num+1;其是它是一个有返回值的表达式,返回值为num自加前的值,java对其自加处理的流程为把num的值(非引用)拷贝到一个临时变量区,对num变量加1,接着返回临时变量区的值。对每个循环相当于这样处理int temp = num;num= num + 1;return num;这样就相当于每次都返回0;故结果为0;通过上面问题,我们可以通过哪些方式来保证并发安全的自增自减操作java默认的自增自检运算符是并发非安全的。1、使用synchronized代码块2、使用LOCK锁3、通过JDK提供的Atomiclnteger来直接保证。

2、经典的字符串比较

String s1 = "a1";String s2 = "a"+1;String s3 = "a"+"1";System.out.println(s1==s2);  trueSystem.out.println(s1==s3);  trueSystem.out.println(s1.equals(s2)); trueString s4 = "ab;String s5 = "b";String s6 = "a"+s5;System.out.println(s4 ==s6); false细看上一个也是字符串相加但是返回true,下面也是字符串相加,返回为false,这是为什么呢?我们知道 == 是比较两者是否相等,是否引用了同一个地址,equals却是比较两者值是否相同。前者都是true是因为:当两个字符串常量连接时(相加)得到的新字符串依然是字符串常量且保存在常量池中只有一份。后者不同因为:当字符串常量与 String 类型变量连接时得到的新字符串不再保存在常量池中,而是在堆中新建一个 String 对象来存放,很明显常量池中要求的存放的是常量,有 String 类型变量当然不能存在常量池中了。

3、两个链表组成一个递增的新的链表

这简单的写法就是使用java JDK Collections的使用:    List<Integer> list1 = new LinkedList<>();    Collections.addAll(list1, 30, 41, 15, 12, 56, 80);    System.out.print("list1:");    for (Integer integer : list1) {        System.out.print(integer + " ");    }    System.out.println();    List<Integer> list2 = new LinkedList<>();    Collections.addAll(list2, 23, 56, 78, 23, 12, 33, 79, 90, 55);    System.out.print("list2:");    for (Integer integer : list2) {        System.out.print(integer + " ");    }    System.out.println();    list1.removeAll(list2);    System.out.print("移除重复list1:");    for (Integer integer : list1) {        System.out.print(integer + " ");    }    System.out.println();    System.out.print("新的顺序");    list1.addAll(list2);    Collections.sort(list1);    for (Integer integer : list1) {        System.out.print(integer + " ");    }
原创粉丝点击