zoukankan      html  css  js  c++  java
  • java新知识系列 五

    1. 类方法和对象方法的使用限制
    2. abstract修饰符的注意
    3. 静态变量只能在类主体中定义,不能在方法中定义
    4. 线程的各种方法差别
    5. 关于抽象类
    6. 什么是中间件
    7. Servlet生命周期的三个主要方法
    8. 可以修饰类的修饰符
    9. HashMap和HashTable之间的源码分析,以及性质不同的对比;
    10. HashMap的性质总结,解决冲突的三种方法;
     
     
     
     
    类方法和对象方法的使用限制
    类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量
    类方法是属于整个类的,而实例方法是属于类的某个对象的。
    由于类方法是属于整个类的,并不属于类的哪个对象,所以类方法的方法体中不能有与类的对象有关的内容。即类方法体有如下限制:
    (1) 类方法中不能引用对象变量;
    (2) 类方法中不能调用类的对象方法;
    (3) 在类方法中不能使用super、this关键字。
    (4)类方法不能被覆盖。
    如果违反这些限制,就会导致程序编译错误。
    与类方法相比,对象方法几乎没有什么限制:
    (1) 对象方法中可以引用对象变量,也可以引用类变量;
    (2) 对象方法中可以调用类方法;
    (3) 对象方法中可以使用super、this关键字。
     
     
    abstract修饰符的注意
    abstract修饰符用来修饰类和成员方法
    1:用abstract修饰的类表示抽象类,抽象类位于继承树的抽象层,抽象类不能被实例化。
    2:用abstract修饰的方法表示抽象方法,抽象方法没有方法体。抽象方法用来描述系统具有什么功能,但不提供具体的实现。
    abstract 规则:
    1:抽象类可以没有抽象方法,但是有抽象方法的类必须定义为抽象类,如果一个子类继承一个抽象类,子类没有实现父类的所有抽象方法,那么子类也要定义为抽象类,否则的话编译会出错的。
    2:抽象类没有构造方法,也没有抽象静态方法。但是可以有非抽象的构造方法。
    3:抽象类不能被实例化,但是可以创建一个引用变量,类型是一个抽象类,并让它引用非抽象类的子类的一个实例 。
    4:不能用final 修饰符修饰。
     
     
    线程的各种方法差别
    run()方法用来执行线程体中具体的内容
    start()方法用来启动线程对象,使其进入就绪状态
    sleep()方法用来使线程进入睡眠状态
    suspend()方法用来使线程挂起,要通过resume()方法使其重新启动
     
    关于抽象类
    1、抽象类不能被实例化,实例化的工作应该交由它的子类来完成,它只需要有一个引用即可。
    2、抽象方法必须由子类来进行重写。
    3、只要包含一个抽象方法的类,该类必须要定义成抽象类,不管是否还包含有其他方法。
    4、抽象类中可以包含具体的方法,当然也可以不包含抽象方法。
    5、abstract不能与final并列修饰同一个类。
    6、abstract 不能与private、static、final或native并列修饰同一个方法。、
     
     
     
    什么是中间件
    中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。
    (简单来说,中间件并不能提高内核的效率,一般只是负责网络信息的分发处理)
    中间件特点的描述:
    1.中间件应支持标准的协议和接口
    2.中间件可运行于多种硬件和操作系统平台上
    3.跨越网络,硬件,操作系统平台的应用或服务可通过中间件透明交互
     
    Servlet生命周期的三个主要方法
     
    Servlet的生命周期一般可以用三个方法来表示:
    1. init():仅执行一次,负责在装载Servlet时初始化Servlet对象 ,它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。
    2. service() :核心方法,一般HttpServlet中会有get,post两种处理方式。在调用doGet和doPost方法时会构造servletRequest和servletResponse请求和响应对象作为参数。 在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。
    3. destory():在停止并且卸载Servlet时执行,负责释放资源, 一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
    初始化阶段:Servlet启动,会读取配置文件中的信息,构造指定的Servlet对象,创建ServletConfig对象,将ServletConfig作为参数来调用init()方法。
     
    可以修饰类的修饰符
    普通类(外部类):只能用public、default(不写)、abstract、final修饰。
    (成员)内部类:可理解为外部类的成员,所以修饰类成员的public、protected、default、private、static等关键字都能使用。
    局部内部类:出现在方法里的类,不能用上述关键词来修饰。
    匿名内部类:给的是直接实现,类名都没有,没有修饰符。
     
    HashMap和HashTable之间的源码分析,以及性质的不同对比;
    1:源码分析;
     
    //HashMap的源码
    public class HashMap<K,V>
    extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable
    -----------------------------------
    //Hashtable的源码
    public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable
    ----------------------------------
    都实现了Map接口
    ----------------------------------------------------------------------------------------------
     
    public V put(K key, V value) //HashMap的put方法,没有同步
    public synchronized V put(K key, V value) //Hashtable的put方法
    //当然,Hashtable的其他方法,如get,size,remove等方法,
    //都加了synchronized关键词同步操作
    ------------------------------------------------------------------------------------------------
    //Hashtable的put方法有以下语句块,大伙看了都知道
    // Make sure the value is not null
    if (value == null) {
    throw new NullPointerException();
    }
    //那么,我们再来看下HashMap的put方法中,有如下语句
    //调用某个方法直接把key为null,值为value的键值对插入进去。
    if (key == null)
    return putForNullKey(value);
    --------------------------------------------------------------------------------------
    //以下是Hashtable的方法
    public synchronized boolean contains(Object value)
    public synchronized boolean containsKey(Object key)
    public boolean containsValue(Object value)
    //以下是HashMap中的方法,注意,没有contains方法。
    public boolean containsKey(Object key)
    public boolean containsValue(Object value)
    2. Hashtable和HashMap的区别:
    a) 继承不同。
    public class Hashtable extends Dictionary implements Map
    public class HashMap extends AbstractMap implements Map
    b) Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。在多线程并发的环境下,可以直接使用Hashtable,但是要使用HashMap的话就要自己增加同步处理了。
    c) Hashtable中,keyvalue都不允许出现null值。 在HashMap中,null可以作为键,这样的键只有一个;可以有一个或多个键所对应的值为null。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而应该用containsKey()方法来判断。
    d) 两个遍历方式的内部实现上不同。Hashtable、HashMap都使用了Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
    e) 哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
    f) Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
     
    注: HashSet子类依靠hashCode()和equal()方法来区分重复元素。
    HashSet内部使用Map保存数据,即将HashSet的数据作为Map的key值保存,这也是HashSet中元素不能重复的原因。而Map中保存key值的,会去判断当前Map中是否含有该Key对象,内部是先通过key的hashCode,确定有相同的hashCode之后,再通过equals方法判断是否相同。
     
    HashMap的性质总结,解决冲突的三种方法;
     
    a) HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的底层结构是一个数组,数组中的每一项是一条链表。
    b) HashMap的实例有俩个参数影响其性能: “初始容量” 和 装填因子。
    c) HashMap实现不同步,线程不安全。 HashTable线程安全
    d) HashMap中的key-value都是存储在Entry中的。
    e) HashMap可以存null键和null值,不保证元素的顺序恒久不变,它的底层使用的是数组和链表,通过hashCode()方法和equals方法保证键的唯一性
    f) HashMap是采用拉链法解决哈希冲突的。
    解决冲突主要有三种方法:定址法,拉链法,再散列法
     
    1:链表法是将相同hash值的对象组成一个链表放在hash值对应的槽位;
    2:用开放定址法:当冲突发生时,使用某种探查(亦称探测)技术在散列表中形成一个探查(测)序列。 沿此序列逐个单元地查找,直到找到给定 的关键字,或者碰到一个开放的地址(即该地址单元为空)为止(若要插入,在探查到开放的地址,则可将待插入的新结点存人该地址单元)。
    3:拉链法解决冲突的做法是: 将所有关键字为同义词的结点链接在同一个单链表中 。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于1,但一般均取α≤1。拉链法适合未规定元素的大小。

  • 相关阅读:
    DHCP服务搭建
    JumpServer跳板机
    PXE
    DNS
    MySQL
    企业级LNMP分离式部署
    MHA-Atlas-MySQL高可用集群2
    MHA-Atlas-MySQL高可用集群
    备份全网服务器数据
    FTP
  • 原文地址:https://www.cnblogs.com/liguo-wang/p/9741351.html
Copyright © 2011-2022 走看看