牛客刷题错题(一)——Java基础

1. 在java中,无论在何处调用,使用静态属性必须以类名做前缀

 正确答案: 错误   

分析:1. 如果是本类使用,可以直接就用静态变量名。

          2. 如果是其他类使用,可以使用类名来调用,也可以创建一个实例对象来调用。

          3. 如果静态变量所在的类是静态类,那么不管在本类里或者在其他外部类,都可以直接使用静态变量名。

 

 

2. 下面有关JVM内存,说法错误的是?

A. 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的

B. 虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的

​C. 方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据,是线程隔离的


D. 原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的

 正确答案: C   你的答案: D (错误)

分析:

大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈,也有翻译成JAVA 方法栈的),Native Method Stack  ( 本地方法栈 ),其中Method Area 和  Heap 是线程共享的  ,VM Stack,Native Method Stack  和Program Counter Register  是非线程共享的。为什么分为 线程共享和非线程共享的呢?请继续往下看。

首先我们熟悉一下一个一般性的 Java 程序的工作过程。一个 Java 源程序文件,会被编译为字节码文件(以 class 为扩展名),每个java程序都需要运行在自己的JVM上,然后告知 JVM 程序的运行入口,再被 JVM 通过字节码解释器加载运行。那么程序开始运行后,都是如何涉及到各内存区域的呢?

概括地说来,JVM初始运行的时候都会分配好 Method Area(方法区) 和Heap(堆) ,而JVM 每遇到一个线程,就为其分配一个 Program Counter Register(程序计数器) ,   VM Stack(虚拟机栈)和Native Method Stack  (本地方法栈), 当线程终止时,三者(虚拟机栈,本地方法栈和程序计数器)所占用的内存空间也会被释放掉。这也是为什么我把内存区域分为线程共享和非线程共享的原因,非线程共享的那三个区域的生命周期与所属线程相同,而线程共享的区域与JAVA程序运行的生命周期相同,所以这也是系统垃圾回收的场所只发生在线程共享的区域(实际上对大部分虚拟机来说知发生在Heap上)的原因。

 

3. 以下代码将打印出

1

2

3

4

 public static void main (String[] args) { 

    String classFile = "com.jd.". replaceAll(".""/") + "MyClass.class";

    System.out.println(classFile);

}

A. com. jd     B. com/jd/MyClass.class     C. ///MyClass.class     D. com.jd.MyClass
 

 正确答案: C   你的答案: B (错误)

分析: 由于replaceAll方法的第一个参数是一个正则表达式,而"."在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成"/"。如果想替换的只是".",那么久要写成"\\."。

 

4. 下列关于while循环、do-while循环和for循环说法错误的是

A. while循环先执行条件判断,do-while循环执行循环体    

B. do-while循环结束的条件是关键字while后的条件表达式成立

C. for循环结构中的3个表达式缺一不可                    

D. while循环能够实现的操作,for循环也能实现
 

 正确答案: B C   你的答案: C (错误)

分析:

A.while只有在满足条件时执行  而do-while会先执行一次 再看条件是否满足  满足再次循环 不满足跳出

B.也就错了 应该是    do-while循环结束的条件是关键字while后的条件表达式不成立

C. 三个都为空也是可以的 最简洁形式:for(;;;)

D. 我们使用while 就是为了他的循环次数的不一定的 而for循环一般限定了循环次数


5. 下面有关 JAVA 异常类的描述,说法正确的有()

A. 异常的继承结构:基类为 Throwable,Error 和 Exception 。实现 Throwable, RuntimeException 和 IOException 等继承 Exception

B. 非 RuntimeException 一般是外部错误(不考虑Error的情况下),其可以在当前类被 try{}catch 语句块所捕获

C. Error 类体系描述了 Java 运行系统中的内部错误以及资源耗尽的情形,Error 不需要捕捉

D. RuntimeException 体系包括错误的类型转换、数组越界访问和试图访问空指针等等,必须被 try{}catch 语句块所捕获

 正确答案: A B C   你的答案: A B D (错误)

分析:

牛客刷题错题(一)——Java基础_第1张图片


都是Throwable的子类:

1.Exception(异常) :是程序本身可以处理的异常。

2.Error(错误): 是程序无法处理的错误。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,一般不需要程序处理。

3.检查异常(编译器要求必须处置的异常) :  除了Error,RuntimeException及其子类以外,其他的Exception类及其子类都属于可查异常。这种异常的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。

4.非检查异常(编译器不要求处置的异常): 包括运行时异常(RuntimeException与其子类)和错误(Error)。
 
 
6. 下面有关java实例变量,局部变量,类变量和final变量的说法,错误的是?

​A. 实例变量指的是类中定义的变量,即成员变量,如果没有初始化,会有默认值。

B. 局部变量指的是在方法中定义的变量,如果没有初始化,会有默认值

C. 类变量指的是用static修饰的属性

D. final变量指的是用final 修饰的变量

  正确答案: B   你的答案: C (错误)

分析:

定义在类中的变量是类的成员变量,可以不进行初始化,Java会自动进行初始化,如果是引用类型默认初始化为null,如果是基本类型例如int则会默认初始化为0

局部变量是定义在方法中的变量,必须要进行初始化,否则不同通过编译

被static关键字修饰的变量是静态的,静态变量随着类的加载而加载,所以也被称为类变量

被final修饰的变量是常量

 

7. 对于同一类中的两个方法 , 在判断它们是不是重载方法时 , 肯定不考虑( )

A. 参数个数    B. 参数类型    C. 返回值类型    D. 参数顺序

 正确答案: C   你的答案: D (错误)

重载:类中可以创建多个方法,它们具有相同的名字,但具 有不同的参数和不同的定义。调用方法时通过传递 给它们的不同参数个数和参数类型 给它们的不同参数个数和参数类型 给它们的不同参数个数和参数类型 来决定具体使用哪个方法 ,  这就是多态性。

重写 Overriding 是父类与子类之间多态性的一种表现, 在子类中定义某方法与其父类有相同的名称和参数。

重载 Overloading 是一个类中多态性 的一种表现。

重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同 也可以不相同。 无法以 返回型别 作为重载函数的区分标准。而且编译的时候只有返回值不同,会报错。及使不报错,运行时无法区分调用哪个方法

 

8. 关于AWT和Swing说法正确的是? 

A. Swing是AWT的子类                                             B. AWT在不同操作系统中显示相同的风格

C. AWT不支持事件类型,Swing支持事件模型         D. Swing在不同的操作系统中显示相同的风格

 正确答案: D   你的答案: C (错误)

分析:

AWT和Swing都是java中的包。

AWT(Abstract Window Toolkit):抽象窗口工具包,早期编写图形界面应用程序的包。

Swing :为解决 AWT 存在的问题而新开发的图形界面包。Swing是对AWT的改良和扩展。    

AWT和Swing的实现原理不同:
       AWT的图形函数与操作系统提供的图形函数有着一一对应的关系。也就是说,当我们利用 AWT构件图形用户界面的时候,实际上是在利用操作系统的图形库。
       不同的操作系统其图形库的功能可能不一样,在一个平台上存在的功能在另外一个平台上则可能不存在。为了实现Java语言所宣称的"一次编译,到处运行"的概念,AWT不得不通过牺牲功能来实现平台无关性。因此,AWT 的图形功能是各操作系统图形功能的“交集”。
        因为AWT是依靠本地方法来实现功能的,所以AWT控件称为“重量级控件”。 

       而Swing ,不仅提供了AWT 的所有功能,还用纯粹的Java代码对AWT的功能进行了大幅度的扩充。
       例如:并不是所有的操作系统都提供了对树形控件的支持, Swing则利用了AWT中所提供的基本作图方法模拟了一个树形控件。
       由于 Swing是用纯粹的Java代码来实现的,因此Swing控件在各平台通用。
       因为Swing不使用本地方法,故Swing控件称为“轻量级控件”。 

       AWT和Swing之间的区别:
       1)AWT 是基于本地方法的C/C++程序,其运行速度比较快;Swing是基于AWT的Java程序,其运行速度比较慢。
       2)AWT的控件在不同的平台可能表现不同,而Swing在所有平台表现一致。

       在实际应用中,应该使用AWT还是Swing取决于应用程序所部署的平台类型。例如:
       1)对于一个嵌入式应用,目标平台的硬件资源往往非常有限,而应用程序的运行速度又是项目中至关重要的因素。在这种矛盾的情况下,简单而高效的AWT当然成了嵌入式Java的第一选择。
       2)在普通的基于PC或者是工作站的标准Java应用中,硬件资源对应用程序所造成的限制往往不是项目中的关键因素。所以在标准版的Java中则提倡使用Swing, 也就是通过牺牲速度来实现应用程序的功能。

 

9. 以下关于JAVA语言异常处理描述正确的有?

A. throw关键字可以在方法上声明该方法要抛出的异常。

B. throws用于抛出异常对象。

C. try是用于检测被包住的语句块是否出现异常,如果有异常,则抛出异常,并执行catch语句。

D. finally语句块是不管有没有出现异常都要执行的内容。

E. 在try块中不可以抛出异常

 正确答案: C D   你的答案: A B C D (错误)

分析:

Java语言中的异常处理包括声明异常、抛出异常、捕获异常和处理异常四个环节。

throw用于抛出异常。

throws关键字可以在方法上声明该方法要抛出的异常,然后在方法内部通过throw抛出异常对象。

try是用于检测被包住的语句块是否出现异常,如果有异常,则抛出异常,并执行catch语句。

cacth用于捕获从try中抛出的异常并作出处理。

finally语句块是不管有没有出现异常都要执行的内容。

 

10. Java 语言用以下哪个类来把基本类型数据封装为对象()

A. 包装类    B. Class    C. Math    D. Object

 正确答案: A   你的答案: D (错误)

 分析:

java的数据类型分为两大类:基本类型和引用类型;

基本类型只能保存一些常量数据,引用类型除了可以保存数据,还能提供操作这些数据的功能;

为了操作基本类型的数据,java也对它们进行了封装, 得到八个类,就是java中的基本类型的封装类;他们分别是:

八种基本类型: byte short    int   long float double    char    boolean

对应的包装类 : Byte Short Integer Long Float Double Character Boolean

 

 

11. 以下代码执行后输出结果为( )

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);
     }
 }

A. hello and dbc      B. world and abc    C. hello and abc    D. world and dbc

 正确答案: A   你的答案: D (错误)

分析:

(1)基本数据类型传值,对形参的修改不会影响实参;
(2)引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象;
(3)String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。

传值是少数,基本数据类型和String是值传递。
传对象的都是传引用。
八大基本类型 short,int,long,float,double,boolean,char
四大引用类型 数组,类,接口,字符串

 

12. 下面有关SPRING的事务传播特性,说法错误的是?

A. PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行

B. PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就抛出异常

C. PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起

D. PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚

 正确答案: B   你的答案: D (错误)

分析:

 传播行为定义了被调用方法的事务边界。 

传播行为

意义

PROPERGATION_MANDATORY

表示方法必须运行在一个事务中,如果当前事务不存在,就抛出异常

PROPAGATION_NESTED

表示如果当前事务存在,则方法应该运行在一个嵌套事务中。否则,它看起来和 PROPAGATION_REQUIRED 看起来没什么俩样

PROPAGATION_NEVER

表示方法不能运行在一个事务中,否则抛出异常

PROPAGATION_NOT_SUPPORTED

表示方法不能运行在一个事务中,如果当前存在一个事务,则该方法将被挂起

PROPAGATION_REQUIRED

表示当前方法必须运行在一个事务中,如果当前存在一个事务,那么该方法运行在这个事务中,否则,将创建一个新的事务

PROPAGATION_REQUIRES_NEW

表示当前方法必须运行在自己的事务中,如果当前存在一个事务,那么这个事务将在该方法运行期间被挂起

PROPAGATION_SUPPORTS

表示当前方法不需要运行在一个是事务中,但如果有一个事务已经存在,该方法也可以运行在这个事务中

 

13. 设三个整型变量 x = 1 , y = 2 , z = 3,则表达式 y+=z--/++x 的值是(      )。

A. 3      B. 3.5     C. 4     D. 5

 正确答案: A   你的答案: A (正确)

分析:

 

x = 1 , y = 2 , z = 3,则表达式 y+=z--/++x 的值

1. z是以原值运算的(也就是3)

2. 而 x 的值是+1 后再进行运算的(1+1)

3. 还有一点就是整数除以整数的结果永远是整数

4. += 是把左边(y)和右边的值(z--/++x)相加并赋值给左边的 y,既 y = 3

 

 14. 以下代码将打印出

public static void main(String args[]) {
      List  Listlist1 = new ArrayList();
      Listlist1.add(0);
      List Listlist2 = Listlist1;
        System.out.println(Listlist1.get(0) instanceof Integer);
        System.out.println(Listlist2.get(0) instanceof Integer);
}

A. 编译错误     B. true true     C. true false     D. false false

 正确答案: B   你的答案: D (错误)

分析:

List集合中的元素必须是对象。

Listlist1.add(0);JDK1.5之后支持自动装箱(int类型自动装箱成Integer),编译通过。

instanceof:前一个参数通常是一个引用类型变量,后一个操作数通常是一个类(也可以是一个接口, 它用于判断前面的对象是否是后面的类,或者其子类、实现类的实例

List没有使用泛型,说明使用get(0)取出的元素的编译类型是Object型的, 但运行时类型是Integer。所以打印true。这边体现了多态。

而Listlist1把引用赋给了List list2,说明两个指向同一个对象。第二个打印的也是true。

 

15. 下面有关java threadlocal说法正确的有?

A. ThreadLocal存放的值是线程封闭,线程间互斥的,主要用于线程内共享一些数据,避免通过参数来传递

B. 从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线程局部实例的所有副本都会被垃圾回收

C. 在Thread类中有一个Map,用于存储每一个线程的变量的副本

D. 对于多线程资源共享的问题,同步机制采用了“以时间换空间”的方式,而ThreadLocal采用了“以空间换时间”的方式

 正确答案: A B C D   你的答案: A (错误)

分析:

ThreadLocal类用于创建一个线程本地变量

在Thread中有一个成员变量ThreadLocals,该变量的类型是ThreadLocalMap,也就是一个Map,它的键是threadLocal,值为就是变量的副本。通过ThreadLocal的get()方法可以获取该线程变量的本地副本,在get方法之前要先set,否则就要重写initialValue()方法。

ThreadLocal的使用场景:

        数据库连接:在多线程中,如果使用懒汉式的单例模式创建Connection对象,由于该对象是共享的,那么必须要使用同步方法保证线程安全,这样当一个线程在连接数据库时,那么另外一个线程只能等待。这样就造成性能降低。如果改为哪里要连接数据库就来进行连接,那么就会频繁的对数据库进行连接,性能还是不高。这时使用ThreadLocal就可以既可以保证线程安全又可以让性能不会太低。但是ThreadLocal的缺点时占用了较多的空间。

ThreadLocal不是一个线程而是一个线程的本地化对象。当工作于多线程环境中的对象采用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程分配一个独立的副本。每个线程都可以独立的改变自己的副本,而不影响其他线程的副本。

 

16. 面向对象的基本特征是()

A. 封装     B. 继承     C. 重载     D. 多态

 正确答案: A B D   你的答案: D (错误)

分析:三大基本特征:封装、继承、多态

 

17. 对文件名为Test.java的java代码描述正确的是()

class Person {
    String name = "No name";
    public Person(String nm) {
        name = nm;
    }
}
class Employee extends Person {
    String empID = "0000";
    public Employee(String id) {
        empID = id;
    }
}
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

 正确答案: C   你的答案: B (错误)

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

 

18. 对于子类的构造函数说明,下列叙述中错误的是( )。

A. 子类不能继承父类的无参构造函数。

B. 子类可以在自己的构造函数中使用super关键字来调用父类的含参数构造函数,但这个调用语句必须是子类构造函数的第一个可执行语句。

C. 在创建子类的对象时,若不含带参构造函数,将先执行父类的无参构造函数,然后再执行自己的无参构造函数。

D. 子类不但可以继承父类的无参构造函数,也可以继承父类的有参构造函数。

 正确答案: D   你的答案: D (正确)

分析:构造函数只能被调用,不能被继承。子类默认调用父类无参构造器,若父类没有无参构造器,子类需要用super()调用父类有参构造器,且super()位于子类构造器的第一行。

 

19. String s = new String("xyz");创建了几个StringObject?

A. 两个或一个都有可能     B. 两个     C. 一个     D. 三个

 正确答案: A   你的答案: B (错误)

分析:

1.String对象的两种创建方式:
第一种方式: String str1 = "aaa"; 是在常量池中获取对象("aaa" 属于字符串字面量,因此编译时期会在常量池中创建一个字符串对象),

第二种方式: String str2 = new String("aaa") ; 一共会创建两个字符串对象一个在堆中,一个在常量池中(前提是常量池中还没有 "aaa" 字符串对象)。

System.out.println(str1==str2);//false


2.String类型的常量池比较特殊。它的主要使用方法有两种:
直接使用双引号声明出来的String对象会直接存储在常量池中。
如果不是用双引号声明的String对象,可以使用 String 提供的 intern 方法。 String.intern() 是一个 Native 方法,它的作用是: 如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用; 如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。
String s1 = new String("AAA");
String s2 = s1.intern();
String s3 = "AAA";
System.out.println(s2);//AAA
System.out.println(s1 == s2);//false,因为一个是堆内存中的String对象一个是常量池中的String对象,
System.out.println(s2 == s3);//true, s2,s3指向常量池中的”AAA“

 

 

20. 如果希望监听TCP端口9000,服务器端应该怎样创建socket? 

A. new Socket("localhost",9000);     B. new ServerSocket(9000);

C. new Socket(9000);                      D. new ServerSocket("localhost",9000);

 正确答案: B   你的答案: A (错误)

 

你可能感兴趣的:(2021错题整理,java,jvm)