高级Java工程师及技术主管面试题

匿名网友 匿名网友 发布于: 2015-08-30 00:00:00
阅读 116 收藏 0 点赞 0 评论 0

1. 解释一下Java Stringintern()方法?

JDK里的解释:
public String intern()
返回字符串对象的规范化表示形式。 
一个初始时为空的字符串池,它由类 String 私有地维护。 
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。 
它遵循对于任何两个字符串 s  t,当且仅当 s.equals(t)  true 时,s.intern() == t.intern() 才为 true 
所有字面值字符串和字符串赋值常量表达式都是内部的。

Java代码 :

 

public static void main(String[] args) {

String s = new String(“abc”);
String b = s.intern();
if (s == b) {
System.out.println(“
字符串abc在常量池中“);
} else {
System.out.println(“
字符串abc不在常量池中“);
}

String s1 = “abc”;
String b1 = s1.intern();
if (s1 == b1) {
System.out.println(“
字符串abc在常量池中“);
} else {
System.out.println(“
字符串abc不在常量池中“);
}
}


结果: 
字符串abc不在常量池中 
字符串abc在常量池中 

2. Java Class什么时候会被垃圾回收掉?

有两个条件会触发主GC:

  1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用。因为GC在优先级最低的线程中进行,所以当应用忙时,GC线程就不会被调用,但以下条件除外。

  2)Java堆内存不足时,GC会被调用。当应用线程在运行,并在运行过程中创建新对象,若这时内存空间不足,JVM就会强制地调用GC线程,以便回收内存用于新的分配。若GC一次之后仍不能满足内存分配的要求,JVM会再进行两次GC作进一步的尝试,若仍无法满足要求, JVM将报“out of memory”的错误,Java应用将停止。

  由于是否进行主GCJVM根据系统环境决定,而系统环境在不断的变化当中,所以主GC的运行具有不确定性,无法预计它何时必然出现,但可以确定的是对一个长期运行的应用来说,其主GC是反复进行的。

3. 什么是JCA?

JCA(J2EE Connector Architecture, 也缩写为,J2C J2CA),是J2EE平台上连接传统系统的一个技术规范。JCA1.0提供了出站操作,1.5提供了消息流入和事务流入,以及生命周期管理和工作管理等系统契约。但是由于JCA尚未规定统一的元数据获取方式,开发工具对JCA的支持还很有限。各厂商对JCA的支持也不足,因此JCA在通用性和广泛接受方面存在不足。

4. 什么是JPA?

JPAJava Persistence APIJava持久化API),定义了对象关系映射(ORM)以及实体对象持久化的标准接口。

JPAJSR-220EJB3.0)规范的一部分,在JSR-220中规定实体对象(EntityBean)由JPA进行支持。

所以JPA不局限于EJB3.0,而是作为POJO持久化的标准规范,可以脱离容器独立运行,开发和测试更加方便。JPA存在于数据访问层:如下图


JPA维护一个Persistence Context(持久化上下文),在持久化上下文中维护实体的生命周期。主要包含三个方面的内容:

  1. ORM元数据。JPA支持annotionxml两种形式描述对象关系映射。
  2. 实体操作API。实现对实体对象的CRUD操作。
  3. 查询语言。约定了面向对象的查询语言JPQLJava Persistence Query Language)。

5. 什么是浅拷贝(shallow cloning)和深拷贝(deep cloning?

浅拷贝:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。
换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

深拷贝:被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。

那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。

换言之,深复制把要复制的对象所引用的对象都复制了一遍。

1、直接赋值(字符串外都属于浅拷贝)

2、使用构造函数(深拷贝)

3、使用clone()方法(深拷贝)

评论列表
文章目录