JAVA基础
程序员大魔王
努力学大数据的小菜鸟
展开
-
关于JDK8中HashMap的前驱知识和重新认识
摘要HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实现进行了优化,例如引入红黑树的数据结构和扩容的优化等。本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理。简介Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMa原创 2020-07-05 23:27:56 · 263 阅读 · 0 评论 -
Java-016-ConcurrentHashMap 和 Hashtable 的区别
ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的方式上不同。底层数据结构: JDK1.7的 ConcurrentHashMap 底层采用 分段的数组+链表 实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采用 数组+链表 的形...原创 2020-02-24 22:09:02 · 985 阅读 · 0 评论 -
Java-015-HashSet和HashMap的区别
如果你看过 HashSet 源码的话就应该知道:HashSet 底层就是基于 HashMap 实现的。(HashSet 的源码非常非常少,因为除了 clone() 方法、writeObject()方法、readObject()方法是 HashSet 自己不得不实现之外,其他方法都是直接调用 HashMap 中的方法。)...原创 2020-02-24 21:51:07 · 1040 阅读 · 0 评论 -
Java-014-HashMap 多线程操作导致死循环问题
在多线程下,进行 put 操作会导致 HashMap 死循环,原因在于 HashMap 的扩容 resize()方法。由于扩容是新建一个数组,复制原数据到数组。由于数组下标挂有链表,所以需要复制链表,但是多线程操作有可能导致环形链表。复制链表过程如下:以下模拟2个线程同时扩容。假设,当前 HashMap 的空间为2(临界值为1),hashcode 分别为 0 和 1,在散列地址 0 处有元素 A...原创 2020-02-24 21:01:11 · 1140 阅读 · 0 评论 -
Java-013-HashMap的长度为什么时2的幂次方
为了能让 HashMap 存取高效,尽量较少碰撞,也就是要尽量把数据分配均匀。我们上面也讲到了过了,Hash 值的范围值-2147483648到2147483647,前后加起来大概40亿的映射空间,只要哈希函数映射得比较均匀松散,一般应用是很难出现碰撞的。但问题是一个40亿长度的数组,内存是放不下的。所以这个散列值是不能直接拿来用的。用之前还要先做对数组的长度取模运算,得到的余数才能用来要存放的位...原创 2020-02-24 20:50:09 · 965 阅读 · 0 评论 -
Java-012-HashMap和HashTable的区别
线程是否安全: HashMap 是非线程安全的,HashTable 是线程安全的;HashTable 内部的方法基本都经过synchronized 修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!);效率: 因为线程安全的问题,HashMap 要比 HashTable 效率高一点。另外,HashTable 基本被淘汰,不要在代码中使用它;对Null key 和...原创 2020-02-24 20:43:09 · 970 阅读 · 0 评论 -
Java-011-HashMap的底层实现
JDK1.8之前JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果...原创 2020-02-24 20:08:31 · 946 阅读 · 0 评论 -
Java-010-ArrayList和Vector区别
Vector类的所有方法都是同步的,可以由两个线程安全的访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上浪费大量的时间。ArrayList不是同步的,所以在不需要保证线程安全时建议使用ArrayList。...原创 2020-02-24 19:58:21 · 915 阅读 · 0 评论 -
Java-009-ArrayList和LinkedList异同
1.是否保证线程安全:ArrayList和LinkedList都是不同步的,也就是不保证线程安全;2.底层数据结构:ArrayList底层使用的是Object数组;LinkedList底层使用的双向链表数据结构(JDK1.6之前为循环链表,JDK1.7取消了循环。注意双向链表和双向循环链表的区别:); 详细可阅读JDK1.7-LinkedList循环链表优化3.插入和删除是否受元素位置的影响:...原创 2020-02-24 19:49:13 · 967 阅读 · 0 评论 -
Java-008-接口和抽象类的区别是什么
接口的方法默认是public,所有方法在接口中不能有实现,抽象类可以有非抽象的方法;接口中的实力变量默认是final类型的,而抽象类中则不一定一个类可以实现多个接口,但最多只能实现一个抽象类一个类实现接口的话要实现接口的所有方法,而抽象类不一定接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象,从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行...原创 2020-02-24 16:34:02 · 935 阅读 · 0 评论 -
Java-007-获取用键盘输入常用的两种方法
方法1:通过 ScannerScanner input = new Scanner(System.in);String s = input.nextLine();input.close();方法2:通过 BufferedReaderBufferedReader input = new BufferedReader(new InputStreamReader(System.in));S...原创 2020-02-24 16:28:40 · 961 阅读 · 0 评论 -
Java-006-Java中的异常处理
Java异常类的层次结构图在 Java 中,所有的异常都有一个共同的祖先java.lang包中的 Throwable类。Throwable: 有两个重要的子类:Exception(异常) 和 Error(错误) ,二者都是 Java 异常处理的重要子类,各自都包含大量子类。Error(错误):是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码...原创 2020-02-24 16:22:07 · 1053 阅读 · 0 评论 -
Java-005-Object类的常见方法总结
Object是一个特殊的类,是所有类的父类,它主要提供了一下11个方法public final native Class<?> getClass()//native方法,用于返回当前运行时对象的Class对象,使用了final关键字修饰,故不允许子类重写。public native int hashCode() //native方法,用于返回对象的哈希码,主要使用在哈希表中,...原创 2020-02-24 16:01:19 · 960 阅读 · 0 评论 -
Java-004-关于final关键字的一些总结
final关键字主要用在三个地方:变量、方法、类1、对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后就不能更改,如果是引用类型的变量,则在对其初始化后便不能再让其只想另一个对象。2、当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式的指定为final方法。3、使用final方法的原因有两个,第一个原因是把方法锁定,以防任何继承类...原创 2020-02-24 15:49:40 · 995 阅读 · 0 评论 -
Java-003-==与equals
==:它的作用是判断两个对象的地址是不是相等,即是不是同一个对象(基本数据类型比较的是值,引用数据类型比较的是内存地址)equals:它的作用也是判断两个对象是否相等,但它一般有两种使用情况:情况1:类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。情况2:类覆盖了 equals() 方法。一般,我们都覆盖 equal...原创 2020-02-24 15:43:26 · 962 阅读 · 0 评论 -
Java-002-String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?
可变性简单来说:String类中使用final关键字字符数组保存字符串private final char value[];所以String对象是不可变的。而StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串char[] value;但是没有final关键...原创 2020-02-24 13:02:14 · 936 阅读 · 0 评论 -
Java-001-重载和重写的区别
重载: 发生在同一个类中,方法名必须相同,参数类型不同,个数不同,顺序不同,方法返回值和访问修饰符可以不同,放生在编译时。重写: 发生在父子类中,方法名,参数列表必须相同,返回值返回小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类,如果父类方法访问修饰符为private那么子类就不能重写该方法。...原创 2020-02-24 11:32:10 · 961 阅读 · 0 评论 -
JAVA对数计算
java对数计算 Java对数函数的计算方法非常有问题,然而在API中却有惊人的误差。但是假如运用了以下的方法,用Java处理数字所碰到的小麻烦就可以轻而易举的解决了。 Sun的J2SE提供了一个单一的Java对数方法——double java.lang.Math.log(double),这很轻易使用。请看如下代码: double x = Math.log(...原创 2017-05-02 22:54:53 · 11399 阅读 · 0 评论