Back

Java面试之初中级题集

数组在内存中如何分配

  1. 简单的值类型的数组,每个数组成员是一个引用(指针),引用到栈上的空间(因为值类型变量的内存分配在栈上)
  2. 引用类型,类类型的数组,每个数组成员仍是一个引用(指针),引用到堆上的空间(因为类的实例的内存分配在堆上)

String的substring()方法内部是如何实现

substring方法通过原字符串创建了一个新的对象。
当为字符串分配内存时,char数组value[]存储字符,offset=0,count=字符串长度。

在Java6里,由substring(start,end)调用构造函数String(int,in,char[])时,实际上是改变offset和count的位置达到取得子字符串的目的,而子字符串里的value[]数组,因为引用是强引用,仍然指向原字符串。
由于String是不可变的(immutable),基于这种共享同一个字符数组的设计有以下好处: 调用substring()时无需复制数组,可重用value[]数组;且substring()的运行是常数时间,非线性,性能得到提高;而劣势,便是可能会产生内存泄露。
假设原字符串s有1GB,且我们需要的是s.substring(1,10)这样一段小的字符串,但由于substring()里的value[]数组仍然指向1GB的原字符串,导致原字符串无法在GC中释放,从而产生了内存泄露。

在Java7里,String的substring()方法实现已经改变,由原来的共享数组变成了传统的拷贝,原字符串的字符数组已经不再被引用,杜绝了内存泄露的同时也将运行时间由常数变成了线性,这个改变也使得substring()创建字符串的操作更加耗时,以前的开销是O(1),现在最坏情况是O(n)。

什么是不可修改对象(Immutable Object)

可修改对象是那些一旦被创建就不能修改的对象。对这种对象的任何改动的后果都是会创建一个新的对象,而不是在原对象本身做修改。

大多数这样的类通常都是final类型的,因为这样可以避免自己被继承继而被覆盖方法。例如Java中的String类。

也可以通过将类的成员设置成private非final的来获得同样的效果。同时类不能通过方法暴露成员,特别是可修改类型的成员。
当类的方法接收客户类传入的可修改对象的话,应该使用一个复制的对象来防止客户代码来修改这个传入的可修改类。比如,传入java.util.Date对象的话,应该使用clone()方法来获得一个副本。
当通过类方法返回一个可修改对象时,需要返回的是类对象的副本,防止客户代码通过此引用修改了成员对象的属性。

什么时候需要重写hashCode()和equals()方法

当你需要根据业务逻辑来进行相等性判断、而不是根据对象相等性来判断的时候你就需要重写这两个函数了。
例如,两个Employee对象相等的依据是它们拥有相同的emp_id,尽管它们有可能是两个不同的对象,并且分别在不同的地方被创建。同时,如果你准备把它们当作HashMap中的key来使用的话,你也必须重写这两个方法。现在,作为Java中equals-hashcode的一个约定,当你重写equals的时候必须也重写hashcode,否则你会打破诸如Set, Map等集合赖以正常工作的约定。

当你向HashMap插入一个key的时候,首先,这个对象的hashCode()方法会被调用,调用结果用来计算将要存储的位置(bucket)。
因为某个位置上可能以链表的方式已经包含了多个Map.Entry对象,所以HashMap会使用equals()方法来将此对象与所有这些Map.Entry所包含的key进行对比,以确定此key对象是否已经存在。

mybatis如何处理结果集

MyBatis的结果集是通过反射来实现的。并不是通过get/set方法。在实体类中无论是否定义get/set()方法,都是可以接收到的。

cookie和session的区别,分布式环境怎么保存用户状态

1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

分布式环境下的session(举例两种):

服务器session复制
原理:任何一个服务器上的session发生改变(增删改),该节点会把这个 session的所有内容序列化,然后广播给所有其它节点,不管其他服务器需不需要session,以此来保证Session同步。
优点:可容错,各个服务器间session能够实时响应。
缺点:会对网络负荷造成一定压力,如果session量大的话可能会造成网络堵塞,拖慢服务器性能。

session共享机制
使用分布式缓存方案比如memcached、redis,但是要求Memcached或Redis必须是集群。

写一段栈溢出、堆溢出的代码

public class Test {  
 
    //不断创建对象可以导致堆溢出
   public void testHeap(){  
       for(;;){  
             ArrayList list = new ArrayList (2000);  
         }  
   }  
   
   //递归调用可以导致栈溢出
   int num=1;  
   public void testStack(){  
       num++;  
       this.testStack();  
    }  
	 
   public static void main(String[] args){  
       Test  t  = new Test ();  
       t.testHeap();  
       t.testStack();     
   }  
}

char型变量中能不能存储一个中文汉字

在Java中,char类型占2个字节,而且Java默认采用Unicode编码,以个Unicode码是16位,所以一个Unicode码占两个字节,Java中无论汉子还是英文字母都是用Unicode编码来表示的。所以在Java中char类型变量可以存储一个中文汉字。

java中实现多态的机制是什么

靠的是父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。

JAVA IO 中的设计模式

Java I/O库的总体设计是符合装饰模式和适配器模式的。

装饰模式:在由InputStream、OutputStream、Reader和Writer代表的等级结构内部,有一些流处理器可以对另一些流处理器起到装饰作用,形成新的、具有改善了的功能的流处理器。

适配器模式:在由InputStream、OutputStream、Reader和Writer代表的等级结构内部,有一些流处理器是对其他类型的流处理器的适配。这就是适配器的应用。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus