JAVA常用类和方法
常用方法
equals()方法判断两个对象是否“相等”。如果不重写这个方法,equals两个对象 除非是同一个引用,否则一直不相等(返回false)。
Eclipse默认给我们重写的equals()方法,是对象的所有成员变量是否都相等,如果该对象和比较对象的成员变量都相等 则两个对象互相equals() 也就是相等。
我们都知道Set集合存放的对象都是不可重复的,Set集合就是根据对象的equals方法判断对象是不是重复
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable
提供的哈希表)的性能。
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用
hashCode方法都必须生成相同的整数结果。
如果根据 equals(java.lang.Object)
方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。
——摘自API,大家也就理解了 为什么eclipse中 equals和HasdCode方法给我们的快捷键中,必须一起重写。
Object类的
toString方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“
@”和
此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于
public String toString() { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }
以上是JDK默认toString方法的实现和API解释,可见Object类默认的toString方法和equals方法都和对象的哈希码有关
重写toString方法可以让我们更直观的理解对象的内容属性。
常用Map
get set操作没有做同步处理,因此HashMap是线程不安全的
不保证映射的顺序,特别是它不保证该顺序恒久不变。(也就是无序)
Hashtable和HashMap不同点:
线程安全
为了成功地在哈希表中存储和获取对象,用作键的对象必须实现
hashCode方法和
equals方法。
Hashtable和HashMap相同点:
不保证映射的顺序,特别是它不保证该顺序恒久不变。(也就是无序)
与 Hashtable
相似,但与 HashMap
不同,它不 允许将 null 用作键或值。
ConcurrentHashMap也是线程安全的,它和Hashtable的区别就是 同步的原理不一样
以上三个都是基于哈希表实现的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类似 只是线程非安全。
- java常用类的使用方法
- JAVA常用类的使用方法_Character类
- 黑马程序员---从头开始,回忆JAVA基础之常用类方法!
- JAVA常用类的使用方法_Character类
- Java之常用类及方法
- Java常用类和方法重点总结
- JAVA常用类的使用方法
- java有哪些常用类 String的方法
- java常用类——java常用文件处理方法
- Java API常用类及方法总结
- java commons常用类与方法
- Java ( 常用类) 一些方法,新手勿喷,
- Java基础(17):常用类—System类的标准流重定向与常用方法
- JAVA常用类的使用方法
- JAVA常用类的使用方法
- java常用类:List接口常用方法
- JAVA常用类的使用方法
- JAVA常用类的使用方法_Character类
- java IO常用类和方法
- java 常用类和方法