2018-2-21 牛客试题复盘

1、执行如下程序,输出结果是(C)

class Test
{
      private int data;
      int result =  0 ;
      public void m()
      {
          result +=  2 ;
          data +=  2 ;
          System.out.print(result +  "  " + data);
      }
  }
  class ThreadExample  extends Thread
  {
      private Test mv;
      public ThreadExample(Test mv)
      {
          this .mv = mv;
      }
      public void run()
      {
          synchronized (mv)
          {
              mv.m();
          }
      }
  }
  class ThreadTest
  {
      public static void main(String args[])
      {
          Test mv =  new Test();
          Thread t1 =  new ThreadExample(mv);
          Thread t2 =  new ThreadExample(mv);
          Thread t3 =  new ThreadExample(mv);
          t1.start();
          t2.start();
          t3.start();
      }
  }
 
A、0 22 44 6
B、2 42 42 4
C、2 24 46 6
D、4 44 46 6
解析:
Test mv =newTest()声明并初始化对data赋默认值 
使用synchronized关键字加同步锁线程依次操作m() 
t1.start();使得result=2,data=2,输出即为2 2 
t2.start();使得result=4,data=4,输出即为4 4 
t3.start();使得result=6,data=6,输出即为6 6 
 System.out.print(result +" "+ data);是print()方法不会换行,输出结果为2 24 46 6
 
 
2、下面程序的运行结果(D)
         Object obj= new Object();
         List aList= new ArrayList();
         List bList= new LinkedList();
         
         long t1=System.currentTimeMillis();
         for ( int i= 0 ;i< 50000 ;i++){
             aList.add( 0 ,obj);
         }
         long t2=System.currentTimeMillis()-t1;
         
         t1=System.currentTimeMillis();
         for ( int i= 0 ;i< 50000 ;i++){
             bList.add( 0 ,obj);
         }
         long t3=System.currentTimeMillis()-t1; 

A、t2<t3< pre="">
B、t2=t3
C、不确定
D、t2>t3
解析:
ArrayList内部是动态数组实现,在增加空间时会复制全部数据到新的容量大一些的数组中。而LinkedList内部为双向链表,可以按需分配空间,扩展容量简单,因此LinkedList用时少。
 
 
 
3、以下哪项陈述是正确的?E
A、垃圾回收线程的优先级很高,以保证不再 使用的内存将被及时回收
B、垃圾收集允许程序开发者明确指定释放 哪一个对象
C、垃圾回收机制保证了JAVA程序不会出现 内存溢出
D、进入”Dead”状态的线程将被垃圾回收器回收
E、以上都不对
解析:
A: 垃圾回收在jvm中优先级相当相当低。
B:垃圾收集器(GC)程序开发者只能推荐JVM进行回收,但何时回收,回收哪些,程序员不能控制。
C:垃圾回收机制只是回收不再使用的JVM内存,如果程序有严重BUG,照样内存溢出。
D:进入DEAD的线程,它还可以恢复,GC不会回收
 
 
4、java8中,下面哪个类用到了解决哈希冲突的开放定址法  C
A、LinkedHashSet
B、HashMap
C、ThreadLocal
D、TreeMap
解析:
ThreadLocalMap中使用开放地址法来处理散列冲突,而HashMap中使用的是分离链表法。之所以采用不同的方式主要是因为:在ThreadLocalMap中的散列值分散得十分均匀,很少会出现冲突。并且ThreadLocalMap经常需要清除无用的对象,使用纯数组更加方便。
 
 
5、在java中,下列标识符不合法的有( ACD)
A、new
B、$Usdollars
C、1234
D、car.taxi
解析:
Java标识符由数字,字母和下划线(_),美元符号($)组成。在Java中是区分大小写的,而且还要求首位不能是数字。最重要的是,Java 关键字 不能当作Java标识符。
 
 
 
6、局部内部类可以用哪些修饰符修饰? CD
A、public
B、private
C、abstract
D、final

 解析:

7、Java 程序中使用赋值运算符进行对象赋值时,可以得到两个完全相同的对象。 B

A、正确
B、错误
 解析:
对象赋值时,比如A=B,只是把A对象的地址指向了B对象的地址,所以其实对象只有一个。
A,B都将指向同一块地址,但是A,B在内存中呢? 肯定占据不同的内存空间啊。
 
 
 
8、下面哪个修饰符修饰的变量是所有同一个类生成的对象共享的( C )
A、public
B、private
C、static
D、final
解析:
static修饰某个字段时,肯定会改变字段创建的方式(每个被static修饰的字段对于每一个类来说只有一份存储空间,而非static修饰的字段对于每一个对象来说都有一个存储空间)
static属性是属于类的,所以对象共同拥有,所以既可以通过类名.变量名进行操作,又可以通过对象名.变量名进行操作。
 
 
 
9、下面有关JAVA异常类的描述,说法错误的是?  D
A、异常的继承结构:基类为Throwable,Error和Exception继承Throwable,RuntimeException和IOException等继承Exception
B、非RuntimeException一般是外部错误(非Error),其必须被 try{}catch语句块所捕获
C、Error类体系描述了Java运行系统中的内部错误以及资源耗尽的情形,Error不需要捕捉
D、RuntimeException体系包括错误的类型转换、数组越界访问和试图访问空指针等等,必须被 try{}catch语句块所捕获
解析:
运行时异常故名思议就是程序在运行的时候出现异常,隐含的一个前提就是程序在编译时是检测不到异常的存在,作者本人也并不知道是否自己的代码中含有运行时异常,所以根本也不可能提前使用try{}catch{}捕获.
 
 
 
10、 Hashtable 和 HashMap 的区别是:BCDE
A、Hashtable 是一个哈希表,该类继承了 AbstractMap,实现了 Map 接口
B、HashMap 是内部基于哈希表实现,该类继承AbstractMap,实现Map接口
C、Hashtable 线程安全的,而 HashMap 是线程不安全的
D、Properties 类 继承了 Hashtable 类,而 Hashtable 类则继承Dictionary 类
E、HashMap允许将 null 作为一个 entry 的 key 或者 value,而 Hashtable 不允许。
解析:
Hashtable:
(1)Hashtable 是一个散列表,它存储的内容是键值对(key-value)映射。
(2)Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。
(3)HashTable直接使用对象的hashCode。
HashMap:
(1)由数组+链表组成的,基于哈希表的Map实现,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的。
(2)不是线程安全的,HashMap可以接受为null的键(key)和值(value)。
(3)HashMap重新计算hash值
 
Hashtable,HashMap,Properties继承关系如下:
1
2
3
4
public class Hashtable<K,V>  extends Dictionary<K,V>
     implements Map<K,V>, Cloneable, java.io.Serializable
 
public class HashMap<K,V> extends AbstractMap<K,V>  implements Map<K,V>, Cloneable, Serializable
1
2
3
4
java.lang.Objecct
   java.util.Dictionary<K,V>
     java.util.Hashtable<Object,Object>
       java.util.Properties 
 
 
 
 
11、 java如何接受request域中的参数?    C
A、request.getRequestURL()
B、request. getAttribute()
C、request.getParameter()
D、request.getWriter()
解析:
request.getAttribute()方法返回request范围内存在的对象,而request.getParameter()方法是获取http提交过来的数据。getAttribute是返回对象,getParameter返回字符串。
 
 
 
 
12、java Thread中,run方法和start方法的区别,下面说法错误的是?
A、通过调用Thread类的start()方法来启动一个线程,这时此线程是处于就绪状态,并没有运行。
B、他们都可以实现了多线程运行。
C、run方法是thread的一个普通方法调用。
D、调用start方法后,一旦得到cpu时间片,就开始执行run()方法。
解析:
 两种方法的区别:
    1.start方法
         用 start方法来启动线程,是真正实现了多线程, 通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法。但要注意的是,此时无需等待run()方法执行完毕,即可继续执行下面的代码。所以run()方法并没有实现多线程。
    2.run方法
         run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码。
 
 
 
13、请问所有的异常类皆直接继承于哪一个类?(C)
A、java.applet.Applet
B、java.lang.Throwable
C、java.lang.Exception
D、java.lang.Error
解析:
题目问的是所有的异常类。
 
 
 
14、以下叙述正确的是 D
A、实例方法可直接调用超类的实例方法
B、实例方法可直接调用超类的类方法、
C、实例方法可直接调用子类的实例方法
D、实例方法可直接调用本类的实例方法
解析:
A错误,类的实例方法是与该类的实例对象相关联的,不能直接调用,只能通过创建超类的一个实例对象,再进行调用
B错误,当父类的类方法定义为private时,对子类是不可见的,所以子类无法调用
C错误,子类具体的实例方法对父类是不可见的,所以无法直接调用, 只能通过创建子类的一个实例对象,再进行调用
D正确,实例方法可以调用自己类中的实例方法
 
 
 
15、下面的对象创建方法中哪些会调用构造方法 (AC)?
A、new语句创建对象
B、调用Java.io.ObjectInputStream的readObject方法
C、java反射机制使用java.lang.Class或java.lang.reflect.Constructor的newInstance()方法
D、调用对象的clone()方法
解析:
readObject方法只是从文件中还原对象,clone只是一种复制拷贝对象。
 
 
 
16、下列说法正确的有( ACD)
A、环境变量可在编译source code时指定
B、在编译程序时,所能指定的环境变量不包括class path
C、javac一次可同时编译数个Java源文件
D、javac.exe能指定编译结果要置于哪个目录(directory)
解析:
a选项-d即可设置系统属性
c选项一次编译多个java文件用javac *.java. 即可编译当前目录下的所有java文件
d选项-s指定存放生成的源文件的位置
 
 
 
17、下面关于面向对象的一些理解哪些是错误的(    C)
A、面向对象的最重要的特性是支持继承、封装和多态
B、系统设计应该遵循开闭原则,系统应该稳定不不可修改,但应支持通过继承、组合等方式进行扩展
C、函数式的语言必然是面向对象的语言
D、面向对象设计时,每个类的职责应该单一,不要再一个类中引入过多的接口
E、过程式语言和面向对象的语言各有其优势,过程式语言更加灵活,面向对象语言更加强调抽象和封装
F、Java和C++都是静态类型的面向对象编程语言
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/buhuiflydepig/p/12341904.html