2 //何问起 hovertree.com 3 import java.util.Arrays;
4 import java.util.EmptyStackException; 5
6 public class MyStack
10 private static final int INIT_CAPACITY = 16; 11
12 public MyStack() {
13 elements = (T[]) new Object[INIT_CAPACITY]; 14 } 15
16 public void push(T elem) { 17 ensureCapacity(); 18 elements[size++] = elem; 19 } 20
21 public T pop() { 22 if(size == 0)
23 throw new EmptyStackException();
视频库网址:http://yun.itheima.com 资料领取:3285264708
24 return elements[--size]; 25 } 26
27 private void ensureCapacity() { 28 if(elements.length == size) {
29 elements = Arrays.copyOf(elements, 2 * size + 1); 30 } 31 } 32 }
上面的代码实现了一个栈(先进后出(FILO))结构,乍看之下似乎没有什么明显的问题,它甚至可以通过你编写的各种单元测试。然而其中的pop方法却存在内存泄露的问题,当我们用pop方法弹出栈中的对象时,该对象不会被当作垃圾回收,即使使用栈的程序不再引用这些对象,因为栈内部维护着对这些对象的过期引用(obsolete reference)。在支持垃圾回收的语言中,内存泄露是很隐蔽的,这种内存泄露其实就是无意识的对象保持。如果一个对象引用被无意识的保留起来了,那么垃圾回收器不会处理这个对象,也不会处理该对象引用的其他对象,即使这样的对象只有少数几个,也可能会导致很多的对象被排除在垃圾回收之外,从而对性能造成重大影响,极端情况下会引发Disk Paging(物理内存与硬盘的虚拟内存交换数据),甚至造成OutOfMemoryError。
26、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native),是否可同时被synchronized修饰?
视频库网址:http://yun.itheima.com 资料领取:3285264708
答:都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由本地代码(如C代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。
27、静态变量和实例变量的区别?
答:静态变量是被static修饰符修饰的变量,也称为类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;实例变量必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存。在Java开发中,上下文类和工具类中通常会有大量的静态成员。
28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
答:不可以,静态方法只能访问静态成员,因为非静态方法的调用要先创建对象,因此在调用静态方法时可能对象并没有被初始化。
29、如何实现对象克隆? 答:有两种方式:
1.实现Cloneable接口并重写Object类中的clone()方法;
2.实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下。
视频库网址:http://yun.itheima.com 资料领取:3285264708
1 package com.lovo; 2
3 import java.io.ByteArrayInputStream; 4 import java.io.ByteArrayOutputStream; 5 import java.io.ObjectInputStream; 6 import java.io.ObjectOutputStream; 7
8 public class MyUtil { 9
10 private MyUtil() {
11 throw new AssertionError(); 12 } 13
14 public static
15 ByteArrayOutputStream bout = new ByteArrayOutputStream(); 16 ObjectOutputStream oos = new ObjectOutputStream(bout); 17 oos.writeObject(obj); 18
19 ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray());
20 ObjectInputStream ois = new ObjectInputStream(bin); 21 return (T) ois.readObject();
视频库网址:http://yun.itheima.com 资料领取:3285264708
相关推荐: