爪哇基础题01
2022/12/31,2022最后一天,开始刷基础题,下学期就找工作了,现在基础知识薄弱,决定边刷边学,今天完成10道java基础题,正确率感人,高达40%,继续努力!10道题中找一些不太会记不清的的深度学习一下。
1.有这样一段程序,问输出结果是什么
public class Test{ public static void main(String [] args){ List list=new ArrayList(); list.add("a"); list.add("b"); list.add("a"); Set set=new HashSet(); set.add("a"); set.add("b"); set.add("a"); System.out.println(list.size()+","+set.size()); } }
这道题考察的是ArrayList和HashSet的区别,ArrayList是有序的集合,可以重复添加数据,集合中的数据不唯一;HashSet是无序的集合,集合中的数据不可重复。因此结果为3,2
2.下面字段声明中哪一个在interface主体内是合法的? (B)
A private final static int answer = 42;
B public static int answer = 42;
C final static answer = 42;
D int answer;
interface是接口的意思,接口中定义变量都是静态变量,而且默认都是public final static修饰,这三个修饰皆可省略。
3.下面哪种情况会导致持久区jvm堆内存溢出?(C)
A 循环上万次的字符串处理
B 在一段代码内申请上百M甚至上G的内存
C 使用CGLib技术直接操作字节码运行,生成大量的动态类
D 不断创建对象
jvm我之前并没有学过,刚好碰到这题完全不会,就去对应的查了一些资料。
首先我先查找什么是堆内存,在学javase的时候了解过一些。
Heap 堆
- 通过关键字new创建出来的对象,都会存放在堆内存中
这是我之前就了解过的,所以我最先选的D选项,我觉得如果一直往堆内存中存放对象就会内存溢出。
特点
- 堆是线程共享的,堆中对象都要考虑线程安全的问题
- 有垃圾回收机制
了解了有垃圾回收机制后,我对D选项就重新有了判断,既然有垃圾回收机制,不断创建对象应该也不会内存溢出吧,那导致内存溢出的就应该不会是一直创建对象。
之后我又查找了对堆存溢出的概念,为什么会存在堆内存溢出,其实这里一开始我是有疑惑的,字面意义上的疑惑,既然堆有垃圾回收机制,那不用的对象被当做垃圾收走了为什么还会溢出呢,一定是有别的原因?通过百度,我发现我这个想法也是不对的,不停创建对象仍可能导致内存溢出,想象一下,如果不停的创建对象,而且每个对象在使用,那就不会被收走,所以会溢出。
举个例子:
/* java.lang.OutOfMemoryError:Java heap space */ public class Demo1_5{ public static void mian(String[] args){ int i = 0; try{ List<String> list = new ArratList<>(); String a = "hello"; while(true){ list.add(a);//hello hellohello a = a + a; i++ } }catch(Throwable e){ e.printStackTrace(); System.out.println(i); } } }
这里list和字符串a一直被使用所以不会被回收,最后就会发生内存溢出。
D选项我就懂了,说的不严谨,是有可能,而不是一定会。
当然,以上在我复制题目去搜索的时候就发现有大问题了,我忽视了一个很重要的关键词,持久区。搜索中发现原来堆内存还分两部分,分别是Permanent Space 和 Heap Space。前者为持久区,后者分为年老代和年轻代(以后再具体研究)。
持久区用于存放静态类型数据,如 Java Class, Method 等。持久代一般存放了要加载的类信息、静态变量、final类型的常量、属性和方法信息。 持久代想要溢出,与创建对象的,大量运行字符串没关系。持久代对垃圾回收没有显著影响。但是有些应用可能动态生成或调用一些Class,例如 Hibernate CGLib 等(对应的C选项),在这种时候往往需要设置一个比较大的持久代空间来存放这些运行过程中动态增加的类型。因此这种操作在没有比较大的持久区空间的情况下就会出现内存溢出。
持久区溢出具体原因是因为持久区设置过小,动态加载了大量java类而导致溢出,解决办法唯有将参数 -XX:MaxPermSize 调大。
学到这里就知道正确答案是C
针对于ABD,都属于另一种堆内存溢出,称之为年老代溢出,产生的原因为设置的内存参数Xmx过小或程序的内存泄露及使用不当问题。
4.以下哪些内存区域属于JVM规范?(ADE)
A 方法区
B 实例变量
C 静态变量
D 程序计数器
E 虚拟机栈
jvm规范的内存区域包括虚拟机栈、程序计数器、方法区、堆、本地方法栈
5.以下关于final关键字说法错误的是(AC)
A final是java中的修饰符,可以修饰类、接口、抽象类、方法和属性
B final修饰的类肯定不能被继承
C final修饰的方法不能被重载
D final修饰的变量不允许被再次赋值
A选项中的抽象类是不能被final修饰的,抽象类的意义就是用来被继承从而实现抽象类中的抽象方法,而final修饰的类无法被继承。
C选项中被final修饰的方法不能被重写,而不是不能被重载,重写是子类继承父类的时候一种操作,而重载不发生继承关系。
D选项中final修饰的变量不能被重新赋值
#我的2023新年愿望#我是一个转码的小白,平时会在牛客中做选择题,在做题中遇到不会的内容就会去找视频或者文章学习,以此不断积累知识。这个专栏主要是记录一些我通过做题所学到的基础知识,希望能对大家有帮助