您的位置:首页 > 编程语言 > Java开发

JAVA常用类和方法

2018-07-25 22:00 281 查看

常用方法

equals

  equals()方法判断两个对象是否“相等”。如果不重写这个方法,equals两个对象 除非是同一个引用,否则一直不相等(返回false)。

  Eclipse默认给我们重写的equals()方法,是对象的所有成员变量是否都相等,如果该对象和比较对象的成员变量都相等 则两个对象互相equals() 也就是相等。

  我们都知道Set集合存放的对象都是不可重复的,Set集合就是根据对象的equals方法判断对象是不是重复

  注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。

hashCode

  返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 

java.util.Hashtable
 提供的哈希表)的性能。

  如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 

hashCode
 方法都必须生成相同的整数结果。

  如果根据 

equals(java.lang.Object)
 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。

    ——摘自API,大家也就理解了 为什么eclipse中 equals和HasdCode方法给我们的快捷键中,必须一起重写。

toString

   Object
 类的 
toString
 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“
@
”和

        此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

以上是JDK默认toString方法的实现和API解释,可见Object类默认的toString方法和equals方法都和对象的哈希码有关

重写toString方法可以让我们更直观的理解对象的内容属性。

常用Map

 HashMap

  get set操作没有做同步处理,因此HashMap是线程不安全的

  不保证映射的顺序,特别是它不保证该顺序恒久不变。(也就是无序)

 Hashtable 

  Hashtable和HashMap不同点:

  线程安全

  为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 

hashCode
 方法和 
equals
 方法。

  Hashtable和HashMap相同点:

  不保证映射的顺序,特别是它不保证该顺序恒久不变。(也就是无序)

 ConcurrentHashMap

         与 

Hashtable
 相似,但与 
HashMap
 不同,它不 允许将 null 用作键或值。

    ConcurrentHashMap也是线程安全的,它和Hashtable的区别就是 同步的原理不一样

 TreeMap

  以上三个都是基于哈希表实现的Map,都是无序的

  TreeMap基于红黑树(Red-Black tree)的 

NavigableMap
 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 
Comparator
 进行排序,具体取决于使用的构造方法。(TreeMap是有序的)

HashMap和TreeMap允许使用 null 值和 null 键 ,线程不安全。

HashTable和ConcurrentHashMap不允许使用null值和null键,线程安全。  

ConcurrentHashMap和Hashtable,实现同步的区别

  Hashtable:

    Hashtable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下Hashtable的效率非常低下。因为当一个线程访问Hashtable的同步方法时,其他线程访问Hashtable的同步方法,就可能会进入阻塞或轮询状态。

    如线程1使用put进行添加元素,线程2不但不能使用put方法添加元素,并且也不能使用get方法来获取元素,所以竞争越激烈效率越低。 

  ConcurrentHashMap:

     ConcurrentHashMap的分段锁技术:Hashtable容器在竞争激烈的并发环境下表现出效率低下的原因,是因为所有访问Hashtable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,

    那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,

    当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。 具体可以理解为把一个大的Map拆分成N个小的Hashtable,根据key.hashCode()来决定把key放到哪个Hashtable中。

  尽管所有操作都是线程安全的,但获取操作不 必锁定,并且不 支持以某种防止所有访问的方式锁定整个表。

  允许通过可选的 concurrencyLevel 构造方法参数(默认值为 16)来引导更新操作之间的并发,该参数用作内部调整大小的一个提示——摘自API

  参考https://www.geek-share.com/detail/2713439375.html

String StringBuffer和StringBuilder

StringBuffer代表可变的字符序列,往StringBuffer字符串加东西,直接相加。

String代表不可变字符序列  当我们执行两个字符串相加时 需要分配另外一块内存 然后 执行两次copy。最后把字符串的指针执行新的那块内存。

StringBuilder和StringBuffer类似 只是线程非安全。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: