牛客网错题集系列(三)

版权声明: https://blog.csdn.net/qq1641530151/article/details/82891923

目录

1.关于Integer的一个问题

2.关于泛型的一道题

3.关于Integer类型超过128时的一道题

4.以下哪一个不是赋值符号?

5.关于try/catch/finally

6.关于for循环的执行顺序问题

7.下面代码的输出结果是什么?

8.多线程的run()和start()方法的区别

9.~的使用

10 关于Java内存分布的一道题

11不能用来修饰interface的有( )(仅限外部接口)

12.小的知识点,关于封装类和String的一个小细节


1.关于Integer的一个问题

设有下面两个赋值语句:

a = Integer.parseInt("1024");

b = Integer.valueOf("1024").intValue();

下述说法正确的是()

a是整数类型变量,b是整数类对象。
a是整数类对象,b是整数类型变量。
a和b都是整数类对象并且它们的值相等。
a和b都是整数类型变量并且它们的值相等。

parseInt是把一个String类型的变量转化为int的基础数据类型的,valueOf是把一个String类型的值转换成一个Integer类型的值,intValue将返回一个int的基础数据类型的值。

2.关于泛型的一道题

以下说法错误的是()

虚拟机中没有泛型,只有普通类和普通方法
所有泛型类的类型参数在编译时都会被擦除
创建泛型对象时请指明类型,让编译器尽早的做参数检查
泛型的类型擦除机制意味着不能在运行时动态获取List<T>中T的实际类型

错误原因  可以通过反射机制

3.关于Integer类型超过128时的一道题

以下代码执行的结果显示是多少( )?

5994168_1502784155531_7C413AC0BAB7916AB91B0C47B8F34D18 (358×210)

true,false,true
false,true,false
true,true,false
false,false,true

如果Integer类型的值在-128到127之间,那么就会创建相应的缓存,而超出这个范围则新建一个对象。

如果Integer类型的值大于128,那么就会创建一个新的对象。

4.以下哪一个不是赋值符号?

+=
<<=
<<<=
>>>=

第四个是右移一位然后赋值

5.关于try/catch/finally

在try的括号里面有return一个值,那在哪里执行finally里的代码?

不执行finally代码
return前执行
return后执行

6.关于for循环的执行顺序问题

public class Test
{
    static boolean foo(char c)
    {
        System.out.print(c);
        return true;
    }
    public static void main( String[] argv )
    {
        int i = 0;
        for ( foo('A'); foo('B') && (i < 2); foo('C'))
        {
            i++ ;
            foo('D');
        }
    }
}
What is the result?
ABDCBDCB
ABCDABCD
Compilation fails.
An exception is thrown at runtime.

for(条件一;条件二;条件三){

执行语句

}

在这个for循环中的执行顺序将是 条件一 →条件二(检查是否满足条件二来判断是否继续执行下去)→ 执行语句 →条件三

7.下面代码的输出结果是什么?

public class ZeroTest {
    public static void main(String[] args) {
     try{
       int i = 100 / 0;
       System.out.print(i);
  }catch(Exception e){
       System.out.print(1);
       throw new RuntimeException();
  }finally{
       System.out.print(2);
  }
      System.out.print(3);
 }
 }
3
123
1
12

关于这道题,我之前也确实看了关于异常的一些知识点,可还是在这道题上出错了。

100/0时会抛出异常这个时候在try中的代码块就不在执行了。开始执行catch的代码块,但是在catch中又抛出了一个异常,那么程序就会在这个地方停止执行(除了执行finally中的代码以外)

8.多线程的run()和start()方法的区别

以下JAVA程序的输出是什么()

public class HelloSogou{
     public static synchronized void main(String[] a){
         Thread t=new Thread(){
             public void run(){Sogou();}
     };
     t.run();
     System.out.print("Hello");
     }
     static synchronized void Sogou(){
     System.out.print("Sogou");
    }
}
HelloSogou

SogouHello

Hello
结果不确定

就这道题而言,仅调用run()方法而没有调用start()方法时,run()方法只是一个普通的方法调用,并没有开启一个线程。

如果将run()方法改成start()的话,问题就会变复杂许多了。

方法Sougou()和main()持有的都是HelloSougou.class锁,所以方法是同步执行的。当在main()方法里面开启一个子线程进入就绪状态准备调用时,需要获取到HelloSougou.class锁,但是这个时候这个锁还有main()方法进行控制,只有等main()方法执行完毕后我们才可以让Sougou()方法获取到HelloSougou.class锁进行执行,这个时候输出的顺序就是HelloSougou。

9.~的使用

What results from the following code fragment?

1

2

3

int i = 5;

int j = 10;

System.out.println(i + ~j);

~n = -n-1

具体原理就是 

在计算机中,存储的都是数字的补码。对n求补码,然后将n的补码按位取反再减一求出来反码。然后再把反码按位取反求出来的就是~n的原码。

10 关于Java内存分布的一道题

下列Java代码中的变量a、b、c分别在内存的____存储区存放。

1

2

3

4

5

6

7

class A {

    private String a = “aa”;

    public boolean methodB() {

        String b = “bb”;

        final String c = “cc”;

    }

}

堆区、栈区、栈区

这道题后面两个都很好说b,c作为引用放在了栈区,但是"bb","cc"和"aa"都是在静态区的。

11不能用来修饰interface的有( )(仅限外部接口)

private
public
protected
static

接口是一种特殊的抽象类,接口中的方法全部是抽象方法(但其前的abstract可以省略),所以抽象类中的抽象方法不能用的访问修饰符这里也不能用。而且protected访问修饰符也不能使用,因为接口可以让所有的类去实现(非继承),不只是其子类,但是要用public去修饰。接口可以去继承一个已有的接口。

12.小的知识点,关于封装类和String的一个小细节

        Integer a = 9;
		Integer b = 9;
		System.out.println(a==b);
	Integer a = new Integer(9);
		Integer b = new Integer(9);
		System.out.println(a==b);

输出的结果一个是true,一个是false。原因是当我们使用new的时候,我们会在堆区创建一个新的对象。==比较的是两个对象的地址是否相同。所以会是false。但是上方的代码考虑到Integer的缓存机制,a和b指向的都是同一块内存区域,所以是true。

猜你喜欢

转载自blog.csdn.net/qq1641530151/article/details/82891923