Java小题精炼训练营(篇八)

1、以下不属于构造方法特征的是()

构造方法名与类名相同
构造方法不返回任何值,也没有返回类型
构造方法在创建对象时调用,其他地方不能显式地直接调用
每一个类只能有一个构造方法

D 选项描述错误,一个类可以有多个构造方法,形成重载关系。

D

2、下列哪些语句关于内存回收的说明是正确的? ( )

程序员必须创建一个线程来释放内存
内存回收程序负责释放无用内存
内存回收程序允许程序员直接释放内存
内存回收程序可以在指定的时间释放内存对象

A、JVM一旦启动,就会创建一个守护线程来监测是否需要有对象内存被释放。

C、无法直接释放。

D、不可以指定时间,System.gc(),只是提醒JVM可以进行一次Full GC,但是什么时候真正执行,还是不知道的。

B

Java小题精炼训练营(篇八)_第1张图片

 3、如果要导入一个java.scut.computer的包,叙述正确的是?  ( )

只需在代码中加入“package java.scut.computer;”一个语句,并且必须放在代码非注释的第一行
只需在代码中加入“package java.scut;”一个语句
必须在代码中加入“package java.scut;”和“package java.scut.computer;”两个语句
在代码中,不一定是第一句,只要是类定义前,加入package语句即可

实际上在Java语言规范中,不允许package name以“java”开头,不然会报一个java.lang.SecurityException 的错误。因为假如我们允许包名以java开头,那么我们完全可以编写和jdk标准包下一模一样的类,如Java.lang.Integer。因此在虚拟机进行类或接口解析时可能会发生冲突。一句话总结就是:假如允许包名以java开头,可能会导致命名空间污染的问题。

A

4、对于非运行时异常,程序中一般可不做处理,由java虚拟机自动进行处理。

正确
错误

运行异常,可以通过java虚拟机来自行处理。非运行异常,我们应该捕获或者抛出

B

5、以下代码执行后输出结果为( )

public class ClassTest{
     String str = new String("hello");
     char[] ch = {'a','b','c'};
     public void fun(String str, char ch[]){
     str="world";
     ch[0]='d';
 }
 public static void main(String[] args) {
     ClassTest test1 = new ClassTest();
     test1.fun(test1.str,test1.ch);
     System.out.print(test1.str + " and ");
     System.out.print(test1.ch);
     }
 }
hello and dbc
world and abc
hello and abc
world and dbc

java中都是按栈中的值传递,基本数据类型栈中的值就是实际存储的值,引用类型栈中的值就是指向堆中的地址

1)String和char[ ]都是引用类型,所以在方法中传递的都是指向真实数据的地址

2)假设String str指向的hello的地址为d1,str传递到fun函数中的也是地址d1,成员变量str和fun的形参str不是同一个变量,把fun型中的str赋值为world只是修改了该str指向的地址,该地址由d1更改成了world的地址,并没有改变成员变量str指向的地址及堆中的数据,所以str还是hello。

3)假设char[ ] ch指向的abc的地址是d2,传递到fun函数中的地址也是d2,同上成员变量ch和fun的形参ch不是同一个变量,(1)如果把fun中的ch[0]='d'更改为ch = new ch[3];ch[0]='d',那么成员变量ch的值是没有变化的,还是abc,原理同上String,只是改变了引用ch指向的堆数据的地址,并没有改变成员变量ch指向的地址以及堆中的数据。(2)改变了堆中的数据,所以最终结果编程dbc,此ch只是形参而不是成成员变量ch,如果对ch变化对成员变量ch没有影响,但是ch[i]指向了堆数据的地址,直接修改堆数据,所以成员变量变了。

A

6、下列代码执行结果为()


public static void main(String args[])throws InterruptedException{
	    	Thread t=new Thread(new Runnable() {
				public void run() {
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						throw new RuntimeException(e);
					}
					System.out.print("2");
				}
			});
	    	t.start();
	    	
	    	t.join();
	    	System.out.print("1");
	    }
21
12
可能为12,也可能为21
以上答案都不对

因为子线程的休眠时间太长,因此主线程很有可能在子线程之前结束也就是输出结果是12,但是子线程用了join函数,因此主线程必须等待子线程执行完毕才结束因此输出结果只能是21

thread.Join把指定的线程加入到当前线程,可以将两个交替执行的线程合并为顺序执行的线程。比如在线程B中调用了线程A的Join()方法,直到线程A执行完毕后,才会继续执行线程B。

t.join();      //使调用线程 t 在此之前执行完毕。
t.join(1000);  //等待 t 线程,等待时间是1000毫秒

A

7、下列哪个选项是Java调试器?如果编译器返回程序代码的错误,可以用它对程序进行调试。

java
javadoc
jdb
javaprof

ava,exe是java虚拟机

javadoc.exe用来制作java文档

jdb.exe是java的调试器

javaprof,exe是剖析工具

C

8、下面为true的是

Integer i = 42; 
Long l = 42l; 
Double d = 42.0; 
(i == l)
(i == d)
(l == d)
i.equals(d)
d.equals(l)
i.equals(l)
l.equals(42L)

包装类的“==”运算在不遇到算术运算的情况下不会自动拆箱

包装类的equals()方法不处理数据转型

1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;

         int a = 220;

         Integer b = 220;

        System.out.println(a==b);//true
2、两个Integer类型进行“==”比较, 如果其值在-128至127  ,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。

        Integer c=3;

        Integer h=3;

        Integer e=321;

        Integer f=321;

        System.out.println(c==h);//true

        System.out.println(e==f);//false

3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true。

        Integer a=1;

        Integer b=2;

        Integer c=3;

        System.out.println(c.equals(a+b));//true

4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。 

        int i=1;

        int j = 2;

        Integer c=3;

        System.out.println(c.equals(i+j));//true

G

9、要使某个类能被同一个包中的其他类访问,但不能被这个包以外的类访问,可以( )

让该类不使用任何关键字
使用private关键字
使用protected关键字
使用void关键字

包以外的类包括子类

Java小题精炼训练营(篇八)_第2张图片

外部包 > 子类 > 本包 > 该类内部

public> protected > default > private b.private只能同类中,c.子类不一定和父类同包

A

10、以下JAVA程序的运行结果是什么(  )

public static void main(String[] args) {
    Object o1 = true ? new Integer(1) : new Double(2.0);
    Object o2;
    if (true) {
    o2 = new Integer(1);
    } else {
        o2 = new Double(2.0);
    }
    System.out.print(o1);
    System.out.print(" ");         
    System.out.print(o2);
}
1 1
1.0 1.0
1 1.0
1.0 1
byte b = 1;
char c = 1;
short s = 1;
int i = 1;
 
// 三目,一边为byte另一边为char,结果为int
// 其它情况结果为两边中范围大的。适用包装类型
i = true ? b : c; // int
b = true ? b : b; // byte
s = true ? b : s; // short
 
// 表达式,两边为byte,short,char,结果为int型
// 其它情况结果为两边中范围大的。适用包装类型
i = b + c; // int
i = b + b; // int
i = b + s; // int
 

三元运算符可以自动提升包装类型,而正常的Integer是不可以自动向上转型成Double的

D

11、下列关于系列化和反序列化描述正确的是:

序列化是将数据转为n个 byte序列的过程
反序列化是将n个 byte转换为数据的过程
将类型int转换为4  byte是反序列化过程
将8个字节转换为long类型的数据为序列化过程

把你看得懂的转换为看不懂的,就是序列化。

把你看不懂的转换为看得懂的,就是反序列化。

序列化:将数据结构转换称为二进制数据流或者文本流的过程。序列化后的数据方便在网络上传输和在硬盘上存储。

反序列化:与序列化相反,是将二进制数据流或者文本流转换称为易于处理和阅读的数据结构的过程。

本质其实还是一种协议,一种数据格式,方便数据的存储和传输。

AB

12、实现或继承了Collection接口的是()

Map
List
Vector
Iterator
Set

Java小题精炼训练营(篇八)_第3张图片

 BCE

13、常用的servlet包的名称是?

java.servlet
javax.servlet
servlet.http
javax.servlet.http
JEE5.0中的Servlet相关的就下面这几个包:
javax.servlet
javax.servlet.jsp
java.servlet.jsp.el
java.servlet.jsp.tagext
而最用得多的就是
javax.servlet
javax.servlet.http
这两个包了.

BD

14、以下说法中正确的有?

StringBuilder是 线程不安全的
Java类可以同时用 abstract和final声明
HashMap中,使用 get(key)==null可以 判断这个Hasmap是否包含这个key
volatile关键字不保证对变量操作的原子性

A.StringBuilder线程不安全,StringBuffer线程安全。

B.同时用 abstract和final就会自相矛盾。

C.Hashmap中的value可以之null,get(key)==null有两种情况,一是key不存在,二是该key中存的是null,所以应该使用map.containskey(key)返回的true/false来判断是否存在这个key。

D.volatile关键字有两个作用:

1.并发环境可见性:volatile修饰后的变量能够保证该变量在线程间的可见性,线程进行数据的读写操作时将绕开工作内存(CPU缓存)而直接跟主内存进行数据交互,即线程进行读操作时直接从主内存中读取,写操作时直接将修改后端变量刷新到主内存中,这样就能保证其他线程访问到的数据是最新数据

2.并发环境有序性:通过对volatile变量采取内存屏障(Memory barrier)的方式来防止编译重排序和CPU指令重排序,具体方式是通过在操作volatile变量的指令前后加入内存屏障,来实现happens-before关系,保证在多线程环境下的数据交互不会出现紊乱。

  1. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String

String最慢的原因:

String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。

String:适用于少量的字符串操作的情况

StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况

StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况

AD

15、下面有关 Java ThreadLocal 说法正确的有?

ThreadLocal存放的值是线程封闭,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递
线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收
在Thread类中有一个Map,用于存储每一个线程的变量的副本。
对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式

可以总结为一句话:ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。

提供线程内部的局部变量,在本线程内随时随地可取,隔离其他线程。

ABCD

你可能感兴趣的:(Java小题训练营,java,开发语言,后端)