JAVA问题集合

原创 2005年04月22日 15:40:00

发表于: 2003-08-27 08:58    发表主题: JAVA问题集合

作者:猫小                来源:http://bbs.chinaunix.net/forum/viewtopic.php?t=148099 

推荐此帖为精华,以便版主设置 举报此帖,以便版主处理 引用并回复

1. 问:怎样用 Win95 的记事本 (Notepad) 来编辑 Java源程序?

答:记得存档时扩展名要加上".java",文件类型改成:“所有的文件(*.*)”。



2. 问:到底 Java 是如何传递参数的?是by value或by reference?

答:All parameters (values of primitive types, and values that are references to objects) are passed by value [JLS sect 8.4.1]。根据以上 Java规格文件的说法, 所有参数应该都是传值的(by value)。但实际上, 实际经验却告诉我们所有 Java 的对象都是传址的(by reference)。因此我们可以这样解释: 基本类型(如int, float, char等)是by value,而所谓“对象”(Object)则是by value of reference to object。



3. 问:String这个类型的class为何定义成final?

答: 主要是为了“效率” 和 “安全性” 的缘故。若 String允许被继承, 由于它的高度被使用率, 可能会降低程序的性能,所以String被定义成final。



4. 问:finalizers和C++ 的 destructors有何差异?

答:Java内部具有“内存使用回收” 的机制, 虽然它也提供了类似 (C++ 的) destructors的 finalize(),每个对象都可以使用这个方法 method,但必须冒著破坏原先回收机制的危险。所以建议尽量避免使用finalize(),不妨考虑多使用 null 及 dispose() 来释出资源会好一些。



5. 问:继承了一个class叫做 Frotz,编译器却给我“No constuctor Frotz() in the class”这样的错误提示,为什么呢?

答:记住每当您定义了一个 class的constructor,除非您一开始就去call 这个constructor,否则 Java 会自动引入superclass原先不含参数的 constructor, 如果superclass的 constructor都是有参数的,那么问题中的错误提示便出现了。 解决的方法很简单, 找一找 API文件,加上正确的参数就得了。



6. 问:怎样让char类型的东西转换成int类型?

答:

char c = 'A';

int i = c;

//反过来只要作强制类型转换就行了

c = (char) I;



7. 问:我的applet原先好好的, 一放到web server就会有问题,为什么?

答:一般来说,从以下方向试试:

确定class文件的格式没错——已经编译过,也没有损坏的情形;

确定所有用到的class文件放到web server上,少一个都不行;

确定所有的文件名和class名称一致,特别检查大小写有无差错;

如果程序中用到package,web server上的目录就要当心了。譬如您在class中宣告了一个叫COM.foo.util的package,那么web server的applet codebase目录底下就非得有 COM/foo/util这个子目录不可。(注意目录名称也有大小写之分);

web server上的文件档案应该事先设定好。(尤其是search,read和execute权限)



8. 问:怎样在 Applet中用某个图形涂满整个背景?

答:在背景建立 Panel 或 Canvas, 然後用图形填满它。



9. 问:怎样在 Applet 中建立自己的菜单(MenuBar/Menu)?

答:首先在Applet的init() 方法中建立Frame instance, 然后将Menus, Menubar都加上去即可。 (setMenuBar() 是 Frame下的方法)或者,找到Applet上层的Frame后依法炮制。

Container parent = getParent();

while (! (parent instanceof Frame) )

parent = parent.getParent();

Frame theFrame = (Frame) parent;

注意:第二个方法在Mac或某些browsers上并不可行。

如果您使用的是JDK 1.1,也可以考虑使用popup menu,这样就不必理会Frame的问题了。



10. 怎样比较两个类型为String的字符串?

答:在两个对象之间使用 "==",会将“两个对象是否有同一reference”的结果传回。也就是说, 这等同于“两个对象是否拥有同一地址 (address)”,或者“两个对象物件是否为同一对象”。如果您的意思是判断两个字符串的内容是否相同,那么应该使用以下的方法才对:

if (s1.equals(s2) )

or if (s1.equalsIgnoreCase(s2) )

or if (s1.startsWith(s2) )

or if (s1.endsWith(s2) )

or if (s1.regionMatches(s1_offset, s2, s2_offset, length) )

or if (s1.compareTo(s2) <0)



11. 怎样将浮点数(float)相加 ? Float 好像没有办法?

答:我猜想您的程式大概写成这样:

Float One;

Float Two;

Float Hard = One + Two;

请注意 float 和 Float 是不同的,前者是 Java 基本类型之一, 而后者却是class。您应该将源代码改为:

float One;

float Two;

float Hard = One + Two;



Float One = new Float(1.0);

Float Two = new Float(2.0);

Float Hard = new Float(One.floatValue() + Two.floatValue());



12. 如何将字串String转换成整数int?

答:有两个方法:

1)int i = Integer.parseInt([String]); 或



i = Integer.parseInt([String],[int radix]);

2)int i = Integer.valueOf(my_str).intValue();

注: 字串转成Double, Float, Long的方法大同小异。



13. 如何将整数 int 转换成字串 String?

答:有三种方法:

1)String s = String.valueOf(i);

2)String s = Integer.toString(i);

3)String s = "" + i;

注:Double, Float, Long 转成字串的方法大同小异。



14. 如何从一个文件档案的尾端新增记录?

答:有两种方法:

1)RandomAccessFile fd = new RandomAccessFile(file,"rw");

fd.seek(fd.length());

然后使用 fd 的method写入

2)使用FileOutputStream(String name,boolean append) throws IOException这个 constructor



15. 如何设置Java 2(JDK1.2)的环境变量?

答:Java 2安装后,需要设置PATH和JAVA_HOME环境变量。与JDK1.1不同的是:设置好JAVA_HOME环境变量后,JVM将自动搜索系统类库以及用户的当前路径。Java 2环境变量的设置如下例所示:

Solaris平台: setenv JAVA_HOME Java2的安装路径
setenv PATH $JAVA_HOME/bin:${PATH}

Windows平台:set JAVA_HOME=Java2的安装路径
set PATH=$JAVA_HOME/bin;%PATH%



16. 哪些Java集成开发工具支持Java 2?

答:目前流行的Java集成开发环境,如Inprise的Jbuilder;Symantec的Visual Cafe,;Sybase的PowerJ都支持Java 2。



17. 如果在Netscape或IE浏览器中运行Java applet时出现了错误,如何确定错误范围?

答:当java applet在浏览器中运行时,使用的是浏览器本身的缺省JVM。而不同浏览器对JDK的支持程度也不尽相同。因此,在Netscape或IE浏览器中运行Java applet出现了错误,建议使用JDK提供的工具appletviewer或Sun公司的Hotjava浏览器来测试该applet,以确定错误的产生是与浏览器相关。如果applet在appletviewer或Hotjava中运行一切正常,则错误的产生是由于浏览器不完全兼容JDK而引起的。此时,解决方法可以是使用Hotjava浏览器或者安装 Sun公司的Java Plugin。如果applet在Hotjava浏览器或appletviewer中运行即发生错误,则应当根据错误提示检查applet程序。



18. 在Java语言中,如何列出PC机文件系统中的所有驱动器名?

答:在Java 2版本中,java.io包中的File类新增加了方法listRoots()可以实现这一功能。



19. 为什么Runtime.exec("ls")没有任何输出?

答:调用Runtime.exec方法将产生一个本地的进程,并返回一个Process子类的实例,该实例可用于控制进程或取得进程的相关信息。由于调用Runtime.exec方法所创建的子进程没有自己的终端或控制台,因此该子进程的标准IO(如stdin,stdou,stderr)都通过Process.getOutputStream(),Process.getInputStream(),Process.getErrorStream()方法重定向给它的父进程了。用户需要用这些stream来向子进程输入数据或获取子进程的输出。所以正确执行Runtime.exec("ls")的例程如下:

try

{

process = Runtime.getRuntime().exec (command);

InputStreamReader ir=newInputStreamReader(process.getInputStream());

LineNumberReader input = new LineNumberReader (ir);

String line;

while ((line = input.readLine ()) != null)

System.out.println(line);

}

catch (java.io.IOException e){

System.err.println ("IOException " + e.getMessage());

}



20. 若通过ObjectOutputStream向一个文件中多次以追加方式写入object,为什么用ObjectInputStream读取这些object时会产生StreamCorruptedException?

答:使用缺省的serializetion的实现时,一个ObjectOutputStream的构造和一个ObjectInputStream的构造必须一一对应。ObjectOutputStream的构造函数会向输出流中写入一个标识头,而ObjectInputStream会首先读入这个标识头。因此,多次以追加方式向一个文件中写入object时,该文件将会包含多个标识头。所以用ObjectInputStream来deserialize这个ObjectOutputStream时,将产生StreamCorruptedException。

一种解决方法是可以构造一个ObjectOutputStream的子类,并覆盖writeStreamHeader()方法。被覆盖后的writeStreamHeader()方法应判断是否为首次向文件中写入object?若是,则调用super.writeStreamHeader();若否,即以追加方式写入object时,则应调用ObjectOutputStream.reset()方法。



21. 对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中?

答: 目前,没有直接的方法可以将对象写入到随机存取文件中。但是可以使用ByteArray输入/输出流作为中介,来向随机存取文件中写入或从随机存取文件中读出字节,并且可以利用字节流来创建对象输入/输出流,以用于读写对象。需要注意的是在字节流中要包含一个完整的对象,否则读写对象时将发生错误。例如,java.io.ByteArrayOutputStream可用于获取ObjectOutputStream的字节流,从中可得到byte数组并可将之写入到随机存取文件中。相反,我们可以从随机存取文件中读出字节数组,利用它可构造ByteArrayInputStream,进而构造出ObjectInputStream,以读取对象。



22. 在JDK1.1中Thread类定义了suspend()和resume()方法,但是在JDK1.2中已经过时,应使用什么方法来替代之?

答: Thread.suspend本身易于产生死锁。如果一个目标线程对某一关键系统资源进行了加锁操作,然后该线程被suspend,那么除非该线程被resume,否则其它线程都将无法访问该系统资源。如果另外一个线程将调用resume,使该线程继续运行,而在此之前,它也需要访问这一系统资源,则将产生死锁。

因此,在Java 2中,比较流行的方式是定义线程的状态变量,并使目标线程轮询该状态变量,当状态为悬挂状态时,可以使用wait()方法使之处于等待状态。一旦需要该线程继续运行,其它线程会调用notify()方法来通知它。

Java集合面试问题和答案

  • 2017年06月16日 09:52
  • 336KB
  • 下载

Java集合面试问题

  • 2017年07月30日 21:44
  • 17KB
  • 下载

Java 泛型 集合引用赋值问题(或方法传参)

迷茫点A List a = null; List b = null; a = b;//compile error b = a;//compile error 而下面有全可以 Object...

40个Java集合面试问题和答案

1.Java集合框架是什么?说出一些集合框架的优点? 每种编程语言中都有集合,最初的Java版本包含几种集合类:Vector、Stack、HashTable和Array。随着集合的广泛使用,Java1...

Java集合框架面试问题集锦

Java集合框架(例如基本的数据结构)里包含了最常见的Java常见面试问题。很好地理解集合框架,可以帮助你理解和利用Java的一些高级特性。下面是面试Java核心技术的一些很实用的问题。 Q:最...

JAVA实现集合划分问题

/*集合划分问题:  * n个元素的集合{1,2,.,n }可以划分为若干个非空子集。例如,当n=4 时,集合{1,2,3,4}可以划分为15个不同的非空子集如下:  {1},{2},{3},{4...

Java中集合循环删除元素的问题

1、在一个循环中删除一个列表中的元素 思考下面这一段在循环中删除多个元素的的代码 Java代码 ArrayList list = new ArrayList(Array...

Java集合框架总结(3)——TreeSet类的排序问题

TreeSet支持两种排序方法:自然排序和定制排序。TreeSet默认采用自然排序。   1、自然排序     TreeSet会调用集合元素的compareTo(Object obj)方法来比较...

40个Java集合面试问题和答案

40个Java集合面试问题和答案 Java集合框架为Java编程语言的基础,也是Java面试中很重要的一个知识点。这里,我列出了一些关于Java集合的重要问题和答案。 1.Java集合框架是什么?...

protostuff序列化集合的问题(反序列化时的java.util.ConcurrentModificationException)

之前写过一篇关于JDK原始支持的Serializable接口序列化与Google的Protostuff序列化两种技术的比较(http://blog.csdn.net/canot/article/det...
  • canot
  • canot
  • 2017年06月10日 16:39
  • 996
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JAVA问题集合
举报原因:
原因补充:

(最多只允许输入30个字)