31、什么时候用assert。
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。
Java的assert是关键字。
public class TestAssert
{
public static void main(String[] args)
{
int a = 5;
//断言a>3
assert a > 3;
//断言a<3,否则显示a不小于3,且a的值为:” + a
assert a < 3 : “a不小于3,且a的值为:” + a;
}
}
从上面代码可以看出,assert的两个基本用法如下:
assert logicExp;
asert logicExp : expr;
A.第一个直接进行断言,
B.第二个也是进行断言,但当断言失败失败时显示特定信息。
最后要指出:
虽然assert是JDK1.4新增的关键字,但有一点非常重要:
java命令默认不启动断言,
为了启动用户断言,应该在运行java命令时增加-ea(Enable Assert)选项。
为了启动系统断言,应该在运行java命令时增加-esa(Enable System Assert)选项。
32、Java中会存在内存泄漏吗,请简单描述。
为了搞清楚Java程序是否有内存泄露存在,我们首先了解一下什么是内存泄露:程序运行过程中会不断地分配内存空间;那些不再使用的内存空间应该即时回收它们,从而保证系统可以再次使用这些内存。如果存在无用的内存没有被回收回来,那就是内存泄露。
对于Java程序而言,只要Java对象一直处于可达状态,垃圾回收机制就不会回收它们——即使它们对于程序来说已经变成了垃圾(程序再也不需要它们了);但对于垃圾回收机制来说,它们还不是垃圾(还处于可达状态),因此不能回收。
看ArrayList中remove(int index)方法的源代码,程序如下:
public E remove(int index)
{
//检查index索引是否越界
RangeCheck(index);
//使修改次数加1
modCount++;
//获取被删除的元素
E oldValue = (E)elementData[index];
int numMoved = size - index - 1;
//整体搬家
if (numMoved > 0)
System.arraycopy(elementData, index+1
, elementData, index, numMoved);
//将ArrayList的size减1,
//并将最后一个数组赋为null,让垃圾回收机制回收最后一个元素
elementData[–size] = null;
return oldValue;
}
上面程序中粗体字代码elementData[–size] = null;就是为了避免垃圾回收机制而书写的代码,如果没有这行代码,这个方法就会产生内存泄露——每删除一个对象,但该对象所占用的内存空间却不会释放。
33、能不能自己写个类,也叫java.lang.String?
可以,但在应用的时候,需要用自己的类加载器去加载,否则,系统的类加载器永远只是去加载jre.jar包中的那个java.lang.String。
但在Tomcat的web应用程序中,都是由webapp自己的类加载器先自己加载WEB-INF/classess目录中的类,然后才委托上级的类加载器加载,如果我们在Tomcat的web应用程序中写一个java.lang.String,这时候Servlet程序加载的就是我们自己写的java.lang.String,但是这么干就会出很多潜在的问题,原来所有用了java.lang.String类的都将出现问题。
34、ArrayList如何实现插入的数据按自定义的方式有序存放
编程思路是:实现一个类对ArrayList进行包装,当程序试图向ArrayList中放入数据时,程序将先检查该元素与ArrayList集合中其他元素的大小,然后将该元素插入到指定位置。
class MyBean implements Comparable{
public int compareTo(Object obj){
if(! obj instanceof MyBean)
throw new ClassCastException()。
MyBean other = (MyBean) obj;
return age > other.age?1:age== other.age?0:-1;
}
}
class MyTreeSet {
private ArrayList datas = new ArrayList();
public void add(Object obj){
for(int i=0;i<datas.size();i++){
if(obj.compareTo(datas.get(i) != 1){
datas.add(i,obj);
}
}
}
}
35.序列化接口的id有什么用?
反序列化Java对象时必须提供该对象的class文件,现在的问题是随着项目的升级,系统的class文件也会升级,Java如何保证两个class文件的兼容性?
Java序列化机制允许为序列化类提供一个private static final的serialVersionUID值,该Field值用于标识该Java类的序列化版本,也就是说如果一个类升级后,只要它的serialVersionUID Field值保持不变,序列化机制也会把它们当成同一个序列化版本。