【JAVA】 错题集 更新到2020-11-18

注明:题目和解析来自 牛客网 https://www.nowcoder.com/

题目1:

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

答案:ArrayIndexOutOfBoundsException
解析:定义的数组长度为10,角标即为0-9;访问数组角标10会出现数组角标越界异常

题目2:

以下描述错误的一项是( )?
A. 程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行 到了第几行,是线程隔离的
B. 原则上讲,所有的对象都是在堆区上分配内存,是线程之间共享的
C. 方法区用于存储JVM加载的类信息、常量、静态变量,即使编译器编译后的代码等数据,是线程隔离的
D. Java方法执行内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的

答案:C
解析:
在这里插入图片描述
JAVA的JVM的内存可分为3个区:堆(heap)、栈(stack)和方法区(method)
栈区:

  1. 每个线程包含一个栈区,栈中只保存方法中(不包括对象的成员变量)的基础数据类型和自定义对象的引用(不是对象),对象都存放在堆区中
  2. 每个栈中的数据(原始类型和对象引用)都是私有的,其他栈不能访问。
  3. 栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)。

堆区:

  1. 存储的全部是对象实例,每个对象都包含一个与之对应的class的信息(class信息存放在方法区)。
  2. jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身,几乎所有的对象实例和数组都在堆中分配。

方法区:

  1. 又叫静态区,跟堆一样,被所有的线程共享。它用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

题目3:

下面有关maven和ant的描述,描述错误的是?
A. Ant 没有正式的约定如一个一般项目的目录结构,你必须明确的告诉 Ant 哪里去找源代码
B. Maven 拥有约定,因为你遵循了约定,它已经知道你的源代码在哪里
C. maven和ant都有“生命周期”的概念,当你输入一个命令后,maven或者ant会执行一系列的有序的步骤,直到到达你指定的生命周期
D. Ant构建文件默认命名为build.xml,Maven默认构建文件为pom.xml

答案:C
解析:
Ant和Maven都是基于Java的构建(build)工具。理论上来说,有些类似于(Unix)C中的make ,但没有make的缺陷。Ant是软件构建工具,Maven的定位是软件项目管理和理解工具。
Ant特点
1. 没有一个约定的目录结构,必须明确让ant做什么,什么时候做,然后编译,打包
2. 没有生命周期,必须定义目标及其实现的任务序列
3. 没有集成依赖管理
Maven特点
1. 拥有约定,知道你的代码在哪里,放到哪里去
2. 拥有一个生命周期,例如执行 mvn install 就可以自动执行编译,测试,打包等构建过程
3. 只需要定义一个pom.xml,然后把源码放到默认的目录,Maven帮你处理其他事情
4. 拥有依赖管理,仓库管理

题目4:

以下代码的输出结果是?

public class B
{
    public static B t1 = new B();
    public static B t2 = new B();
    {
        System.out.println("构造块");
    }
    static
    {
        System.out.println("静态块");
    }
    public static void main(String[] args)
    {
        B t = new B();
    }
}

A.静态块 构造块 构造块 构造块
B.构造块 静态块 构造块 构造块
C.构造块 构造块 静态块 构造块
D.构造块 构造块 构造块 静态块

答案:C
解析:
开始时JVM加载B.class,对所有的静态成员进行声明,t1 t2被初始化为默认值,为null,又因为t1 t2需要被显式初始化,所以对t1进行显式初始化,初始化代码块→构造函数(没有就是调用默认的构造函数),咦!静态代码块咋不初始化?

因为在开始时已经对static部分进行了初始化,虽然只对static变量进行了初始化,但在初始化t1时也不会再执行static块了,因为JVM认为这是第二次加载类B了,所以static会在t1初始化时被忽略掉,所以直接初始化非static部分

,也就是构造块部分(输出’‘构造块’’)接着构造函数(无输出)。接着对t2进行初始化过程同t1相同(输出’构造块’),此时就对所有的static变量都完成了初始化,接着就执行static块部分(输出’静态块’),接着执行,main方法,同样也,new了对象,调用构造函数输出(‘构造块’)

题目5

下面关于Spring的说法中错误的是()
A. Spring是一系列轻量级Java EE框架的集合
B. Spring中包含一个“依赖注入”模式的实现
C. 使用Spring可以实现声明式事务
D. Spring提供了AOP方式的日志系统

答案:D
解析:
spring没有提供AOP方式的日志系统
Spring通过对AOP的支持,借助log4j等Apache开源组件实现了日志系统。
关于A:Spring 框架是一个分层架构,由 7 个定义良好的模块组成。核心容器,Spring上下文,Spring AOP, Spring DAO, Spring ORM, Spring Web, Spring MVC。

下面有关java的引用类型,说法正确的有?
A. 对于一个对象来说,只要有强引用的存在,它就会一直存在于内存中
B. 如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
C. 如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存
D. 一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的空间

答案:ABCD
解析:
1、强引用:一个对象赋给一个引用就是强引用,比如new一个对象,一个对象被赋值一个对象。
2、软引用:用SoftReference类实现,一般不会轻易回收,只有内存不够才会回收。
3、弱引用:用WeekReference类实现,一旦垃圾回收已启动,就会回收。
4、虚引用:不能单独存在,必须和引用队列联合使用。主要作用是跟踪对象被回收的状态。

题目6

题目:计算机所能处理的最小的数据项称为()
A. 位
B. 字节
C. 字
D. 双字

答案:A
解析:
位、字节、字是计算机数据存储的单位。位是最小的存储单位,每一个位存储一个1位的二进制码,一个字节由8位组成。而字通常为16、32或64个位组成

题目7

以下代码将打印出
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
解析:
由于replaceAll方法的第一个参数是一个正则表达式,而".“在正则表达式中表示任何字符,所以会把前面字符串的所有字符都替换成”/"。如果想替换的只是".",那么久要写成"\.".,

题目8

检查程序,是否存在问题,如果存在指出问题所在,如果不存在,说明输出结果。
package algorithms.com.guan.javajicu;
public class Inc {
public static void main(String[] args) {
Inc inc = new Inc();
int i = 0;
inc.fermin(i);
i= i ++;
System.out.println(i);

} 
void fermin(int i){ 
   i++; 
} 

}

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

答案: A

解析:
i++ 先赋值在计算结果;
++i 先计算结果再赋值。
int i = 0;
i = i ++; // 左边这个i其实是障眼法,就是一个中间变量,可以和下行的i合并;
System.out.println(i); 这里等价于:
int i = 0;
System.out.println(i++); 这下再看,先赋值(先将i传给println函数打印出来,在计算表达式结果)
所以打印出来的是0,实际上整个表达式的结果已经是1了,只是没有打印出整个表达式的结果。
所以我们知道如下结论:
1、无论怎么变,i++和++i的整个表达式的结果都是1.
2、有时我们打印的是表达式的结果(System.out.println(++i)),
有时我们打印的只是一个中间变量(System.out.println(i++))。
Ps:
int i = 0;
i++;
System.out.println(i); //值为1 打印的是表达式的结果

int i = 0;
++i;
System.out.println(i); //值为1 打印的是表达式的结果

int i = 0;
i = i++;
System.out.println(i); //值为0 打印的是中间变量(JVM中间缓存变量机制)

int i = 0;
i = ++i;
System.out.println(i); //值为1 打印的是表达式的结果

多态的作用 提高可重用性;扩展代码模块

题目9

以下哪些方法可以取到http请求中的cookie值()?
A.request.getAttribute
B.request.getHeader
C.request.getParameter
D.request.getCookies

答案:BD
1)Cookie[] getCookies()
返回一个数组,包含客户端发送该请求的所有的 Cookie 对象

2)Object getAttribute(String name)
以对象形式返回已命名属性的值,如果没有给定名称的属性存在,则返回 null。

3)String getHeader(String name)
以字符串形式返回指定的请求头的。Cookie也是头的一种;

4)String getParameter(String name)
以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值