Java错题集(三)

目录

下面关于垃圾收集的描述哪个是错误的?

Java的跨平台特性是指它的源代码可以在多个平台运行。()

下面哪种情况会导致持久区jvm堆内存溢出?

问这个程序的输出结果。

下面的switch语句中,x可以是哪些类型的数据:()

Java1.8版本之前的前提,Java特性中,abstract class和interface有什么区别()


 

下面关于垃圾收集的描述哪个是错误的?

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

使用垃圾收集的程序不需要明确释放对象
现代垃圾收集能够处理循环引用问题
垃圾收集能提高程序员效率
使用垃圾收集的语言没有内在泄漏问题
来源:https://www.nowcoder.com/questionTerminal/949ccecf4fd4471391577ec78739ff65
内存泄露(Memory Leak)是指一个不再被使用的对象或者变量还在内存中占有存储空间。
在C/C++语言中,内存泄露出现在开发人员忘记释放已分配的内存就会造成内存泄露。
在java语言中引入垃圾回收机制,有GC负责进行回收不再使用的对象,释放内存。但是还是会存在内存泄露的问题。
内存泄露主要有两种情况:
1.在堆中申请的空间没有释放。
2.对象已不再被使用(注意:这里的不在被使用是指对程序来说没有用处,如数据库连接使用后没有关。但是还是存在着引用),但是仍然在内存中保留着。
GC机制的引入只能解决第一种情况,对于第2种情况无法保证不再使用的对象会被释放。java语言中的内存泄露主要指第2种情况。
内存泄露的原因:
1.静态集合类。如HashMap和Vector。这些容器是静态的,生命周期和程序的生命周期一致,那么在容器中对象的生命周期也和其一样,对象在程序结束之前将不能被释放,从而会造成内存泄露。
2.各种连接,如数据库连接,网络连接,IO连接,不再使用时如果连接不释放容易造成内存泄露。
3.***,释放对象时往往没有相应的删除***,可能会导致内存泄露。
内存溢出(OOM)是指程序在申请内存时没有足够的内存供使用,进而导致程序崩溃这是结果描述。
内存泄露(Memory Leak)最终会导致内存溢出。

 

Java的跨平台特性是指它的源代码可以在多个平台运行。()

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

正确
错误

来源:https://www.nowcoder.com/questionTerminal/90db8f2b6c2d40babd21e9d25344e51d

1.Java的跨平台特性是因为JVM的存在, 它可以执行.class字节码文件,而不是.java源代码

2.JAVA的跨平台特性表述为“一次编译,到处运行”,JAVA程序运行在JVM上,而JVM对上屏蔽了底层操作系统差异。

3.我们编译好的文件是以.java后缀保存的,编译器会自动帮我们生成一个标准的.class字节码文件,JVM运行该文件。JVM也是一个软件,不同的系统平台JVM不同,但都可以实现标准的.class字节码文件。

 

下面哪种情况会导致持久区jvm堆内存溢出?

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

循环上万次的字符串处理
在一段代码内申请上百M甚至上G的内存
使用CGLib技术直接操作字节码运行,生成大量的动态类
不断创建对象

来源:https://www.nowcoder.com/questionTerminal/1999635c228d49be84eb7623108be35e

学习博客 :https://blog.csdn.net/sivyer123/article/details/17139443

简单的来说 java的堆内存分为两块:

permantspace(持久带)heapspace。

持久带中主要存放用于存放静态类型数据,如 Java Class, Method 等, 与垃圾收集器要收集的Java对象关系不大。

而heapspace分为年轻带年老带 

年轻代的垃圾回收叫 Young GC, 年老代的垃圾回收叫 Full GC

在年轻代中经历了N次(可配置)垃圾回收后仍然存活的对象,就会被复制到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象

年老代溢出原因  循环上万次的字符串处理、创建上千万个对象、在一段代码内申请上百M甚至上G的内存,既A B D选项

持久代溢出原因  动态加载了大量Java类而导致溢出

 

package Wangyi;
class Base
{
    public void method()
    {
        System.out.println("Base");
    } 
}
class Son extends Base
{
    public void method()
    {
        System.out.println("Son");
    }
    
    public void methodB()
    {
        System.out.println("SonB");
    }
}
public class Test01
{
    public static void main(String[] args)
    {
        Base base = new Son();
        base.method();
        base.methodB();
    }
}

问这个程序的输出结果。

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

Base SonB
Son SonB
Base Son SonB
编译不通过

来源:https://www.nowcoder.com/questionTerminal/711badc732d84bd98e4ac684e09791b8

学习博客:https://www.cnblogs.com/111testing/p/6880831.html

成员变量:编译看左边,运行看左边
静态变量:编译看左边,运行看左边
成员方法:编译看左边,运行看右边
静态方法:编译看左边,运行看左边

编译时要看左边有没有该方法

 

下面的switch语句中,x可以是哪些类型的数据:()

switch(x)
{
default:
System.out.println("Hello");
}

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

long
char
float
byte
double
Object

以java8为准,switch支持10种类型

基本类型:byte char short int

包装类 :Byte,Short,Character,Integer String enum

2、实际只支持int类型 Java实际只能支持int类型的switch语句,那其他的类型时如何支持的

a、基本类型byte char short 原因:这些基本数字类型可自动向上转为int, 实际还是用的int。

b、基本类型包装类Byte,Short,Character,Integer 原因:java的自动拆箱机制 可看这些对象自动转为基本类型

c、String 类型 原因:实际switch比较的string.hashCode值,它是一个int类型 如何实现的,网上例子很多。此处不表。

d、enum类型 原因 :实际比较的是enum的ordinal值(表示枚举值的顺序),它也是一个int类型 所以也可以说 switch语句只支持int类型

 

Java1.8版本之前的前提,Java特性中,abstract class和interface有什么区别()

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

抽象类可以有构造方法,接口中不能有构造方法
抽象类中可以有普通成员变量,接口中没有普通成员变量
抽象类中不可以包含静态方法,接口中可以包含静态方法
一个类可以实现多个接口,但只能继承一个抽象类。

来源:https://www.nowcoder.com/questionTerminal/f0b4438ea8554423a53740ffdc08faf2

学习文章:https://zhuanlan.zhihu.com/p/94770324

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值