点击上方 Java 知音, 选择置顶公众号
技术文章第一时间送达!
知音专栏:
Javaweb 练手项目源码下载
常用的设计模式完整总结篇
近几年的 java 面试题总结汇总
下面有关 JVM 内存, 说法错误的是?
A 程序计数器是一个比较小的内存区域, 用于指示当前线程所执行的字节码执行到了第几行, 是线程隔离的
B 虚拟机栈描述的是 Java 方法执行的内存模型, 用于存储局部变量, 操作数栈, 动态链接, 方法出口等信息, 是线程隔离的
C 方法区用于存储 JVM 加载的类信息常量静态变量以及编译器编译后的代码等数据, 是线程隔离的
D 原则上讲, 所有的对象都在堆区上分配内存, 是线程之间共享的
点击下方空白区域查看答案解析!
正确答案: C
答案解析: 方法区在 JVM 中也是一个非常重要的区域, 它与堆一样, 是被线程共享的区域 在方法区中, 存储了每个类的信息 (包括类的名称方法信息字段信息) 静态变量常量以及编译器编译后的代码等
下列关于构造方法不正确的是:( )
A 类的构造方法和类同名
B 一个类可以有多个构造方法
C 在实例化对象时必须调用类的构造方法
D 构造方法可以和该类其他方法一样被该类对象调用
点击下方空白区域查看答案解析!
正确答案: D
答案解析: 构造方法是用来构造对象实例的而成员方法是用来执行某种功能的, 需要对象实例来调用所以顺序是: 构造方法执行得到对象实例, 对象实例调用成员方法构造在前, 实例对象在后, 不可能调用!
多选实现或继承了 Collection 接口的是()
- AMap
- BList
- CVector
- DIterator
- ESet
点击下方空白区域查看答案解析!
正确答案: BCE
答案解析:
1A 中的 Map 接口以键值对 (keyvalue) 的形式存放对象, 其中键 (key) 对象不可以重复, 值 (value) 对象可以重复, 排序方式为按照自身内部的规则
2B 中的 List 接口继承了 Collection 接口, List 接口允许存放重复的对象, 排序方式为按照对象的插入顺序
3C 中的 Vector 实现了 List 接口, 即间接实现 Collection 接口
4D 中的 Iterator, 所有的集合类, 都实现了 Iterator 接口, 这是一个用于遍历集合中元素的接口, 没有实现 Collection 接口
5E 中的 Set 接口继承了 Collection 接口, Set 接口不允许存放重复的对象, 排序方式为按照自身内部的排序规则
好了, 还是得多说几句, 关于上面三道题的一点小扩展
一关于线程隔离和线程共享
JVM 中线程隔离的有:
程序计数器:
一小块内存空间, 单前线程所执行的字节码行号指示器字节码解释器工作时, 通过改变这个计数器的值来选取下一条需要执行的字节码指令, 分支循环跳转异常处理线程恢复等基础功能都需要依赖这个计数器来完成
JVM 虚拟机栈:
Java 方法执行内存模型, 用于存储局部变量, 操作数栈, 动态链接, 方法出口等信息是线程私有的
本地方法栈:
为 JVM 用到的 Native 方法服务, SunHotSpot 虚拟机把本地方法栈和 JVM 虚拟机栈合二为一是线程私有的
JVM 中线程共享的有:
方法区:
用于存储 JVM 加载的类信息常量静态变量即使编译器编译后的代码等数据
运行时常量池:
是方法区的一部分, 用于存放编译器生成的各种字面量和符号引用, 这部分内容将在类加载后存放到方法取得运行时常量池中具备动态性, 用的比较多的就是 String 类的 intern()方法
JVM 堆:
存放所有对象实例的地方
新生代, 由 Eden Space 和大小相同的两块 Survivor 组成
旧生代, 存放经过多次垃圾回收仍然存活的对象
二关于 Java 中的反射和构造方法
A 和 B 没有疑问, C 的话因为有反射, 这里可能有朋友会采坑反射虽然没有 New 对象, 但一样依赖类的构造方法获取想要操作类的 java.lang.Class 对象每个类被加载后, 系统就会为该类生成一个对应的 Class 对象, class 对象就可以访问 java 虚拟机中的这个类
获取 Class 有三种方法:
1 调用某个对象的 getclass()方法.
例如: person person=new person();Class cla=person.getclass()调 / 2 用某个类的 class 属性来获取该类对应的 class 对象
例如: Class cla=Person.class;
3 使用 class 类的 forName()静态方法例
如: class cla=Class.ForName(com.amuxia.person)
调用其构造方法, 这里举几种例子:
1getConstructor(class[]params)作用:
返回此 class 对象所表示的类的指定的 public 构造方法
例如: Constructorc=cla.getConstructor(string.class,String.class,Integer.class)
2getConstructors 作用:
返回此 class 对象所表示的类的所有 public 构造方法
例如: Constructor[]arrc=cla.getConstructors()
3getDeclaredConstructor(class[]params)作用:
返回此 class 对象所表示的类的指定的构造方法, 与构造方法的访问级别无关
例如: Consteuctorc=cla.getDeclaredconstructor(string.class,string.class,Integer.class)
4getDeclaredConstructors()作用:
返回此 class 对象所表示的类的全部构造方法
例如: Constructor[]arrc=cla.getDeclaredConsteructors();
三, 集合图(来自博客园)
来源: https://mp.weixin.qq.com/s?__biz=MzI4Njc5NjM1NQ==&mid=2247484899&idx=1&sn=1df1cb6999b7021c68f5c1898ae42532&chksm=ebd63acfdca1b3d9128f6bb9e973f8723585622e3cbb155423900b7f2e50df795122ce3e1031#rd