一些Java知识点

来源:互联网 发布:有没有类似上瘾网络剧 编辑:程序博客网 时间:2024/04/29 11:54

0,抽象类和接口的区别


           a,就设计理念来说,.abstract class 在 Java 语言中表示的是一种继承关系,即“is-a”的关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface,表示的是“like-a”关系
          b,就结构而言,abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是static final的,实现类中不能重新定义,也不能改变其值,不过在 interface中一般不定义数据成员),所有的成员方法都是publicabstract 的。
          c,就实现类而言,实现类必须实现抽象类中的抽象方法,而对于接口中的所有方法都要得到实现


1.hashtable和hashmap有什么区别? 
 
         a.hashtable是继承自陈旧的dictionary类的,hashmap继承自abstractmap类同时是java 1.2引进的map接口的一个实现。 
         b.也许最重要的不同是hashtable的方法是同步的,而hashmap的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个hashtable,但你必须同样地为一个hashmap提供外同步。一个方便的方法就是利用collections类的静态的synchronizedmap()方法, 它创建一个线程安全的map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的hashmap。这么做的结果就是当你不需要同步时,你不能切断hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。 
         c.第三点不同是,只有hashmap可以让你将空值作为一个表的条目的key或value。 hashmap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。 
如果有必要,用containkey()方法来区别这两种情况。 
         d.hashmap去掉了hashtable的contains方法,保留了containsvalue和containskey方法 
         e.hashtable中hash数组默认大小是11,增加的方式是 old*2+1。hashmap中hash数组的默认大小是16,而且一定是2的指数 

2,Java中Vector和ArrayList的区别


           首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector(已废弃)和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。3个具体实现类的相关区别如下:

          a.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
         b.Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。
          c.LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随机访问和遍历速度比较慢。另外,他还提供了List接口中没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。


3,Java中创建一个对象有哪几种方法,区别是什么?

       a.用new语句创建对象,这是最常用的创建对象的方式。
       b.运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法。
       c.调用对象的clone()方法。
       d.运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法(对象的序列化与反序列化)。


4.多线程有几种表示方法,都是什么?同步有几种实现方法,都是什么?

线程实现方法:


       (1)继承Thread类,重写run函数, 开启线程:对象.start() //启动线程,run函数运行
       (2)实现Runnable接口,重写run函数
       (3)实现Callable接口,重写call函数

         Callable是类似于Runnable的接口,实现Callable接口的类和实现Runnable的类都是可被其它线程执行的任务。Callable和Runnable有几点不同:

              1.Callable规定的方法是call(),而Runnable规定的方法是run(). 
              2.Callable的任务执行后可返回值,而Runnable的任务是不能返回值的
              3.call()方法可抛出异常,而run()方法是不能抛出异常的。 
              4.运行Callable任务可拿到一个Future对象,Future表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果.通过Future对象可了解任务执行情况,可取消任务的执行,还可获取任务执行的结果

同步方法:

     a  wait方法:
       该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。
       调用wait方法需要注意几点:
       第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。
       第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足却继续执行的情况。
       第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态。
       第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行。


    b  notify方法和notifyAll方法:

       notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。
       notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。

    c  synchronized关键字:
       第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁,this。
       第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁,class。
       第三点:synchronized修饰一个代码块。类似这样:synchronized(obj) { //code.... }。表示一个线程要执行该代码块,必须获得obj的锁。这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用对整个对象加锁。利用零长度的byte数组对象做obj非常经济。


5.描述一下Java中的异常机制,什么是Checked Exception, Unchecked Exception?
      当JAVA程序违反了JAVA的语义规则时,JAVA虚拟机就会将发生的错误表示为一个异常。违反语义规则包括2种情况。一种是JAVA类库内置的语义检查。例如数组下标越界,会引发IndexOutOfBoundsException;访问null的对象时会引发NullPointerException。另一种情况就是JAVA允许程序员扩展这种语义检查,程序员可以创建自己的异常,并自由选择在何时用throw关键字引发异常。所有的异常都是java.lang.Thowable的子类。

     a、任何的异常都是Throwable类,并且在它之下包含两个字类Error和Exception。RuntimeException是Exception的子类。
     b、 除了Error与RuntimeException,其他剩下的异常都是你需要关心的,而这些异常类统称为Checked Exception,至于Error与RuntimeException则被统称为Unchecked Exception。
     c、Error:Error仅在当在Java虚拟机中发生动态连接失败或其它的定位失败的时候,Java虚拟机抛出一个Error对象。
     d、Checked exception:这类异常都是Exception的子类 。异常的向上抛出机制进行处理,如果子类可能产生A异常,那么在父类中也必须throws A异常。可能导致的问题:代码效率低,耦合度过高。(SQLException)
     e、Unchecked exception:  这类异常都是RuntimeException的子类,虽然RuntimeException同样也是Exception的子类,但是它们是特殊的,它们不能通过client code来试图解决,所以称为Unchecked exception。(NullPointerException)
     f、当程序执行过程中,遇到uncheck exception,则程序中止,不再执行之后的代码。

6.描述一下Java ClassLoader 或者 J2EE ClassLoader的工作原理?

ClassLoader的工作原理 

     每个运行中的线程都有一个成员contextClassLoader,用来在运行时动态地载入其它类系统默认的contextClassLoader是systemClassLoader,所以一般而言java程序在执行时可以使用JVM自带的类、$JAVA_HOME/jre/lib/ext/中的类和$CLASSPATH/中的类可以使用Thread.currentThread().setContextClassLoader(...);更改当前线程的contextClassLoader,来改变其载入类的行为 

   ClassLoader被组织成树形,一般的工作原理是: 
       1) 线程需要用到某个类,于是contextClassLoader被请求来载入该类 
       2) contextClassLoader请求它的父ClassLoader来完成该载入请求 
       3) 如果父ClassLoader无法载入类,则contextClassLoader试图自己来载入 

   Java中一共有四个类加载器,之所以叫类加载器,是程序要用到某个类的时候,要用类加载器载入内存。 
         这四个类加载器分别为:Bootstrap ClassLoader、Extension ClassLoader、AppClassLoader和URLClassLoader,他们的作用其实从名字就可以大概推测出来了。其中         AppClassLoader在很多地方被叫做System ClassLoader 


0 0
原创粉丝点击