`

java笔试

阅读更多
93、简述JAVA代码安全性
答:类加载器(class loader)加载程序运行所需要的所有类,它通过区分本机
文件系统的类和网络系统导入的类增加安全性,这可以限制任何的特洛伊木马程
序,因为本机类总是先被加载,一旦所有的类被加载完,执行文件的内存划分就
固定了,在这个时候特定的内存地址被分配给对应的符号引用,查找表(lookuo
table)也被建立,由于内存划分发生在运行时,解释器在受限制的代码区增加
保护防止未授权的访问;然后字节码校验器(byte code verifier)进行校验,
主要执行下面的检查:类符合JVM 规范的类文件格式,没有违反访问限制,代码
没有造成堆栈的上溢或者下溢,所有操作代码的参数类型都是正确的,没有非法
的数据类型转换(例如将整型数转换成对象类型)发生;校验通过的字节码被解
释器(interpreter)执行,解释器在必要时通过运行时系统执行对底层硬件的
合适调用。
94、简述 java 中的继承
答:Java 中是单继承关系,也就是说一个类只能有一个父类,但是可以同时实
现多个接口;对于接口本身而言,可以继承多个接口。这样做的目的就是为了阻
止因为多继承而造成的的业务对象本身的可读性的降低。
95、简述 java 中的垃圾回收
答:GC 是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出
现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,
Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的
目的,Java 语言没有提供释放已分配内存的显示操作方法。 Java 程序员不用
担心内存管理,因为垃圾收集器会自动进行管理。要请求垃圾收集,可以调用下
面的方法:System.gc() 或Runtime.getRuntime().gc() 。
96、String a=null; if (a!=null && a.length()>10) {...}
   上面面的代码,如果你用“&”替换“&&”将发生什么错误?
答:会抛出空指针异常;&&会短路,只要遇到boolean 值为 false就不会再往后
执行了;而&则是会把两边的运算都执行完。
97、abstract class和 interface有什么区别?
答:声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用
于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现
该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是
一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态
方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也
是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中
实现这些方法。接口(interface)是抽象类的变体。新型多继承性可通过实现
这样的接口而获得。接口中的所有方法都是抽象的,所有成员变量都是 public
static final 的。一个类可以实现多个接口,当类实现接口时,必须实现接口
的所有方法。抽象类在Java 语言中表示的是一种单继承的关系,而接口表示的
是多继承的关系;抽象类中可以定义自己的成员变量,也可以包含非抽象的方法,
而在接口中只能有静态的常量,所有方法必须是抽象的;实现抽象类时可以只实
现其中的部分方法,而要是实现一个接口的话就必须实现这个接口中的所有抽象
方法。
98、String,  StringBuffer  StringBuilder 的区别。
答:String 是不可变的;StringBuffer 是可变的,如果你对字符串中的内容经
常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要
String,那么使用StringBuffer 的toString()方法,并且它是线程安全的;
StringBuilder 是从 JDK 5 开始提供的类,为StringBuffer 该类补充了一个单
个线程使用的等价类;通常应该优先使用 StringBuilder 类,因为它支持所有
相同的操作,但由于它不执行同步,所以速度更快。

101、你认为java与其他(你所了解的)语言相比,有什么优点和缺点?
答:1). Java没有预处理指令。(如C 中的#define , #include , #ifdef 等)。
C 中的常量定义在Java 中用static final来取代。
   2). Java 中没有C 中的全局变量。
   3). Java 中的主类型的size是确定的,而C 中主类型的size跟平台相关。
   4). Java 中没有了指针,它使用了类似的句柄来取代指针,但是Java 中不
允许对句柄进行加减,没有取地址操作符之类的东东。
   5). Java 有垃圾收集机制,不需要自己释放空间。
   6).Java 没有goto语句。Java 在C 提供的控制语句基础上增加了异常处理
和标签break 和 continue语句。这些可以替代 goto 的作用。
   7). C 要求一个方法或块中使用的所有局部变量的定义在该方法或块的最开
始处定义,而Java 允许这些定义在方法或块的任意地方出现。
  . Java 不要求在调用一个函数以前已经定义了该函数,可以在调用点后
面定义。而C 有这个要求。
   9). Java 不支持C 中的strut 和 union类型。Java 支持方法重载。
10). Java 不支持C 中的enum关键字。
    11). Java 不支持C 中的bitfields 能力。
    12). Java 不支持C 的typedef。
    13). Java 不支持C 的方法指针。
    14). Java不支持C 的可变参数表。
   java和.net 的都不适合做桌面程序,这两个比较适合写WEB 的程序;
c++比较适合写桌面程序c++/java都是强类型的静态预编译型语言。优点是结构
性强,程序可读性好,开发效率高,适合开发大型应用。就本人的经验而言,java
的开发效率优于c++,实际上java大行其道的首要因素就是它够简单。java尤
其不适合开发桌面程序,GUI 的API 一直都是 java 的弱点;
   perl/python 是动态解释型语言。perl 是弱类型的而python 是强类型的,后
者的变量一旦赋值,就拥有了类型,不能再赋其他类型的值。不象
javascript/perl可以随便定义。perl 是unix 下的王牌工具,在缺乏 IDE 的字
符界面下,很好地弥补了unix;
   shell/utility 的不足,并且部分继承了面向对象语言的灵活性。适合用来
搭建大程序。 
111、异常机制中try{}后一定要跟 catch和 finally 吗?
答:一定要有 catch 或者 finally,catch 子句紧跟在 try块后面,用来指定你
想要捕捉的“异常”的类型。如果有 catch 的话,可以没有finally。
114、Anonymous Inner Class (匿名内部类)  是否可以extends(继承)其它类,是
否可以 implements(实现)interface(接口)?
答:匿名内部类是可以继承其它类,同样也可以去实现接口的,用法为:
   JButton button = new JButton();
   button.addActionListener(new ActionListener()
   {
   public void actionPerformed(ActionEvent e){//some mothod...}
   });
     这样的用法在 swing编程中是经常使用的,就是因为它需要用到注册监听器
机制,而该监听类如果只服务于一个组件,那么,将该类设置成内部类/匿名类是
最方便的。

115、Java 的接口和C++的虚类的相同和不同处。
答:由于Java  不支持多继承,而有可能某个类或对象要使用分别在几个类或对
象里面的方法或属性,现有的单继承机制就不能满足要求。与继承相比,接口有
更高的灵活性,因为接口中没有任何实现代码。当一个类实现了接口以后,该类
要实现接口里面所有的方法和属性,并且接口里面的属性在默认状态下面都是
public  static,所有方法默认情况下是 public.一个类可以实现多个接口。
117、接口是否可继承接口?  抽象类是否可实现接口?  抽象类是否可继承实体
类?
答:接口是可以继承接口的并且可以继承多个其它接口;抽象类可以实现接口中
的方法;抽象类可以继承实体类。
120、什么是java 序列化,如何实现java 序列化?
答:序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进
行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之
间。序列化是为了解决在对对象流进行读写操作时所引发的问题;
序列化的实现:将需要被序列化的类实现 Serializable 接口,该接口没有需实现
的方法,implements Serializable 只是为了标注该对象是可被序列化的,然后使
用一个输出流(如FileOutputStream)来构造一个ObjectOutputStream(对象流)对
象,接着,使用 ObjectOutputStream 对象的writeObject(Object obj)方法就可以
将参数为 obj 的对象写出(即保存其状态),要恢复的话则用输入流。

124、UDP 和TCP 连接有和异同?
答:TCP 协议是面向连接的,每个数据包的传输过程是:先建立链路、数据传输、
然后清除链路。数据包不包含目的地址。受端和发端不但顺序一致,而且内容相
同。它的可靠性高;UDP 协议是面向无连接的,每个数据包都有完整的源、目的
地址及分组编号,各自在网络中独立传输,传输中不管其顺序,数据到达收端后
再进行排序组装,遇有丢失、差错和失序等情况,通过请求重发来解决。它的效
率比较高。
129、java  中会存在内存泄露吗?请简单描述。
答:内存泄露是指系统中存在无法回收的内存,有时候会造成内存不足或系统崩
溃。Java 存在内存泄露。Java 中的内存泄露当然是指:存在无用但是垃圾回收
器无法回收的对象。而且即使有内存泄露问题存在,也不一定会表现出来。自己
实现堆栈的数据结构时有可能会出现内存泄露。
86、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
答:多线程有两种实现方法:继承Thread 类或者实现 Runnable 接口。
     实现同步也有两种方法:一种是同步方法,另一种是同步代码块。
     同步方法是在方法返回类型前面加上synchronized 关键字
     同步代码块是synchronized (这里写需要同步的对象){...}
132、sleep()和wait()有什么区别?
答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行
机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用 sleep不会
释放对象锁。
    wait 是Object类的方法,对此对象调用wait 方法导致本线程放弃对象锁,
进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)
后本线程才进入对象锁定池准备获得对象锁进入运行状态。
133、同步和异步有何异同,在什么情况下分别使用他们?请举例说明
答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,
或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,
必须进行同步存取。当应用程序在对象上调用了一个需要花费很长时间来执行的
方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况
下采用异步途径往往更有效率。
134、进程和线程分别该怎么理解?
答:进程是资源分配的基本单位。所有与该进程有关的资源,都被记录在进程控
制块PCB 中。以表示该进程拥有这些资源或正在使用它们。另外,进程也是抢占
处理机的调度单位,它拥有一个完整的虚拟地址空间。
    与进程相对应,线程与资源分配无关,它属于某一个进程,并与进程内的其
他线程一起共享进程的资源。当进程发生调度时,不同的进程拥有不同的虚拟地
址空间,而同一进程内的不同线程共享同一地址空间。
    线程只由相关堆栈(系统栈或用户栈)寄存器和线程控制表TCB 组成。寄存
器可被用来存储线程内的局部变量,但不能存储其他线程的相关变量。
    发生进程切换与发生线程切换时相比较,进程切换时涉及到有关资源指针的
保存以及地址空间的变化等问题;线程切换时,由于同不进程内的线程共享资源
和地址 空间,将不涉及资源信息的保存和地址变化问题,从而减少了操作系统
的开销时间。而且,进程的调度与切换都是由操作系统内核完成,而线程则既可
由操作系统内 核完成,也可由用户程序进行。
135、死锁的必要条件?怎么克服?
答:产生死锁的四个必要条件:
互斥条件:一个资源每次只能被一个进程使用。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要
上述条件之一不满足,就不会发生死锁。
    死锁的解决方法:
    a 撤消陷于死锁的全部进程;
    b 逐个撤消陷于死锁的进程,直到死锁不存在;
    c从陷于死锁的进程中逐个强迫放弃所占用的资源,直至死锁消失。
    d 从另外一些进程那里强行剥夺足够数量的资源分配给死锁进程,以解除死
锁状态
136、谈谈对ClassLoader 的理解?
答:ClassLoader 加载类用的是全盘负责委托机制。所谓全盘负责,即是当一个
classloader 加载一个 Class 的时候,这个Class 所依赖的和引用的所有 Class
也由这个classloader 负责载入,除非是显式的使用另外一个classloader 载入;
委托机制则是先让 parent(父)类加载器(而不是super,它与parent classloader
类不是继承关系)寻找,只有在parent 找不到的时候才从自己的类路径中去寻找。
此外类加载还采用了 cache 机制,也就是如果 cache 中保存了这个Class 就直
接返回它,如果没有才从文件中读取和转换成 Class,并存入cache,这就是为
什么我们修改了 Class 但是必须重新启动JVM 才能生效的原因。
142、ArrayList 和Vector 的区别?
答:同步性:Vector 是线程安全的,也就是说是同步的,而ArrayList 是线程不安
全的,不是同步的;数据增长:当需要增长时,Vector  默认增长为原来一培,而
ArrayList 却是原来的一半。
143、HashMap 和 Hashtable 的区别?
答:HashMap 是 Hashtable 的轻量级实现(非线程安全的实现),他们都完成了
Map 接口,主要区别在于 HashMap 允许空(null)键值(key),由于非线程安
全,效率上可能高于 Hashtable。HashMap 允许将 null 作为一个 entry  的 key
或者value,而 Hashtable 不允许。HashMap 把 Hashtable 的contains 方法去
掉了,改成 containsvalue 和 containsKey。因为contains 方法容易让人引起误
解。Hashtable  继承自 Dictionary  类,而 HashMap  是 Java1.2             引进的 Map
interface 的一个实现。
最大的不同是,Hastable 的方法是synchronize 的,而HashMap 不是,在多个
线程访问 Hashtable 时,不需要自己为它的方法实现同步,而HashMap  就必须
为之提供外同步。
146、请说出ArrayList,Vector, LinkedList 的存储性能和特性
答:ArrayList 和Vector 都是使用数组方式存储数据,此数组元素数大于实际存
储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素
要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector  由于使
用了synchronized 方法(线程安全),通常性能上较ArrayList 差,而 LinkedList
使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数
据时只需要记录本项的前后项即可,所以插入速度较快。
147、JAVA 中常用的XML 解析技术有哪些?区别是什么?
答: DOM、SAX 两种方式。
DOM:处理大型文件时其性能下降的非常厉害。这个问题是由DOM 的树形结构所
造成的,该结构占用的内存较多,而且DOM 必须在解析文件之前把整个文档载入
内存,适合对XML 的随机访问。
SAX:不同于DOM,SAX 是事件驱动型的XML 解析方法。它顺序读取XML 文件,不
需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标
签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理
XML 文件,适合对XML 的顺序访问。

148、XML 文档定义有几种形式?有何本质区别?
答:两种形式 dtd和 schema,区别:
    a.Schema 是标准的XML 文件,而 DTD 则使用自己的特殊语法,因此,只需要知
道XML 的语法规则就可以编写Schema 了,不需要再学习其它语法规则。
    b.Schema利用命名空间将文件中特殊的节点与Schema说明相联系,一个XML
文件可以有多个对应的 Schema;而一个XML 文件只能有一个相对应的DTD 文件。
    c.Schema 的内容模型是开放的,可以随意扩充,而 DTD 则无法解读扩充的内
容.DTD只能把文件类型定义为一个字符串,而Schem允许把文件类型定义为整数,
浮点数,字符串,布尔值或其他各数据类型,而无须重新定义。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics