知音专栏:
JavaWeb练手项目源码下载
常用的设计模式完整总结篇
近几年的java面试题总结汇总
下面有关JVM内存,说法错误的是?
A、程序计数器是一个比较小的内存区域,用于指示当前线程所执行的字节码执行到了第几行,是线程隔离的。
B、虚拟机栈描述的是Java方法执行的内存模型,用于存储局部变量,操作数栈,动态链接,方法出口等信息,是线程隔离的。
C、方法区用于存储JVM加载的类信息、常量、静态变量、以及编译器编译后的代码等数据,是线程隔离的。
D、原则上讲,所有的对象都在堆区上分配内存,是线程之间共享的。
点击下方空白区域查看答案解析!
▼
正确答案:C
答案解析: 方法区在JVM中也是一个非常重要的区域,它与堆一样,是被线程共享的区域。 在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
下列关于构造方法不正确的是:( )
A、类的构造方法和类同名
B、一个类可以有多个构造方法
C、在实例化对象时必须调用类的构造方法
D、构造方法可以和该类其他方法一样被该类对象调用
点击下方空白区域查看答案解析!
▼
正确答案:D
答案解析: 构造方法是用来构造对象实例的。而成员方法是用来执行某种功能的,需要对象实例来调用。所以顺序是:构造方法执行得到对象实例,对象实例调用成员方法。构造在前,实例对象在后,不可能调用!
【多选】实现或继承了Collection接口的是()
A、Map
B、List
C、Vector
D、Iterator���,����
E、Set
点击下方空白区域查看答案解析!
▼
正确答案:BCE
答案解析:
1、A中的Map接口以键值对(key—value)的形式存放对象,其中键(key)对象不可以重复,值(value)对象可以重复,排序方式为按照自身内部的规则。
2、B中的List接口继承了Collection接口,List接口允许存放重复的对象,排序方式为按照对象的插入顺序。
3、C中的Vector实现了List接口,即间接实现Collection接口。
4、D中的Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,没有实现Collection接口。
5、E中的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”)
调用其构造方法,这里举几种例子:
1、getConstructor(class[]params)作用:
返回此class对象所表示的类的指定的public构造方法。 例如:Constructorc=cla.getConstructor(string.class,String.class,Integer.class)
2、getConstructors作用:
返回此class对象所表示的类的所有public构造方法。 例如:Constructor[]arrc=cla.getConstructors()
3、getDeclaredConstructor(class[]params)作用:
返回此class对象所表示的类的指定的构造方法,与构造方法的访问级别无关。 例如:Consteuctorc=cla.getDeclaredconstructor(string.class,string.class,Integer.class)
4、getDeclaredConstructors()作用:
返回此class对象所表示的类的全部构造方法。 例如:Constructor[]arrc=cla.getDeclaredConsteructors();
三,集合图(来自博客园)