牛客选择题练习【五】(32道)(含答案解析)

目录

1.下面程序的输出是:(D)
String x="fmn";
x.toUpperCase();
String y=x.replace('f','F');
y=y+"wxy";
System.out.println(y);

A . FmNwxy
B . fmnwxy
C . wxyfmn
D . Fmnwxy

解析:
toUpperCase():所有在此字符 String使用默认语言环境的规则大写。
replace(char oldChar, char newChar) :返回从替换所有出现的导致一个字符串 oldChar在此字符串 newChar 。

2.以下多线程对int型变量x的操作,哪个不需要进行同步(D)

A . ++x
B . x=y
C . x++
D . x=1

解析:
前三个不是原子操作,最后一个直接赋值,为原子操作。
原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为"不可被中断的一个或一系列操作" 。原子操作就是不可再分的操作。在多线程程序中原子操作是一个

3.关于 JAVA 堆,下面说法错误的是(D)

A . 所有类的实例和数组都是在堆上分配内存的
B . 对象所占的堆内存是由自动内存管理系统回收
C . 堆内存由存活和死亡的对象,空闲碎片区组成
D . 数组是分配在栈中的

解析:
在这里插入图片描述
所以应该为数组的引用存在栈内存中,而数组对象保存在堆里面

4.下面那些情况可以终止当前线程的运行?(B)

A . 当一个优先级高的线程进入就绪状态时
B . 抛出一个异常时
C . 当该线程调用sleep()方法时
D . 当创建一个新线程时

解析:
当一个优先级高的线程进入就绪状态时,它只是有较高的概率能够抢到CPU的执行权,不是一定就能抢到执行权,所以A错
抛出一个例外时,该线程就终止了,所以B正确
当前线程调用sleep()方法或者wait()方法时,只是暂时停止了该线程的运行,不是终止线程,注意题目说的是“终止”,就是完全停止,所以C错误
当创建一个新的线程时,该线程也加入到了抢占cpu执行权的队伍中,但是是否能抢到,并不清楚,和A的思想一样,所以D错误

5.对文件名为Test.java的java代码描述正确的是(C)
class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
     
}
class Employee extends Person {
    public Employee(String nm) {
        super(nm);
        // TODO Auto-generated constructor stub
    }
 
    String empID = "0000";
}
public class Test {
    public static void main(String args[]) {
        Employee e = new Employee("123");
        System.out.println(e.empID);
    }
}

A . 输出:0000
B . 输出:123
C . 编译报错
D . 输出:No name

解析:
父类没有无参的构造函数,所以子类需要在自己的构造函数中显式调用父类的构造函数,添加super(“nm”);否则报错:
Implicit super constructor Person() is undefined. Must explicitly invoke another constructor

6.有关下述Java代码描述正确的选项是(F)。
public class TestClass {
	private static void testMethod(){
		System.out.println("testMethod");
	}
	public static void main(String[] args) {
		((TestClass)null).testMethod();
	}
}

A . 编译不通过
B . 编译通过,运行异常,报NullPointerException
C . 编译通过,运行异常,报IllegalArgumentException
D . 编译通过,运行异常,报NoSuchMethodException
E . 编译通过,运行异常,报Exception
F . 运行正常,输出testMethod

解析:
1)此处是类对方法的调用,不是对象对方法的调用。
2)方法是static静态方法,直接使用"类.方法"即可,因为静态方法使用不依赖对象是否被创建。null可以被强制类型转换成任意类型(不是任意类型对象),于是可以通过它来执行静态方法。
3)非静态的方法用"对象.方法"的方式,必须依赖对象被创建后才能使用,若将testMethod()方法前的static去掉,则会报 空指针异常 。此处也验证了2)的观点

7.在jdk1.5之后,下列 java 程序输出结果为B。
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));

A . true,false
B . true,true
C . false,true
D . false,false
E . 对于不同的环境结果不同
F . 程序无法执行

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

2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false。
3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

8.结构型模式中最体现扩展性的模式是(A)

A . 装饰模式
B . 合成模式
C . 桥接模式
D . 适配器

解析:
链接:https://www.nowcoder.com/questionTerminal/8118573affd743df95045267464089ab?pos=3&mutiTagIds=612&orderByHotValue=1
来源:牛客网
结构型模式是描述如何将类对象结合在一起,形成一个更大的结构,结构模式描述两种不同的东西:类与类的实例。故可以分为类结构模式和对象结构模式。
在GoF设计模式中,结构型模式有:
1.适配器模式 Adapter:
适配器模式是将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。两个成熟的类需要通信,但是接口不同,由于开闭原则,我们不能去修改这两个类的接口,所以就需要一个适配器来完成衔接过程。
2.桥接模式 Bridge:
桥接模式将抽象部分与它的实现部分分离,是它们都可以独立地变化。它很好的支持了开闭原则和组合锯和复用原则。实现系统可能有多角度分类,每一种分类都有可能变化,那么就把这些多角度分离出来让他们独立变化,减少他们之间的耦合。
3.组合模式 Composite:
组合模式将对象组合成树形结构以表示部分-整体的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。
4.装饰模式 Decorator:
装饰模式动态地给一个对象添加一些额外的职责,就增加功能来说,它比生成子类更灵活。也可以这样说,装饰模式把复杂类中的核心职责和装饰功能区分开了,这样既简化了复杂类,有去除了相关类中重复的装饰逻辑。 装饰模式没有通过继承原有类来扩展功能,但却达到了一样的目的,而且比继承更加灵活,所以可以说装饰模式是继承关系的一种替代方案。
5.外观模式 Facade:
外观模式为子系统中的一组接口提供了同意的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
外观模式中,客户对各个具体的子系统是不了解的,所以对这些子系统进行了封装,对外只提供了用户所明白的单一而简单的接口,用户直接使用这个接口就可以完成操作,而不用去理睬具体的过程,而且子系统的变化不会影响到用户,这样就做到了信息隐蔽。
6.享元模式 Flyweight:
享元模式为运用共享技术有效的支持大量细粒度的对象。因为它可以通过共享大幅度地减少单个实例的数目,避免了大量非常相似类的开销。.享元模式是一个类别的多个对象共享这个类别的一个对象,而不是各自再实例化各自的对象。这样就达到了节省内存的目的。
7.***模式 Proxy :
为其他对象提供一种 ***,并由***对象控制对原对象的引用,以间接控制对原对象的访问。

9.下面代码运行结果是(C)
public class Test{
	public int add(int a,int b){
		try {
			return a+b;
		}
		catch (Exception e) {
			System.out.println("catch语句块");
		}
		finally{
			System.out.println("finally语句块");
		}
		return 0;
	}
	public static void main(String argv[]){
		Test test =new Test();
		System.out.println("和是:"+test.add(9, 34));
	}
}

A . catch语句块 和是:43
B . 编译异常
C . finally语句块 和是:43
D . 和是:43 finally语句块

解析:
程序先执行try块中return之前(包括return语句中的表达式运算)的代码;再执行finally块,最后执行try块中的return; 而finally块之后的return语句,因为程序在try块中已经return了,所以不再执行。

10.下列Java代码中的变量a、b、c分别在内存的(C)存储区存放。
class A {
	private String a = “aa”;
	public boolean methodB() {
		String b = “bb”;
		final String c = “cc”;
	}
}

A . 堆区、堆区、堆区
B . 堆区、栈区、堆区
C . 堆区、栈区、栈区
D . 堆区、堆区、栈区
E . 静态区、栈区、堆区
F . 静态区、栈区、栈区

解析:
堆区:只存放类对象,线程共享;
方法区:又叫静态存储区,存放class文件和静态数据,线程共享;
栈区:存放方法局部变量,基本类型变量区、执行环境上下文、操作指令区,线程不共享;

11.以下声明合法的是(B)

A . default String s
B . public final static native int w( )
C . abstract double d
D . abstract final double hyperbolicCosine( )

解析:
链接:https://www.nowcoder.com/questionTerminal/b88182ccc5fc44b2a93e613809c26a3b?source=relative
来源:牛客网
A:变量不能被defalut修饰
B:native修饰方法,native修饰的方法简单来说就是:一个Java方法调用了一个非Java代码的接口。
定义navtive方法时,并不提供实现体,因为其实现体是用非Java语言在外面实现的。native可以和任何修饰符连用,abstract除外。因为native暗示这个方法时有实现体的,而abstract却显式指明了这个方法没有实现体。
C:abstract修饰方法和类
D:final修饰的方法不能被重写。而abstract定义的方法没有实现,必须被子类重写,明显不能一起使用。

12.在使用super 和this关键字时,以下描述正确的是(A)

A . 在子类构造方法中使用super()显示调用父类的构造方法,super()必须写在子类构造方法的第一行,否则编译不通过
B . super()和this()不一定要放在构造方法内第一行
C . this()和super()可以同时出现在一个构造函数中
D . this()和super()可以在static环境中使用,包括static方法和static语句块

解析:
链接:https://www.nowcoder.com/questionTerminal/0514f9318d3547bbbd601128f1a85e63?toCommentId=18086
来源:牛客网
1)调用super()必须写在子类构造方法的第一行,否则编译不通过。每个子类构造方法的第一条语句,都是隐含地调用super(),如果父类没有这种形式的构造函数,那么在编译的时候就会报错。
2)super()和this()类似,区别是,super从子类中调用父类的构造方法,this()在同一类内调用其它方法。
3)super()和this()均需放在构造方法内第一行。
4)尽管可以用this调用一个构造器,但却不能调用两个。
5)this和super不能同时出现在一个构造函数里面,因为this必然会调用其它的构造函数,其它的构造函数必然也会有super语句的存在,所以在同一个构造函数里面有相同的语句,就失去了语句的意义,编译器也不会通过。
6)this()和super()都指的是对象,所以,均不可以在static环境中使用。包括:static变量,static方法,static语句块。
7)从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。

13.下面代码的输出结果是什么?(D)
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);
	}
}

A . 3
B . 123
C . 1
D . 12

解析:
try catch是直接处理,处理完成之后程序继续往下执行,throw则是将异常抛给它的上一级处理,程序便不往下执行了。本题的catch语句块里面,打印完1之后,又抛出了一个RuntimeException,程序并没有处理它,而是直接抛出,因此执行完finally语句块之后,程序终止了。

14.代码片段:关于上面代码片段叙述正确的是(C)
byte b1=1,b2=2,b3,b6;
final byte b4=4,b5=6;
b6=b4+b5;
b3=(b1+b2);
System.out.println(b3+b6);

A . 输出结果:13
B . 语句:b6=b4+b5编译出错
C . 语句:b3=b1+b2编译出错
D . 运行期抛出异常

解析:
没有final修饰的变量相加后会被自动提升为int型,与目标类型byte不相容,需要强制转换(向下转型)为b3 = (byte)(b1+b2)。

15.以下java程序代码,执行后的结果是(B)
public class Test {
	public static void main(String[] args) {
		Object o = new Object() {
		//重写object的equals().返回值为true.
			public boolean equals(Object obj) {
				return true;
			}
		};
		  //无论传入什么值都是true。
		System.out.println(o.equals("Fred"));
	}
}

A Fred
B true
C 编译错误
D 运行时抛出异常

16.执行以下程序后的输出结果是(D)
public class Test {
	public static void main(String[] args) {
		StringBuffer a = new StringBuffer("A");
		StringBuffer b = new StringBuffer("B");
		operator(a, b);
		System.out.println(a + "," + b);
	}
	public static void operator(StringBuffer x, StringBuffer y) {
		x.append(y); y = x;
	}
}

A . A,A
B . A,B
C . B,B
D . AB,B

解析:
在这里插入图片描述

17.下面所示的java代码,运行时,会产生(D)类型的异常
int Arry_a[] = new int[10];
System.out.println(Arry_a[10]);

A . ArithmeticException
B . NullPointException
C . IOException
D . ArrayIndexOutOfBoundsException

解析:
数组长度为10,则下标为Arry_a[0]~Arry_a[9]

18.下面哪个标识符是合法的?(D)

A . “9HelloWorld”
B . “_Hello World”
C . “Hello*World”
D . “Hello$World”

解析:
标识符是以字母开头的字母数字序列:数字是指0~9,字母指大小写英文字母、下划线(_)和美元符号($),也可以是Unicode字符集中的字符,如汉字;字母、数字等字符的任意组合,不能包含+、- 等字符;不能使用关键字;大小写敏感
由此可以看出: A:不可以数字开头B:用下划线开头符合,但是中间有空格
C:不能包含“
”排除ABC,答案即是D。

19.以下描述正确的是(B)

A . CallableStatement是PreparedStatement的父接口
B . PreparedStatement是CallableStatement的父接口
C . CallableStatement是Statement的父接口
D . PreparedStatement是Statement的父接口

解析:
public interface CallableStatement extends PreparedStatement
public interface PreparedStatement extends Statement

20.下列关于容器集合类的说法正确的是?(C)

A . LinkedList继承自List
B . AbstractSet继承自Set
C . HashSet继承自AbstractSet
D . WeakMap继承自HashMap

解析:
A选项linkedlist类是实现了List接口,而不是继承
B选项AbstractSet类实现Set接口
C选项HashSet继承 AbstractSet类,同时也实现set

21.ArrayList list = new ArrayList(20);中的list扩充几次(A)

A . 0
B . 1
C . 2
D . 3

解析:
本题需要注意的是:调用的是带参的构造方法。
链接:
ArrayList list=new ArrayList(); 这种是默认创建大小为10的数组,每次扩容大小为1.5倍。
ArrayList list=new ArrayList(20); 这种是指定数组大小的创建,没有扩充

22.下面的方法,当输入为2的时候返回值是多少?(D)
public static int getValue(int i) {
	int result = 0;
	switch (i) {
	case 1:
		result = result + i;
	case 2:
		result = result + i * 2;
	case 3:
		result = result + i * 3;
	}
	return result;
}

A . 0
B . 2
C . 4
D . 10

解析:
switch结构中没有break的话,匹配完不会跳出,会继续匹配下一个case直到整个结构结束所以:case 2结束时result=4;case3结束时result=10;return 10

23.下列关于Java并发的说法中正确的是()

A . CopyOnWriteArrayList适用于写多读少的并发场景
B . ReadWriteLock适用于读多写少的并发场景
C . ConcurrentHashMap的写操作不需要加锁,读操作需要加锁
D . 只要在定义int类型的成员变量i的时候加上volatile关键字,那么多线程并发执行i++这样的操作的时候就是线程安全的了

解析:
链接:https://www.nowcoder.com/questionTerminal/68c6c63ad0d444f481552a81fd769f2b
来源:牛客网
A,CopyOnWriteArrayList适用于写少读多的并发场景
B,ReadWriteLock即为读写锁,他要求写与写之间互斥,读与写之间互斥,读与读之间可以并发执行。在读多写少的情况下可以提高效率
C,ConcurrentHashMap是同步的HashMap,读写都加锁
D,volatile只保证多线程操作的可见性,不保证原子性

24.以下方法,哪个不是对add方法的重载?(B)
public class Test
{
	public void add( int x,int y,int z){}
}

A . public int add(int x,int y,float z){return 0;}
B . public int add(int x,int y,int z){return 0;}
C . public void add(int x,int y){}
D . 以上都不是

解析:
方法重载是指在一个类中定义多个同名的方法,但要求每个方法具有不同的参数的类型或参数的个数。
原则如下:
(1)方法名一定要相同。
(2)方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体。
如果参数个数不同,就不管它的参数类型。
如果参数个数相同,那么参数的类型或者参数的顺序必须不同。
(3)方法的返回类型、修饰符可以相同,也可不同。

25.在Java中,关于HashMap类的描述,以下错误的是(B)

A . HashMap使用键/值得形式保存数据
B . HashMap 能够保证其中元素的顺序
C . HashMap允许将null用作键
D . HashMap允许将null用作值

解析:
HashMap不能保证元素的顺序,而LinkedHashMap可以保持数据的插入顺序,TreeMap可以按照键值进行排序(可自定比较器)

26.在Java中,( D)类提供定位本地文件系统,对文件或目录及其属性进行基本操作

A . FileInputStream
B . FileReader
C . FileWriter
D . File

解析:
链接:https://www.nowcoder.com/questionTerminal/7b5c4ba51d52448a8aa89f69b0b99f75
来源:牛客网
FileInputStream提供了对文件的字节读取;FileReader提供了对文件的字符读取;FileWriter提供了对文件的字符写入;File提供了对文件的基本操作,包括对删除,文件路径等操作。

27.volatile关键字的说法错误的是(A)

A . 能保证线程安全
B . volatile关键字用在多线程同步中,可保证读取的可见性
C . JVM保证从主内存加载到线程工作内存的值是最新的
D . volatile能禁止进行指令重排序

解析:
volatile用于限定变量只能从内存中读取,保证对所有线程而言,值都是一致的。但是volatile不能保证原子性,也就不能保证线程安全。

28.java接口的方法修饰符可以为?(忽略内部接口)(D)

A . private
B . protected
C . final
D . abstract

解析:
作者:秋实先生
链接:https://www.nowcoder.com/questionTerminal/4b12e28267ad4e0ab8cde2c4a7c93a8d
来源:牛客网
接口是一种特殊的抽象类,接口中的方法全部是抽象方法(但其前的abstract可以省略),所以抽象类中的抽象方法不能用的访问修饰符这里也不能用。而且protected访问修饰符也不能使用,因为接口可以让所有的类去 实现(非继承) ,不只是其子类,但是要用public去修饰。接口可以去继承一个已有的接口。

29.下列程序的运行结果(A)
public void getCustomerInfo() {
	try {
		// do something that may cause an Exception
	} catch (java.io.FileNotFoundException ex) {
		System.out.print("FileNotFoundException!");
	} catch (java.io.IOException ex) {
		System.out.print("IOException!");
	} catch (java.lang.Exception ex) {
		System.out.print("Exception!");
	}
}

A . IOException!
B . IOException!Exception!
C . FileNotFoundException!IOException!
D . FileNotFoundException!IOException!Exception!

解析:
链接:https://www.nowcoder.com/questionTerminal/67a38ecf68be4559a88789f703845f8f?toCommentId=2316298
来源:牛客网
题目说抛出一个异常,但是没说具体是什么异常,那么就要分情况了:
1.如果抛出一个FileNotFoundException(或其子类),那么最终结果就打印FileNotFoundException
2.如果抛出一个IOException,或者IOException的子类(不包含FileNotFoundException及其子类),那么最终结果就打印IOException
3.如果抛出一个Exception(不包含IOException及其子类),那么最终结果就打印Exception.
以上,所以3个皆有可能.但是,不管是哪一种情况,只会输出其中之一。
从答案上来看,B,C,D的输出情况是不存在的。因此选A

30.下列哪种异常是检查型异常,需要在编写程序时声明?(C)

A NullPointerException
B ClassCastException
C FileNotFoundException
D IndexOutOfBoundsException

解析:
在这里插入图片描述

31.选项中哪一行代码可以添加 到题目中而不产生编译错误?(A)
public abstract class MyClass {
	public int constInt = 5;
		//add code here
	public void method() {
	}
}

A public abstract void method(int a);
B constInt = constInt + 5;
C public int method();
D public abstract void anotherMethod() {}

解析:
链接:https://www.nowcoder.com/questionTerminal/6453443b28bc49a6b25a81c0e07611ea?toCommentId=17362
来源:牛客网
A是抽象方法,抽象类可以包含抽象方法,也可以不包含,虽然A 方法名是method,与题目中的方法同名,但是参数不同,是重载方法
B 在类中不能constInt = constInt + 5; 方法中可以
C 的方法名与题目中的方法名相同,返回值不能作为重载的依据
D 抽象方法没有方法体

32.如下代码,执行test()函数后,屏幕打印结果为(D)
public class Test2
{
	public void add(Byte b)
	{
		b = b++;
	}
	public void test()
	{
		Byte a = 127;
		Byte b = 127;
		add(++a);
		System.out.print(a + " ");
		add(b);
		System.out.print(b + "");
	}
}

A 127 127
B 128 127
C 129 128
D 以上都不对

解析:
链接:https://www.nowcoder.com/questionTerminal/1bab09264a1c4528aa60ee9bca5f0976?orderByHotValue=0&pos=2&mutiTagIds=570
来源:牛客网
public void add(Byte b){ b=b++; } 这里涉及java的自动装包/自动拆包(AutoBoxing/UnBoxing) Byte的首字母为大写,是类,看似是引用传递,但是在add函数内实现++操作,会自动拆包成byte值传递类型,所以add函数还是不能实现自增功能。也就是说add函数只是个摆设,没有任何作用。 Byte类型值大小为-128~127之间。 add(++a);这里++a会越界,a的值变为-128 add(b); 前面说了,add不起任何作用,b还是127

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值