Java教程

Java每日刷题(20201.7.15)

本文主要是介绍Java每日刷题(20201.7.15),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java每日刷题(20201.7.15)

内容全部来自牛客网Java练习模块的内容,答案解析部分来自牛友解答,如有侵权,联系删除,谢谢

1、下面程序段执行完成后,则变量sum的值是( B )。

int  b[][]={{1}, {2,2}, {2,2,2}};
int sum=0;
for(int i=0;i<b.length;i++) {
    for(int j=0;j<b[i].length;j++) {
        sum+=b[i][j];
    }
}

A、32
B、11
C、2
D、3

解析:

本题比较基础,b.length=3,由题目即可得知这是二维数组的遍历相加,将数组中元素相加即可得到结果为11

2、代码String str=”123456a”;int i=Integer.parseInt(str);会报异常的是( B )

A、java.lang.NullPoninterException

B、java.lang.NumberFormatException

C、java.lang.RuntimeException

D、java.lang.ArrayindexOutOfBoundsException

解析:

非纯数字的字符串转化为Integer对象会报数字格式异常。

  • java.lang.NullPoninterException:变量未被初始化、对象未赋值、对象为空(俗称的空指针异常)
  • java.lang.NumberFormatException:数据格式转换失败(integer的取值范围为:-127-128,超过范围都会访问false)
  • java.lang.RuntimeException:运行时异常
  • java.lang.ArrayindexOutOfBoundsException:数组下标越界

3、以下二维数组声明合法的是( C )

A、char[2] [3] ch = new char[] []

B、char[2] [] ch = new char[] [3]

C、char[] [] ch = new char[2] [3]

D、char[] [] ch = new [2]char[3]

解析:

创建二维数组的方式和一维数组方式相同

  1. char[] [] ch = new char[2] [3]
  2. char[] [] ch = new char[] []{“a,b”,“a,b,c”}
  3. char[] [] ch = {“a,b”,“a,b,c”}

4、下面的代码运行的结果是:( B )

class B extends Object {
    static {
        System.out.println("Load B");
    }
    public B() {
        System.out.println("Create B");
    }
}
class A extends B {
    static {
        System.out.println("Load A");
    }
    public A() {
        System.out.println("Create A");
    }
}

public class Testclass {
    public static void main(String[] args) {
        new A();
    }
}

A、Load B ->Create B->Load A -> Create A

B、Load B -> Load A ->Create B ->Create A

C、Load B -> Create B-> Create A -> Load A

D、Create B ->Create A ->Load B ->Load A

解析:

执行顺序:

父类静态代码块-》子类静态代码块-》父类构造代码块-》父类构造函数-》子类构造代码块-》子类构造函数

5、String str1 = “abc”,“abc”分配在内存哪个区域? ( C )

A、堆

B、栈

C、字符串常量区

D、寄存器

解析:

栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中

堆:存放用new产生的数据

静态域:存放在对象中用static定义的静态成员

常量池:存放常量

非RAM存储:硬盘等永久存储空间

6、执行下列代码的输出结果为( C )

public class Demo{
    public static void main(String args[]){
       int num = 10;
       System.out.println(test(num));
    }
	public static int test(int b){
		try{
			b += 10;
        	return b;
        } catch(RuntimeException e){
        } catch(Exception e2) {
        } finally{
        	b += 10;
        	return b;
        }
	}
}

A、10

B、20

C、30

D、40

解析:

**重点:**如果finally块中有return语句的话,它将覆盖掉函数中其他return语句

执行顺序:

  1. try代码块中,得b=20
  2. 进入finally代码块,得b=30,并直接在 finally 代码块中return

7、以下代码在编译和运行过程中会出现什么情况 ( A )

public class TestDemo{
	private int count;
	public static void main(String[] args) {
		TestDemo test=new TestDemo(88);
		System.out.println(test.count);
	}
	 TestDemo(int a) {
		 count=a;
	}
}

A、编译运行通过,输出结果是88

B、编译时错误,count变量定义的是私有变量

C、编译时错误,System.out.println方法被调用时test没有被初始化

D、编译和执行时没有输出结果

解析:

通过实例化可以调用本类的私有属性,但是不能直接调用(system.out.println(conut)),因为主函数为静态函数,而属性为非静态。

此题中使用实例化调用了本类中的私有属性,能够正常编译和输出

8、以下说法错误的是( D )

A、虚拟机中没有泛型,只有普通类和普通方法

B、所有泛型类的类型参数在编译时都会被擦除

C、创建泛型对象时请指明类型,让编译器尽早的做参数检查

D、泛型的类型擦除机制意味着不能在运行时动态获取List中T的实际类型

解析:

  1. 创建泛型对象的时候,一定要指出类型变量T的具体类型。争取让编译器检查出错误,而不是留给JVM运行的时候抛出类不匹配的异常。
  2. JVM如何理解泛型概念 —— 类型擦除。事实上,JVM并不知道泛型,所有的泛型在编译阶段就已经被处理成了普通类和方法。 处理方法很简单,我们叫做类型变量T的擦除(erased) 。

总结:泛型代码与JVM

  • 虚拟机中没有泛型,只有普通类和方法。
  • 在编译阶段,所有泛型类的类型参数都会被Object或者它们的限定边界来替换。(类型擦除)
  • 在继承泛型类型的时候,桥方法的合成是为了避免类型变量擦除所带来的多态灾难。 无论我们如何定义一个泛型类型,相应的都会有一个原始类型被自动提供。原始类型的名字就是擦除类型参数的泛型类型的名字。

9、下面这条语句一共创建了多少个对象:String s=“welcome”+“to”+360; (A)

A、1
B、2
C、3
D、4

解析:

String s=“welcome”+“to”+360,这条语句中,程序在编译的时候会自动优化将三个字段自动合成一个长字段,所以此处只创建了一个对象。

10、在Java中,对于不再使用的内存资源,如调用完成的方法,“垃圾回收器”会自动将其释放。( B )

A、正确

B、错误

解析:

方法调用时,会创建栈帧在栈中,调用完是程序自动出栈释放,而不是gc释放。

JVM 内存可简单分为三个区:

1、堆区(heap):用于存放所有对象,是线程共享的(注:数组也属于对象)

2、栈区(stack):用于存放基本数据类型的数据和对象的引用,是线程私有的(分为:虚拟机栈和本地方法栈)

3、方法区(method):用于存放类信息、常量、静态变量、编译后的字节码等,是线程共享的(也被称为非堆,即 None-Heap)

Java 的垃圾回收器(GC)主要针对堆区

11、java8中,下面哪个类用到了解决哈希冲突的开放定址法 ( C )

A、LinkedHashSet

B、HashMap

C、ThreadLocal

D、TreeMap

解析:

threadlocalmap使用开放定址法解决haah冲突,hashmap使用链地址法解决hash冲突

12、下列代码执行后的输出结果为( D )

public class Test {
    public static void main(String[] args) {
    	System.out.println(test());
    }
    private static int test() {
    	int temp = 1;
    	try {
    		System.out.println(temp);
    		return ++temp;
    	} catch(Exception e) {
    		System.out.println(temp);
    		return ++temp;
    	} finally {
            ++temp;
            System.out.println(temp);
        }
    }
}

A、1,2,2

B、1,2,3

C、1,3,3

D、1,3,2

解析:

执行顺序:

  1. temp=1 传入try代码块中,输出1
  2. 在 try代码块中,进入return语句,现将返回结果temp=2放入临时空间
  3. 执行 finally代码块中代码,输出temp=3
  4. finally中没有返回语句,重回try代码块中执行返回,返回临时空间中的temp值,即temp=2

13、(不定项)关于Java以下描述正确的有( C D )

A、Class类是Object类的超类

B、Object类是一个final类

C、String类是一个final类

D、Class类可以装载其它类

解析:

A、超类也称基类和父类,Class类应该是Object类的子类,即派生类

B、Object类不是final类,因为被final修饰的类不能被继承,上面说了Class类继承了Object类

C、String类是final类,因为String类不能被更改

D、Class类可以装载其他类,装载意思也就是加载,主要体现在Class.forName()这个方法上

14、(不定项)关于下面这段代码,以下哪些说法是正确的(A D)

public static void main(String[] args) {
    String a = new String("myString");
    String b = "myString";
    String c = "my" + "String";
    String d = c;
    System.out.print(a == b);
    System.out.print(a == c);
    System.out.print(b == c);
    System.out.print(b == d);
}

A、System.out.print(a == b)打印出来的是false

B、System.out.print(a == c)打印出来的是true

C、System.out.print(b == c)打印出来的是false

D、System.out.print(b == d)打印出来的是true

解析:

对象a是使用new方法生成,指向堆内存

对象b、c是直接使用常量生成,指向常量池同一地址

对象d是c的副本,也指向同一地址

15、在J2EE中,使用Servlet过滤器,需要在web.xml中配置(A B)元素

A、< filter>

B、< filter-mapping>

C、< servlet-filter>

D、< filter-config>

解析:

Servlet过滤器的配置包括两部分:

第一部分是过滤器在Web应用中的定义,由元素表示,包括和两个必需的子元素

第二部分是过滤器映射的定义,由元素表示,可以将一个过滤器映射到一个或者多个Servlet或JSP文件,也可以采用url-pattern将过滤器映射到任意特征的URL。

16、jdk1.8版本之前的前提下,接口和抽象类描述正确的有( B C )

A、抽象类没有构造函数
B、接口没有构造函数
C、抽象类不允许多继承
D、接口中的方法可以有方法体

解析:

A、抽象类可以有构造函数,只是不能实例化

D、jdk1.8后接口中用static或default修饰的方法可以有方法体

17、对于线程局部存储TLS(thread local storage),以下表述正确的是(A B D)

A、解决多线程中的对同一变量的访问冲突的一种技术

B、TLS会为每一个线程维护一个和该线程绑定的变量的副本

C、每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了

D、Java平台的java.lang.ThreadLocal是TLS技术的一种实现

解析:

ThreadLocal可以给一个初始值,而每个线程都会获得这个初始化值的一个副本,这样才能保证不同的线程都有一份拷贝。ThreadLocal 不是用于解决共享变量的问题的,不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制.

同一全局变量或者静态变量每个线程访问的是同一变量,多个线程同时访存同一全局变量或者静态变量时会导致冲突,尤其是多个线程同时需要修改这一变量时,通过TLS机制,为每一个使用该全局变量的线程都提供一个变量值的副本,每一个线程均可以独立地改变自己的副本,而不会和其它线程的副本冲突。

如果是静态变量是共享的话,那必须同步,否则尽管有副本,还是会出错,故C错

18、下面有关forward和redirect的描述,正确的是( B C D ) ?

A、forward是服务器将控制权转交给另外一个内部服务器对象,由新的对象来全权负责响应用户的请求

B、执行forward时,浏览器不知道服务器发送的内容是从何处来,浏览器地址栏中还是原来的地址

C、执行redirect时,服务器端告诉浏览器重新去请求地址

D、forward是内部重定向,redirect是外部重定向

E、redirect默认将产生301 Permanently moved的HTTP响应

解析:

A、服务器会直接访问目标地址的URL,不会把控制权转交

19、下面哪些类可以被继承? Java.lang.Thread、java.lang.Number、java.lang.Double、java.lang.Math、 java.lang.ClassLoader (A B E)

A、Thread

B、Number

C、Double

D、Math

E、ClassLoader

解析:

A,Thread可以被继承,用于创建新的线程

B,Number类可以被继承,Integer,Float,Double等都继承自Number类

C,Double类的声明为

public final class Doubleextends Numberimplements Comparable<Double>

final生明的类不能被继承

D,Math类的声明为

public final class Mathextends Object

不能被继承

E,ClassLoader可以被继承,用户可以自定义类加载器

java.lang包中不能被继承的类:

public final class Byte

public final class Character

public static final class Character.UnicodeBlock

public final class Class

public final class Compile

public final class Double

public final class Float

public final class Integer

public final class Long

public final class Math

public final class ProcessBuilder

public final class RuntimePermission

public final class Short

public final class StackTraceElement

public final class StrictMath

public final class String

public final class StringBuffer

public final class StringBuilder

public final class System

public final class Void

这篇关于Java每日刷题(20201.7.15)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!