校招选择题汇总【JavaSE(2)】含答案解析

  

题目1

答案:A

基类和导出类在 《Think  in  java》 中文翻译是 《java编程思想》 第四版 里有这个概念。基类就是父类,导出类就是子类。子类调用父类构造方法用super()关键字,且放在子类构造函数的第一行。

题目2

答案:A

B,java.awt包是java图形界面的包

C,java.lang是java语言的核心好,lang是language的简写

D,java.swing是经过java封装的与操作系统无关的图形界面包

题目3

答案:A

static用来修饰类或类的成员,这时不需要创建实例就能访问(而且不能实例化),在被调用的时候自动实例化,且在内存中产生一个实例。当含有静态成员的非静态类实例化出对象后,这些对象公用这些静态成员,通过类名或对象名都能访问它们

题目4

答案:C

A:不存在x[25] 索引从0开始到length-1
B:x[24] 存的是默认值0(java中没有'\0'这一说)
C:超出内存 正确
D:第二元素

题目5

答案:A

注解:java 中没有<> := 这种运算符, if else不算运算符,因此选a

题目6

答案:A

JAVA访问变量采用就近原则,局部变量与成员变量重名时,局部变量比较近,使用局部变量

题目7

答案:A

在Applet中,方法执行的顺序是: init()-> start()-> paint()-> stop()-> destroy()

题目8

答案:C

首先要注意的是它的返回值类型是long,如果 Math.round(11.5f),那它的返回值类型就是int,这一点可以参考API

其次  Returns the closest long to the argument, with ties rounding to positive infinity

它返回的是一个最接近参数的long 值(例如: Math.round(11.6) = 12; Math.round(-11.6) = -12; Math.round(-0.1) = 0; Math.round(0.1) = 0 ),那如果出现向上向下距离一样的数值, 比如题目中的11.5,该如何处理呢 ,别着急,看它的后半句话, with ties rounding to positive infinity( 同时向正无穷方向取舍或者翻译成取较大的值,英语水平较差,只能翻译成这样了;

例子:    Math.round(11.5)  ,首先与 11.5最接近的有两个整数 11 和 12,取较大的那结果就是12;

           Math.round(-11.5), 首先与 -11.5最接近的有两个整数 -11 和 -12,取较大的那结果就是-11;

           Math.round(0.5), 首先与 0.5最接近的有两个整数 0 和 1,取较大的那结果就是1;

           Math.round(-0.5), 首先与 -0.5最接近的有两个整数 -1 和 0,取较大的那结果就是0; )

然后它有三个特例:

1. 如果参数为 NaN(无穷与非数值) ,那么结果为 0。

2.如果参数为负无穷大或任何小于等于 Long.MIN_VALUE 的值,那么结果等于Long.MIN_VALUE 的值。

3.如果参数为正无穷大或任何大于等于 Long.MAX_VALUE 的值,那么结果等于Long.MAX_VALUE 的值。

题目9

答案:B

Stack是栈, queue是对列;

栈是后进先出,对列是先进先出;

栈是出入从同一个位置;

对列是入从结构的一端进入,从另一端出队;

栈就像一个盒子,你把物体依次放入后,能先拿出来的只能是上面最后放进去的,下层的想要拿出需要将上层的先拿出,也就是先出栈;

对列是一个胡同,人们都进入胡同了,只有最前面的人从胡同出口出去,后面的人只有等前面的人走完后才能依次通过。

题目10

答案:A

原生类是指Java中,数据类型分为基本数据类型(或叫做原生类、内置类型)和引用数据类型。

题目11

答案:D

这个说法说反了

Arraylist的内存结构是数组,当超出数组大小时创建一个新的数组,吧原数组中元素拷贝过去。其本质是顺序存储的线性表,插入和删除操作会引发后续元素移动,效率低,但是随机访问效率高

LinkedList的内存结构是用双向链表存储的,链式存储结构插入和删除效率高,不需要移动。但是随机访问效率低,需要从头开始向后依次访问

题目12

答案:B

初始化块在构造器执行之前执行,类初始化阶段先执行最顶层父类的静态初始化块,依次向下执行,最后执行当前类的静态初始化块;创建对象时,先调用顶层父类的构造方法,依次向下执行,最后调用本类的构造方法。

题目13

答案:D

  1. 类的静态成员与类直接相关,与对象无关,在一个类的所有实例之间共享同一个静态成员,A正确
  2. 静态成员函数中不能调用非静态成员,C正确
  3. 非静态成员函数中可以调用静态成员,B正确
  4. 常量成员才不能修改,静态成员变量必须初始化,但可以修改(例如我们常利用静态成员变量统计某个函数的调用次数),D错误

题目14

答案:C

效率:StringString(大姐,出生于JDK1.0时代) 不可变字符序列     <StringBuffer(二姐,出生于JDK1.0时代)  线程安全的可变字符序列    <StringBuilder(小妹,出生于JDK1.5时代) 非线程安全的可变字符序列   。Java中的String是一个类,而并非基本数据类型。string是值传入,不是引用传入。 StringBuffer和StringBuilder可以算是双胞胎了,这两者的方法没有很大区别。但在线程安全性方面,StringBuffer允许多线程进行字符操作。 这是因为在源代码中StringBuffer的很多方法都被关键字 synchronized  修饰了,而StringBuilder没有。 StringBuilder的效率比StringBuffer稍高,如果不考虑线程安全,StringBuilder应该是首选。另外,JVM运行程序主要的时间耗费是在创建对象和回收对象上

题目15

答案:C

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

题目16

答案:A

B和C万一还是抽象类或者接口呢?抽象类可以继承抽象类,接口也可以继承接口的啊

题目17

答案:C

依赖注入目的是减少组件之间的耦合度,使开发变得简单。

题目18

答案:B

首先说下String确实是个不可变对象,这个不可变是JDK特有的,写JAVA的人特意针对的

但是这与本题无关,题目中的形参str只是原引用ex.str的一个引用副本,传的是一个副本地址值,这个值与ex.str地址值是不一样的,但是它们同时指向了堆中的对象new String("good"),当你在函数中改变形参也就是地址的副本值也就是这句str="test ok"只是将副本地址指向常量"test ok",并没有改变原ex.str的指向方向,它还是指向对象new String("good")的

char数组与String一样传的也是地址的副本,但是关键是形参ch它没有新的指向 ch[0]只是ch在指向原对象时改变了对象的内部结构, 所以在ex.ch指向与它是同一个对象的情况下当然也会随之变化

题目19

答案:C

instance是java的二元运算符,用来判断他左边的对象是否为右面类(接口,抽象类,父类)的实例

题目20

答案:A

A选项中,抽象类不能实例化,这句是正确的。后面,抽象类不能申明为对象,是错误的。java中,接口和抽象类,都可以声明为对象,只需要在实例化的时候,用一个该接口/抽象类的实现类实例化就行了。即:

interface / abstract class obj = new class();其中,new后面的class是前面接口/抽象类的实现类。

B选项中,接口是一种特殊的抽象类。其中,成员变量都是默认public static final修饰的,方法都是public abstract修饰的,并且除了default和static的以外,只有声明,没有方法体。

C选项中,抽象类的方法,可以是抽象abstract的,也可以是普通的。就算全部是普通方法,也可以用abstract修饰。

D选项中,导出类,及子类,抽象类的子类可以是抽象的,也可以是普通的。

题目21

答案:B

包含抽象方法的类称为抽象类,但并不意味着抽象类中只能有抽象方法,它和普通类一样,同样可以拥有成员变量和普通的成员方法。注意,抽象类和普通类的主要有三点区别:

1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。

2)抽象类不能用来创建对象;

3)如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。

在其他方面,抽象类和普通的类并没有区别。

题目22

答案:D

A、ConcurrentHashMap实际上时 HashTable的升级版,使用segment来分段和管理锁,并不是synchronized;

B、 HashMap实现的接口有:Serializable, Cloneable, Map<K,V> ,没有实现Cllectio

C、Arrays.asList()方法返回的列表是Arrays.ArrayList类型的,并不是java.util.ArrayList;

D、正确

题目23

答案:B

关于抽象类

JDK 1.8以前,抽象类的方法默认访问权限为protected

JDK 1.8时,抽象类的方法默认访问权限变为default

关于接口

JDK 1.8以前,接口中的方法必须是public的

JDK 1.8时,接口中的方法可以是public的,也可以是default的

JDK 1.9时,接口中的方法可以是private的

题目24

答案:C

每个线程输出0,1,2,3,4,’空格, 输出空格前必有线程输出了0-4,所以选C

题目25

答案:D

对于线程而言,start是让线程从new变成runnable。run方法才是执行体的入口。

但是在Thread中,run方法是个空方法,没有具体实现。

Bground继承了Thread,但是没有重写run方法,那么调用run方法肯定是无输出。

题目26

答案:D

Spring Framework是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,Spring中包含的关键特性:
1.强大的基于JavaBeans的采用控制翻转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易。
2.一个可用于从applet到Java EE等不同运行环境的核心Bean工厂。
数据库事务的一般化抽象层,允许声明式(Declarative)事务管理器,简化事务的划分使之与底层无关。
3.内建的针对JTA和单个JDBC数据源的一般化策略,使Spring的事务支持不要求Java EE环境,这与一般的JTA或者EJB CMT相反。
4.JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码),简化了错误处理,大大减少了程序员的编码量。再次利用JDBC时,你无需再写出另一个'终止'(finally)模块。并且面向JDBC的异常与Spring通用数据访问对象(Data Access Object)异常等级相一致。
5.以资源容器,DAO实现和事务策略等形式与Hibernate,JDO和iBATIS SQL Maps集成。利用众多的翻转控制方便特性来全面支持,解决了许多典型的Hibernate集成问题。所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范。
6.灵活的基于核心Spring功能的MVC网页应用程序框架。开发者通过策略接口将拥有对该框架的高度控制,因而该框架将适应于多种呈现(View)技术,例如JSP、FreeMarker、Velocity、Tiles、iText以及POI。值得注意的是,Spring中间层可以轻易地结合于任何基于MVC框架的网页层,例如Struts、WebWork或Tapestry。
7.提供诸如事务管理等服务的面向方面编程框架。
 

另外,Spring并没有提供日志系统,我们需要使用AOP(面向方面编程)的方式,借助Spring与日志系统log4j实现我们自己的日志系统。

题目27

答案:AC

Collection

    -----List

               -----LinkedList    非同步

                ----ArrayList      非同步,实现了可变大小的元素数组

                ----Vector          同步           

    -----Set   不允许有相同的元素

 Map

    -----HashTable        同步,实现一个key--value映射的哈希表,key和value都不允许出现null值

    -----HashMap          非同步,

    -----WeakHashMap   改进的HashMap,实现了“弱引用”,如果一个key不被引用,则被GC回收

注:

List接口中的对象按一定顺序排列,允许重复 
Set接口中的对象没有顺序,但是不允许重复 
Map接口中的对象是key、value的映射关系,key不允许重复

题目28

答案:ABD

在根类Object中包含一下方法: 
 

  1. clone();
  2. equals();
  3. finalize();
  4. getClass();[align=left][/align]
  5. notify(),notifyAll();
  6. hashCode();
  7. toString();
  8. wait();

题目29

答案:CD

构造方法是一种特殊的方法,具有以下特点。

(1)构造方法的方法名必须与类名相同。

(2)构造方法没有返回类型,也不能定义为void,在方法名前面不声明方法类型。

(3)构造方法的主要作用是完成对象的初始化工作,它能够把定义对象时的参数传给对象的域。

(4)一个类可以定义多个构造方法,如果在定义类时没有定义构造方法,则编译系统会自动插入一个无参数的默认构造器,这个构造器不执行任何代码。

(5)构造方法可以重载,以参数的个数,类型,顺序。

题目30

答案:ADE

java中的线程安全是什么:
就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问
什么叫线程安全:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
看过vector源码的同学就会知道他的许多操作都是加了synchronized修饰的比如他的添加元素。(不知道synchronized是什么意思的自行百度!)

1

2

3

public synchronized void addElement(E obj) {  modCount++;

       ensureCapacityHelper(elementCount + 1);  elementData[elementCount++] = obj;

}

而HashMap的所有操作都没有加synchronized修饰 ,不如他的put源码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

public V put(K key, V value) {

     if (key == null)

         return

      putForNullKey(value);

      int hash = hash(key.hashCode());

      int i = indexFor(hash, table.length);

      for(Entry<K,V> e = table[i]; e != null; e = e.next) {

         Object k;

         if (e.hash == hash &&((k = e.key) == key || key.equals(k))) {

             V oldValue = e.value;

             e.value = value;

             e.recordAccess(this);

             return

             oldValue;    }

     }

     modCount++;

     addEntry(hash, key, value, i);

     return null;

 }

再看看ArrayList的add方法的源码

1

2

3

4

5

public boolean add(E e) {

     ensureCapacity(size + 1);  // Increments modCount!!

     elementData[size++] = e;

     return true;

 }

再看StringBuffer的append源码,他是有synchronized修饰的

1

2

3

4

5

public synchronized

  StringBuffer append(String str) {

     super.append(str);

     return this;

 }

最后是Properties的setProperty方法,他是有synchronized修饰的

1

2

3

4

5

public synchronized

  Object setProperty(String key, String value) {

      return

      put(key, value);

 }

由此就可以判断出谁是线程安全的了。

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值