笔试错题整理(一)

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

在这里插入图片描述解析
就访问来说,可以用public,默认修饰符,而不能用private,因为接口本身就是为了让别的类或接口使用的,用private就没有了意义。
protected也是不可以的,ptotected的访问权限是包内对象以及包外继承该类的包外对象,其实和public意义也就一样了,也就没必要选择protected。
static是用来修饰变量或者方法的,而不修饰类。
(final同样不能修饰接口)

2.java中Hashtable, Vector, TreeSet, LinkedList哪些线程是安全的?

解析
HashTable是线程安全的
Vector是线程安全的
ArrayList、TreeSet和LinkedList都不是线程安全的
之前看到有人总结的线程安全的有:vector,stack,hashtable,enumeration.Properties(Hashtable的子类)
就是“喂,SHE”!

3.if(boolean类型) java if()中放的是布尔类型的值,所以当括号里是赋值语句的时候会报错。

4.final类型的变量一定要初始化,因为final的变量不可更改

在这里插入图片描述不能执行,编译错误

5.执行如下代码段后,变量s1引用的字符串值是( )。

在这里插入图片描述
解析
s1+s2执行的过程中,其实中间还new了一个String类型的新对象,并不会直接在s1对象上操作,所以输出ABCD
因为 String 是不可变类型,是存储在常量字符区的, 所以答案是ABCD

6.下面程序的运行结果:()

在这里插入图片描述解析

在上面main()方法中,并没有创建一个新的线程,只是简单地方法调用而已,如果想要创建线程,需要t.start();创建线程,等待cpu时间片,而run()方法只是简单地方法调用,所以先执行run(),在输出dazhong

主要还是start和run方法的区别,start方法来启动一个线程,此时线程处于就绪状态,并没有运行,等到得到cpu的时间片,就执行run方法,这时候才是线程的执行;而run方法就只是类的一个普通方法,并没有创建新线程,程序中仍然只有主线程这一个线程,程序的执行路径还是只有一条,还是要顺序执行,所以会等待run方法执行完毕后再执行下面的语句,所以选b

7.以下关于集合类ArrayList、LinkedList、HashMap描述错误的是()

在这里插入图片描述
解析
ArrayList的实现是基于数组,LinkedList的实现是基于双向链表。对于随机访问ArrayList要优于LinkedList,ArrayList可以根据下标以O(1)时间复杂度对元素进行随机访问,而LinkedList的每一个元素都依靠地址指针和它后一个元素连接在一起,查找某个元素的时间复杂度是O(N)。对于插入和删除操作,LinkedList要优于ArrayList,因为当元素被添加到LinkedList任意位置的时候,不需要像ArrayList那样重新计算大小或者是更新索引。因此选项C错误。

8. 如下代码的 结果是什么 ?

在这里插入图片描述解析
在执行new Alpha()时,会先执行父类的构造方法,在执行相应的子类的构造方法,所以此处会打印Base,在执行new Base()时,会直接执行Base中无参构造器的代码,再输出Base,所以选B

子类构造器的默认第一行就是super(),默认调用直接父类的无参构造。这也就是一旦一个子类的直接父类没有无参的构造的情况下,必须在自己构造器的第一行显式的指明调用父类或者自己的哪一个构造器。

9.若有下列定义,下列哪个表达式返回false?

String s = “hello”;
String t = “hello”;
char c[] = {‘h’, ‘e’, ‘l’, ‘l’, ‘o’} ;
在这里插入图片描述解析
没有new对象,所以在内存中还是那个字符串 s==t 内存地址是一样的

10.下面代码输出是?

在这里插入图片描述
Ceil d1=-0.0
floor d1=-1.0
解析
二者返回的都是浮点型。
至于为什么是-0.0,而不是0.0,因为源码注释:“If the argument value is less than zero but greater than -1.0, then the result is negative zero ”,翻译过来就是:如果参数是-1.0到0.0之间的数,结果是-0.0。

11.在基本JAVA类型中,如果不明确指定,整数型的默认是什么类型?带小数的默认是什么类型?

整数类型 默认为 int
带小数的默认为 double

12.关于以下程序代码的说明正确的

在这里插入图片描述
解析
答案选D
因为x的 修饰符为 static 所以x为类变量,即对于所有的实例来说,他们访问的x为同一个x,类变量存储在方法区,不属于每个实例的私有,
刚开始x=100
调用hs1.x++ x为101;
调用hs2.x++ x为102;
调用hs1.x++ x为103 (此时hs1指向了一个新的HasStatic实例,但是依然访问的是同一个X)
调用HasStatic.x-- x为102
所以结果为D

如果变量被static修饰,那么该变量属于类,该类的所有对象操作的都是同一个变量。

13.下列正确的 Java 语言标识符是

大写的NULL并不是关键字
1.标识符只能由 a-zA-z、$、0-9、_组成
2.标识符开头不能为数字
3.标识符不能为关键字和保留字

14.关于控制修饰符

在这里插入图片描述
在这里插入图片描述解析
java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏.
在这里插入图片描述
static是类的成员方法,不可覆盖。静态变量或静态方法,在子类中可以写同名的变量和方法,但是仍然各自属于父类或子类,与继承无关,与覆盖(重写)无关;

15.关于多态

在这里插入图片描述
编译错误
解析
多态三要素:1.父子关系。2.子类重写父类方法。3.父类引用指向子类对象。*
父类引用指向子类对象,无法使用子类中的独有方法,编译器会认为父类对象没有该方法进行报错

16.列哪个类的声明是正确的

在这里插入图片描述解析
A只能有final和abstract的一个,因为final是最终类,不能继承,必须可以创建实例,而abstract是抽象类,只能继承,不有实例。冲突了,所以不对。
B是抽象方法,不能有方法体。所以末尾不是{}而是;才对
C中 访问修饰符只能有一个,而且对象没有类型。
D正确,这是抽象类。

17.try括号里有return语句, finally执行顺序

在这里插入图片描述finally 语句块是在 try 或者 catch 中的 return 语句之前执行的。

18.默认RMI采用的是什么通信协议

TCP/IP
RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对象的方式实现开发,在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procedure Call)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模式。针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这是一次远程通讯的***,为远程通信开辟新的里程碑。

RMI的开发步骤

先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote
开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject
通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象
最后客户端查找远程对象,并调用远程方法

19.关于字符串存储

在这里插入图片描述true false
解析
判断a==MESSAGE 同一份字符串常量在内存中只有一份,因此是同一地址,返回true
再次比较(b+c)==MESSAGE 这相当于 new String(b+c)==MESSAGE 这里new了一个String对象,所以返回false

20.ArrayLists和LinkedList的区别

在这里插入图片描述解析
A. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 //正确,这里的所谓动态数组并不是那个“ 有多少元素就申请多少空间 ”的意思,通过查看源码,可以发现,这个动态数组是这样实现的,如果没指定数组大小,则申请默认大小为10的数组,当元素个数增加,数组无法存储时,系统会另个申请一个长度为当前长度1.5倍的数组,然后,把之前的数据拷贝到新建的数组。

B. 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。//正确,ArrayList是数组,所以,直接定位到相应位置取元素,LinkedLIst是链表,所以需要从前往后遍历。

C. 对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。//正确,ArrayList的新增和删除就是数组的新增和删除,LinkedList与链表一致。

D. ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间。//正确,因为ArrayList空间的增长率为1.5倍,所以,最后很可能留下一部分空间是没有用到的,因此,会造成浪费的情况。对于LInkedList的话,由于每个节点都需要额外的指针。
移动指针,准确的来说是迭代器吧

21.jdk1.8中,下面有关java 抽象类和接口的区别,说法错误的是?

在这里插入图片描述java8中接口可以有default方法,所以B是错的
接口可以有default、static方法
现在的Java 8 中可以允许接口中定义默认方法、类方法。

22.关于线程

在这里插入图片描述

  • StringBuilder是 线程不安全的
  • Hashmap中的value可以为null,get(key)==null有两种情况,一是key不存在,二是该key中存的是null,所以应该使用map.containskey(key)返回的true/false来判断是否存在这个key。
  • volatile关键字不保证对变量操作的原子性
    volatile关键字有两个作用: 1.并发环境可见性:volatile修饰后的变量能够保证该变量在线程间的可见性,线程进行数据的读写操作时将绕开工作内存(CPU缓存)而直接跟主内存进行数据交互,即线程进行读操作时直接从主内存中读取,写操作时直接将修改后端变量刷新到主内存中,这样就能保证其他线程访问到的数据是最新数据 2.并发环境有序性:通过对volatile变量采取内存屏障(Memory barrier)的方式来防止编译重排序和CPU指令重排序,具体方式是通过在操作volatile变量的指令前后加入内存屏障,来实现happens-before关系,保证在多线程环境下的数据交互不会出现紊乱。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霍志杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值