关于一些基础的Java问题的解答(二)
6. Hashcode的作用
- Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.
- If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.
- It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.
- hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用来在散列存储结构中确定对象的存储地址的
- 两个equals(相同)的对象返回的hashCode是相同的
- 如果对象的equals方法被重写,那么对象的hashCode也尽量重写,避免违反第2点
- 两个不同的对象hashCode不一定不同,但如果他们的hashCode不同哈希表的性能会更好(减少冲突)
7. ArrayList、LinkedList、Vector的区别
- LinkedList额外实现了Queue接口
- ArrayList和Vector底层是由数组实现,LinkedList底层是由双向链表实现
- 根据第2点,ArrayList和Vector具有更好的随机索引读取性能,LinkedList具有更好的插入删除元素性能
- ArrayList和LinkedList不是线程安全的,Vector是线程安全的(关键方法都加了synchronized关键字),因此Vector在性能上不如前两者
8. String、StringBuffer与StringBuilder的区别
String:
- /** The value is used for character storage. */
- private final char value[];
官方对String解释如下:
StringBuffer和StringBuilder:
9. Map、Set、List、Queue、Stack的特点与用法
Map:
- clear:移除Map中的所有元素
- containsKey:判断Map中是否含有指定的“键”
- containsValue:判断Map中是否含有指定的“值”
- entrySet:返回Map中键值对的集合
- get:通过“键”获取指定的“值”
- isEmpty:是否为空Map
- keySet:返回Map中“键”的集合
- put:加入新的键值对,返回该键的旧值
- remove:移除指定“键”的键值对,返回该键的值
- size:Map含有的键值对数目
- values:返回值的容器视图
- HashMap:哈希映射表,最常用的Map,使用了hashCode(散列码)优化的Map结构,不保证遍历顺序(例:先存入a后存入b,但遍历时可能先出现b再出现a)
- LinkedHashMap:HashMap的子类,但内部维护了一个双向链表,保证遍历顺序是插入顺序或基于LRU(最近最少使用)算法
- WeakHashMap:使用弱引用实现的HashMap,当其中的某些键值对不再被使用时会被自动GC掉
- HashTable:与HashMap大致上类似,但是是线程安全的
- IdentityHashMap:使用==代替equals对“键”进行比较的HashMap
- TreeMap:基于红黑树实现的HashMap,查看“键”或“键值对”时,它们会被排序,另外可以使用subMap方法返回子树
Set:
- add:为Set加入新的元素,返回是否加入成功(存在则失败,反之则成功)
- clear:清除所有元素
- contains:判断是否含有某元素
- isEmpty:判断是否为空Set
- iterator:返回迭代器
- remove:移除某元素
- size:Set含有元素的数目
- HashSet:为快速查找而设计的Set,存入的元素必须定义hashCode
- LinkedHashSet:具有HashSet的查询速度,且内部有链表维护元素顺序的Set
- TreeSet:保持排序的Set,底层为树结构
List:
- add:在最后或特定位置加入新的元素
- clear:清除所有元素
- contains:是否含有指定元素
- get:获取特定索引元素
- indexOf:返回特定元素第一次出现的索引,没有则返回-1
- isEmpty:判断是否为空
- iterator:返回迭代器
- lastIndexOf:返回特定元素最后一次出现的索引,没有则返回-1
- remove:移除特定元素
- size:返回List大小
- subList:根据传入的两个索引返回子列表
- ArrayList:擅长随机访问的列表
- LinkedList:擅长插入和删除操作的列表
- Vector:与ArrayList类似,线程安全的列表
Queue:
- add/offer:往队列中加入新元素
- peek:返回队首元素
- poll:返回并移除队首元素
- isEmpty:队列是否为空
- LinkedList:即普通的队列
- PriorityQueue:一个由优先级堆实现的队列,队列中的元素是有序的
Stack:
- push:往栈中添加新元素
- peek:返回栈顶元素
- pop:返回并移除栈顶元素
- isEmpty:栈是否为空
10. HashMap和HashTable的区别
- HashMap继承自AbstractMap类,而HashTable继承自Dictionary类
- HashMap不是线程安全的,HashTable是线程安全的(关键方法添加了synchronized关键字),因此HashTable效率相对较低
- HashMap允许key和value为null,HashTable不允许key和value为null
- public class HashMap<K,V> extends AbstractMap<K,V>
- implements Map<K,V>, Cloneable, Serializable
- public class Hashtable<K,V>
- extends Dictionary<K,V>
- implements Map<K,V>, Cloneable, java.io.Serializable
HashMap的put方法:
- public V put(K key, V value) {
- return putVal(hash(key), key, value, false, true);
- }
- final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
- boolean evict) {
- Node<K,V>[] tab; Node<K,V> p; int n, i;
- if ((tab = table) == null || (n = tab.length) == 0)
- n = (tab = resize()).length;
- if ((p = tab[i = (n - 1) & hash]) == null)
- tab[i] = newNode(hash, key, value, null);
- else {
- Node<K,V> e; K k;
- if (p.hash == hash &&
- ((k = p.key) == key || (key != null && key.equals(k))))
- e = p;
- else if (p instanceof TreeNode)
- e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
- else {
- for (int binCount = 0; ; ++binCount) {
- if ((e = p.next) == null) {
- p.next = newNode(hash, key, value, null);
- if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
- treeifyBin(tab, hash);
- break;
- }
- if (e.hash == hash &&
- ((k = e.key) == key || (key != null && key.equals(k))))
- break;
- p = e;
- }
- }
- if (e != null) { // existing mapping for key
- V oldValue = e.value;
- if (!onlyIfAbsent || oldValue == null)
- e.value = value;
- afterNodeAccess(e);
- return oldValue;
- }
- }
- ++modCount;
- if (++size > threshold)
- resize();
- afterNodeInsertion(evict);
- return null;
- }
从上面代码我们可以看出对key和value并没有不能为null的限制。
- public synchronized V put(K key, V value) {
- // Make sure the value is not null
- if (value == null) {
- throw new NullPointerException();
- }
- // Makes sure the key is not already in the hashtable.
- Entry<?,?> tab[] = table;
- int hash = key.hashCode();
- int index = (hash & 0x7FFFFFFF) % tab.length;
- @SuppressWarnings("unchecked")
- Entry<K,V> entry = (Entry<K,V>)tab[index];
- for(; entry != null ; entry = entry.next) {
- if ((entry.hash == hash) && entry.key.equals(key)) {
- V old = entry.value;
- entry.value = value;
- return old;
- }
- }
- addEntry(hash, key, value, index);
- return null;
- }
这是一个同步的方法,我们看到第3行会判断value是否为null,如果为null则抛出NullPointer的异常。在第9行调用了key的hashCode方法,如果key对象为null,则会抛出NullPointer的异常。因此,插入HashTable的key和value均不能为null。
关于一些基础的Java问题的解答(二)的更多相关文章
- 关于一些基础的Java问题的解答(一)
学习一门语言基础是非常重要的,因此本文总结了一些常见的Java基础问题的解答,希望可以帮到大家. 1. 九种基本数据类型的大小,以及他们的封装类. 9种基本数据类型 基本类型 包装类型 大小 bool ...
- 关于一些基础的Java问题的解答(七)
31. 反射的作用与原理 简单的来说,反射机制其实就是指程序在运行的时候能够获取自身的信息.如果知道一个类的名称或者它的一个实例对象, 就能把这个类的所有方法和变量的信息(方法名,变量名,方法,修饰符 ...
- 关于一些基础的Java问题的解答(六)
26. ThreadPool用法与优势 ThreadPool即线程池,它是JDK1.5引入的Concurrent包中用于处理并发编程的工具.使用线程池有如下好处: 降低资源消耗:通过重复利用已创建的线 ...
- 关于一些基础的Java问题的解答(四)
16. Java面向对象的三个特征与含义 java中的面向对象的三大基本特征分别是:封装.继承.多态: 封装:把过程和数据包围起来,对数据的访问只能通过已定义的界面,主要是方便类的修改 继承:对象的一 ...
- 关于一些基础的Java问题的解答(五)
21. 实现多线程的两种方法:Thread与Runable 在Java中实现多线程编程有以下几个方法: 1.继承Thread类,重写run方法 public class Test { public s ...
- 关于一些基础的Java问题的解答(三)
11. HashMap和ConcurrentHashMap的区别 从JDK1.2起,就有了HashMap,正如上一个问题所提到的,HashMap与HashTable不同,不是线程安全的,因此多线程 ...
- 黑马程序员:Java基础总结----java注解
黑马程序员:Java基础总结 java注解 ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! java注解 lang包中的基本注解 @SuppressWarnings ...
- java面试题—精选30道Java笔试题解答(二)
摘要: java面试题-精选30道Java笔试题解答(二) 19. 下面程序能正常运行吗() public class NULL { public static void haha(){ System ...
- Java基础:Java的四种引用
在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...
随机推荐
- 一种dubbo逻辑路由方案
背景介绍 现在很多的公司都在用dubbo.springcloud做为服务化/微服务的开发框架,服务化之后应用越来越多,链路越来越长,服务环境的治理变的很困难.比如:研发团队的人很多的,同时有几个分支在 ...
- tomca配置文件自动还原问题的解决 server.xml content.xml 等
当我们在处理中文乱码或是配置数据源时,我们要修改Tomcat下的server.xml和content.xml文件. 但是当我们修改完后重启Tomcat服务器时发现xml文件又被还原了,修改无效果. 为 ...
- api-gateway实践(09)支持rest服务注册
一.GET-GET 1.前端定义 2.后端定义 2.1.基础定义 2.2.path参数.head参数.query参数 2.3.常量参数 2.4.系统参数 2.5.结果定义 二.POST-POST 1. ...
- ASP.NET MVC5 Forms登陆+权限控制(控制到Action)
一.Forms认证流程 请先参考如下网址: http://www.cnblogs.com/fish-li/archive/2012/04/15/2450571.html 本文主要介绍使用自定义的身份认 ...
- 从感知机到 SVM,再到深度学习(二)
这篇博文承接上一篇,详细推导了 SVM 算法,包括对偶算法,SMO 优化算法,核函数技巧等等,最后还提到用高度非线性的曲线代替超平面,就是神经网络的方法. 在第一篇中已经得到了最优间隔 ...
- Java面试题——中级(上)
List和Set比较,各自的子类比较 对比一:Arraylist与LinkedList的比较 1.ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高 ...
- PHP 页面跳转到另一个页面的多种方法方法总结
如何在PHP中从一个页面重定向到另外一个页面呢?这里列出了三种办法,供参考. 一.用HTTP头信息 也就是用PHP的HEADER函数.PHP里的HEADER函数的作用就是向浏览器发出由HTTP协议规定 ...
- JavaScript实现图片轮播图
<!DOCTYPE html><html> <head> <script > var time; function init(){ //设置定时操作 t ...
- 基于gin框架和jwt-go中间件实现小程序用户登陆和token验证
本文核心内容是利用jwt-go中间件来开发golang webapi用户登陆模块的token下发和验证,小程序登陆功能只是一个切入点,这套逻辑同样适用于其他客户端的登陆处理. 小程序登陆逻辑 小程序的 ...
- IOS 中openGL使用教程4(openGL ES 入门篇 | 离屏渲染)
通常情况下,我们使用openGL将渲染好的图片绘制到屏幕上,但有时候我们不想显示处理结果,这时候就需要使用离屏渲染了. 正常情况下,我们将屏幕,也就是一个CAEAGLLayer对象作为渲染目标,离屏渲 ...