Csdn乐知——IT就业培训专家
http://www.tjitcast.com
72、什么时候用assert。
assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion就是在程序中的一条语句,它对一个boolean表达式进行检查,一个正确程序必须保证这个boolean表达式的值为true;如果该值为false,说明程序已经处于不正确的状态下,assert将给出警告或退出。一般来说,assertion用于保证程序最基本、关键的正确性。assertion检查通常在开发和测试时开启。为了提高性能,在软件发布后,assertion检查通常是关闭的。
package com.huawei.interview;
public class AssertTest { }
/**
* @param args */
public static void main(String[] args) { }
// TODO Auto-generated method stub int i = 0; for(i=0;i<5;i++) { }
//假设程序不小心多了一句--i; --i;
assert i==5;
System.out.println(i);
73、java中会存在内存泄漏吗,请简单描述。
所谓内存泄露就是指一个不再被程序使用的对象或变量一直被占据在内存中。java中有垃圾回收机制,它可以保证一对象不再被引用的时候,即对象变成了孤儿的时候,对象将自动被垃圾回收器从内存中清除掉。由于Java 使用有向图的方式进行垃圾回收管理,可以消除引用循环的问题,例如有两个对象,相互引用,只要它们和根进程不可达的,那么GC也是可以回收它们的,例如下面的代码可以看到这种情况的内存回收:
package com.huawei.interview;
import java.io.IOException;
public class GarbageTest {
Csdn乐知——IT就业培训专家
http://www.tjitcast.com
private static class Person {
private static void gcTest() throws IOException { }
System.in.read(); System.in.read(); System.in.read(); System.in.read(); p1.setMate(p2); p2.setMate(p1);
System.out.println(\); System.in.read(); System.in.read(); System.gc();
System.out.println(\);
Person p2 = new Person();
Person p1 = new Person(); /**
* @param args
* @throws IOException */
public static void main(String[] args) throws IOException { }
// TODO Auto-generated method stub try { }
System.out.println(\); System.in.read(); System.in.read();
System.out.println(\); for(int i=0;i<100;i++) { }
System.gc(); System.in.read(); System.in.read(); gcTest();
// TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) {
Csdn乐知——IT就业培训专家
http://www.tjitcast.com
}
}
byte[] data = new byte[20000000]; Person mate = null;
public void setMate(Person other) { }
mate = other;
java中的内存泄露的情况:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄露,尽管短生命周期对象已经不再需要,但是因为长生命周期对象持有它的引用而导致不能被回收,这就是java中内存泄露的发生场景,通俗地说,就是程序员可能创建了一个对象,以后一直不再使用这个对象,这个对象却一直被引用,即这个对象无用但是却无法被垃圾回收器回收的,这就是java中可能出现内存泄露的情况,例如,缓存系统,我们加载了一个对象放在缓存中(例如放在一个全局map对象中),然后一直不再使用它,这个对象一直被缓存引用,但却不再被使用。
检查java中的内存泄露,一定要让程序将各种分支情况都完整执行到程序结束,然后看某个对象是否被使用过,如果没有,则才能判定这个对象属于内存泄露。
下面内容来自于网上(主要特点就是清空堆栈中的某个元素,并不是彻底把它从数组中拿掉,而是把存储的总数减少,本人写得可以比这个好,在拿掉某个元素时,顺便也让它从数组中消失,将那个元素所在的位置的值设置为null即可):
我实在想不到比那个堆栈更经典的例子了,以致于我还要引用别人的例子,下面的例子不是我想到的,是书上看到的,当然如果没有在书上看到,可能过一段时间我自己也想的到,可是那时我说是我自己想到的也没有人相信的。 public class Stack {
private Object[] elements=new Object[10]; private int size = 0;
public void push(Object e){ ensureCapacity(); elements[size++] = e; }
public Object pop(){ if( size == 0)
throw new EmptyStackException(); return elements[--size]; }
private void ensureCapacity(){ if(elements.length == size){ Object[] oldElements = elements;
Csdn乐知——IT就业培训专家
http://www.tjitcast.com
elements = new Object[2 * elements.length+1];
System.arraycopy(oldElements,0, elements, 0, size); } } }
上面的原理应该很简单,假如堆栈加了10个元素,然后全部弹出来,虽然堆栈是空的,没有我们要的东西,但是这是个对象是无法回收的,这个才符合了内存泄露的两个条件:无用,无法回收。
但是就是存在这样的东西也不一定会导致什么样的后果,如果这个堆栈用的比较少,也就浪费了几个K内存而已,反正我们的内存都上G了,哪里会有什么影响,再说这个东西很快就会被回收的,有什么关系。下面看两个例子。 例子1
public class Bad{
public static Stack s=Stack(); static{
s.push(new Object());
s.pop(); //这里有一个对象发生内存泄露
s.push(new Object()); //上面的对象可以被回收了,等于是自愈了 } }
因为是static,就一直存在到程序退出,但是我们也可以看到它有自愈功能,就是说如果你的Stack最多有100个对象,那么最多也就只有100个对象无法被回收其实这个应该很容易理解,Stack内部持有100个引用,最坏的情况就是他们都是无用的,因为我们一旦放新的进取,以前的引用自然消失!
74、下面程序的输出结果是多少?
import java.util.Date;
public class Test extends Date{
/**
* @param args add by zxx ,Dec 9, 2008 */
public static void main(String[] args) {
// TODO Auto-generated method stub new Test().test();
Csdn乐知——IT就业培训专家
http://www.tjitcast.com
}
很奇怪,结果是Test
这属于脑筋急转弯的题目,在一个qq群有个网友正好问过这个问题,我觉得挺有趣,就研究了一下,没想到今天还被你面到了,哈哈。
在test方法中,直接调用getClass().getName()方法,返回的是Test类名 由于getClass()在Object类中定义成了final,子类不能覆盖该方法,所以,在 test方法中调用getClass().getName()方法,其实就是在调用从父类继承的getClass()方法,等效于调用
super.getClass().getName()方法,所以,
super.getClass().getName()方法返回的也应该是Test。 如果想得到父类的名称,应该用如下代码:
getClass().getSuperClass().getName();
}
public void test() { }
System.out.println( );
super.getClass().getName()
75、说出一些常用的类,包,接口,请各举5个
要让人家感觉你对java ee开发很熟,所以,不能仅仅只列core java中的那些东西,要多列你在做ssh项目中涉及的那些东西。就写你最近写的那些程序中涉及的那些类。
常用的类:BufferedReader BufferedWriter FileReader FileWirter String Integer java.util.Date,System,Class,List,HashMap
常用的包:java.lang java.io java.util
java.sql ,javax.servlet,org.apache.strtuts.action,org.hibernate 常用的接口:Remote List Map Document
NodeList ,Servlet,HttpServletRequest,HttpServletResponse,Transaction(Hibernate)、Session(Hibernate),HttpSession