本文写给正在努力的自己,努力的补基础知识,五道题一篇
ps:我把答案都放在解析下面了
- 以下代码输出为多少
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("b");
list.add("b");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("b")) {
list.remove(i);
}
}
for (String a : list) {
System.out.println(a);
}
}
初识想法:当小编第一看到这道题的时候,有点蒙,这不就是把链表中的b全部去掉吗?这么简单的题怎么会错呢?但是运行之后才发现并不是
解析:这道题的考点在于for循环中的list.size()每次循环都会被重新计算,也就是第一次执行的时候,list.size()的值为5,。
当执行到第二次循环的时候,查询到第一个b的时候,将它清除掉,但是。
当执行到第三次循环的时候,会重新计算链表长度也就是list.size()的值变为4。
当执行到第四次循环的时候,检查到了第二个b,将它清除。这个时候,链表的长度为3,所以跳出for循环,不再执行第五次循环
我们来答应一下每次for循环时的list.size()就可以验证了
答案:最后输出的结果为acb,因为最后一个b没有被清除
- 以下代码输出为什么?
class Super {
int flag = 1;
Super() {
test();
}
void test() {
System.out.println("Super.test中的方法" + flag);
}
}
class Sub extends Super {
Sub(int i) {
flag = i;
System.out.println("Sub中的方法" + flag);
}
void test() {
System.out.println("Sub.test中的方法" + flag);
}
}
public static void main(String[] args) {
new Demo1().new Sub(0);
}
初识想法:这道题将继承体现的淋漓尽致了,传参,方法的调用,都包含了
解析:1.首先调用父类构造方法,即super()
2.调用test()方法。
3.由于在子类sub()中重写了test()方法,所以 调用子类test()
4.输出Sub.test()flag=1
5.调用sub的有参构造方法
6.输出Sub.Sub() flag=5 重点在于要时刻记得子类重写父类方法, 调用时会 调用子类重写之后的方法
当然, 这一切的前提都是 实例化子类对象
通俗易懂的讲就是:先调用父类的方法,子类有就用子类的,子类没有就用父类的
答案:
-
问题:java中是否有多继承?
初识想法:记得老师说过,c里是有多继承的,但是java没有
解析:java中接口是有多继承的,但是类没有
但是要注意的是继承对象以及继承者均为接口才能实现多继承,不能继承类
答案:有 -
一个容器类数据结构,读写平均,使用锁机制保证线程安全,如果要综合提高该数据结构的访问性能,最好的办法是:
A. 只对写操作加锁,不对读操作加锁
B. 读操作不加锁,采用copyOnWrite的方式实现写操作
C. 分区段加锁
D. 无法做到
解析:
A 只对写操作加锁,不对读操作加锁,会造成读到脏数据
B,CopyOnWrite的核心思想是利用高并发往往是读多写少的特性,对读操作不加锁,对写操作,先复制一份新的集合,在新的集合上面修改,然后将新集合赋值给旧的引用。这里读写平均,不适用
C, 分段加锁,只在影响读写的地方加锁,锁可以 用读写锁,可以提高效率
答案:c -
以下代码输出为多少
public static void main(String[] args) {
Object o1 = true ? new Integer(1) : new Double(2);
Object o2;
if (true) {
o2 = new Integer(1);
} else {
o2 = new Double(2.0);
}
System.out.println("o1的值为 " + o1);
System.out.println("o2的值为 " + o2);
}
初识想法:三元运算符前都写了true那么o1直接就是等于1了这个考什么呢?
解析:首先三元运算符的判断条件是 true,然后整表达式有Double,所以Object被隐式转换为 Double,否则有数据丢失,编译器不会这样做。最 终机器运行的表达式应该是这样的.因为三元运算符必须保证类型一致, 不一致得到话会自动进行类型提升
答案: