java基础知识点收集整理

对一种特殊的资源——对象中的内存——Java提供了内建的机制来防止它们的冲突。由于我们通常将数据元素设为从属于private(私有)类,然后只通过方法访问那些内存,所以只需将一个特定的方法设为synchronized(同步的),便可有效地防止冲突。在任何时刻,只可有一个线程调用特定对象的一个synchronized方法(尽管那个线程可以调用多个对象的同步方法)。下面列出简单的synchronized方法:  
  synchronized   void   f()   {   /*   ...   */   }  
  synchronized   void   g()   {   /*   ...   */   }  
  每个对象都包含了一把锁(也叫作“监视器”),它自动成为对象的一部分(不必为此写任何特殊的代码)。调用任何synchronized方法时,对象就会被锁定,不可再调用那个对象的其他任何synchronized方法,除非第一个方法完成了自己的工作,并解除锁定。在上面的例子中,如果为一个对象调用 f(),便不能再为同样的对象调用g(),除非f()完成并解除锁定。因此,一个特定对象的所有synchronized方法都共享着一把锁,而且这把锁能防止多个方法对通用内存同时进行写操作(比如同时有多个线程)。  
  每个类也有自己的一把锁(作为类的Class对象的一部分),所以synchronized   static方法可在一个类的范围内被相互间锁定起来,防止与static数据的接触。   
  *******************************************************************************************************
  
  

Java中有两种方式来实现,一种是实现java.lang.Comprable;另一种实现java.util.Comparator.下面来谈它们两个的区别,和如何选择哪种方案比较好.

区别:

1. Comparale 接口只有一个方法: compareTo(Object obj)方法, 而Comparator接口,有两个方法:compare(Object obj1,Object obj2)和equals(Object obj)

2. Comparable 的类层次是:java.lang, 而java.util

3. 在Comparator中的compare方法里面,要对两个参数的类型进行检查,而Comparable中的compareTo只对一个参数进行检查

4.对于Comparator的equals方法,一般来说不用重写,而直接用基类Object的已经能满足大多数的需求,在这里推荐不要重写

选择哪种方案:

1. 对于Comparale比较简单而且需要比较少的工作,而且在用到TreeSet或TreeMap时,构造器不用带参数,且能每次都能用相同的的比较方法,如果用Comparable能达到目的,就最好用Comparable接口

2. 对于Comparator接口比较灵活,而且要更多一点的工作,能通过实现Comparator接口来产生很多不一样的类,而且能方便按其他的字段进行排序,同时对于基本类型数组无法用Comparator进行排序,只能用于对象的排序
  ******************************************************************************************************


 hashCode()返回该对象的哈希码值,该值通常是一个由该对象的内部地址转换而来的整数,它的实现主要是为了提高哈希表(例如java.util.Hashtable提供的哈希表)的性能。在每个重写了equals方法的类中,你必须也要重写hashCode方法。如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法与所有基于散列值(hash)的集合类结合在一起正常运行。

下面是hashCode约定的内容,来自java.lang.Object的规范:

l 在一个Java应用程序执行期间,如果一个对象的equals方法做比较所用到的信息没有被修改的话,那么,对该对象调用hashCode方法多次,它必须始终如一地返回同一个整数。在同一个应用程序的多次执行过程中,这个整数可以不同。

l 如果两个对象根据equals(Object)方法是相等的,那么对这两个对象中的每一个对象调用hashCode方法都必须生成相同的整数结果。

l 如果两个对象根据equals(Object)方法是不相等的,那么调用这两个对象中任一个对象的hashCode方法,不要求必须产生不同的整数结果。然而,程序员应该意识到这样的事实,对于不相等的对象产生截然不同的整数结果,有可能提高散列表的性能。 
  ***************************************************************************************************


java中的类是动态加载的,我们先看一下我们常用的类加载方式,先有一个感性的认识,才能进一步
深入讨论,类加载无非就是下面三种方式。
class A{}
class B{}
class C{}
public class Loader{
    public static void main(String[] args) throws Exception{
       Class aa=A.class; 
       Class bb=Class.forName("B");
       Class cc=ClassLoader.getSystemClassLoader().loadClass("C");
    }
  **************************************************************************************************

 对于需要自己编写代码来处理 XML 文档的开发人员来说,选择 DOM 还是 SAX 解析模型是一个非常重要的设计决策。

  DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。

  DOM 解析器把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。用 DOM 解析模型的优点是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频繁的改变的服务中。

  SAX 解析器采用了基于事件的模型,它在解析 XML 文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难,而且很难同时访问同一个文档中的多处不同数据。

  ***************************************************************************************************

  1. 运行一下上面的代码,结果马上呈现在我们的眼前: 
  2. 父类--静态变量
  3. 父类--静态初始化块
  4. 子类--静态变量
  5. 子类--静态初始化块
  6. 父类--变量
  7. 父类--初始化块
  8. 父类--构造器
  9. 子类--变量
  10. 子类--初始化块
  11. 子类--构造器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值