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。拉链法适合未规定元素的大小。

  • 相关阅读:
    file is universal (3 slices) but does not contain a(n) armv7s slice error for static libraries on iOS
    WebImageButton does not change images after being enabled in Javascript
    ajax OPTION
    编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
    获取海洋天气预报
    C#线程系列教程(1):BeginInvoke和EndInvoke方法
    js控制只能输入数字和小数点
    Response.AddHeader(,)
    ManualResetEvent的理解
    Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse、(int) 区别
  • 原文地址:https://www.cnblogs.com/liguo-wang/p/9741351.html
Copyright © 2011-2022 走看看