javase笔记
不羁朔风
但行好事,不问前程
展开
-
HashMap和HashTable和CurrentHashMap的区别
HashMap效率高,但是在多线程环境下线程不安全HashTable线程安全,但是效率低,因为HashTable内部是采用synchronized来保证线程安全的,每次同步执行的时候要锁住整个结构,但是在线程竞争激烈的情况下HashTable的效率下降得很快ConcurrentHashMap采用锁分段的技术,它对数据集进行分段,每段竞争一把锁,不同数据段的数据不存在锁竞争,从而有效提高了并...原创 2018-11-02 14:36:58 · 3379 阅读 · 0 评论 -
HashMap的底层原理
在jdk1.6和jdk1.7中HashMap是桶加链表的实现方式.HashMap的底层结构就是一个数组,数组中每一个元素又是一个链表.当添加一个元素(key-value)的时候,根据key的hash值(或者说调用key的hashCode方法)来确定插入到哪一个桶中(确定插入数组中的位置),当桶中有多个key元素时,使用链表进行保存,这代表发生了哈希码的碰撞,这时判断同一个桶中的元素是否相同就需要调...原创 2018-11-02 14:37:32 · 127 阅读 · 0 评论 -
HashMap产生死锁的原因
HashMap是非线程安全,死锁一般都是产生于并发情况下。我们假设有二个进程T1、T2,HashMap容量为2,T1线程放入key A、B、C、D、E。在T1线程中A、B、C Hash值相同,于是形成一个链接,假设为A->C->B,而D、E Hash值不同,于是容量不足,需要新建一个更大尺寸的hash表,然后把数据从老的Hash表中 迁移到新的Hash表中(refresh)。这时T2进...原创 2018-11-02 14:38:34 · 10911 阅读 · 4 评论 -
HashMap的容量为什么一定要是2的幂呢?(不看后悔,一看必懂)
HashMap中的数据结构是数组+单链表的组合,我们希望的是元素存放的更均匀,最理想的效果是,Entry数组中每个位置都只有一个元素,这样,查询的时候效率最高,不需要遍历单链表,也不需要通过equals去比较K,而且空间利用率最大。那如何计算才会分布最均匀呢?我们首先想到的就是%运算,哈希值%容量=bucketIndex源码中是怎么做的呢?static int indexFor(int h...原创 2018-11-02 14:39:10 · 2298 阅读 · 1 评论 -
TreeMap的底层原理
TreeMap默认按键的升序进行排序,不允许null键和null值,效率比HashMap低,线程不安全TreeMap是桶+红黑树的实现方式.TreeMap的底层结构就是一个数组,数组中每一个元素又是一个红黑树.当添加一个元素(key-value)的时候,根据key的hash值来确定插入到哪一个桶中(确定插入数组中的位置),当桶中有多个元素时,使用红黑树进行保存;当一个桶中存放的数据过多,那么根...原创 2018-11-02 14:39:31 · 9609 阅读 · 14 评论 -
在ArrayLIst和LinkedList尾部加元素,谁的效率高
当输入的数据一直是小于千万级别的时候,大部分是LinkedList效率高,而当数据量大于千万级别的时候,就会出现ArrayList的效率比较高了。为什么呢?原来 LinkedList每次增加的时候,会new 一个Node对象来存新增加的元素,所以当数据量小的时候,这个时间并不明显,而ArrayList需要扩容,所以LinkedList的效率就会比较高,其中如果ArrayList出现不需要扩容的...原创 2018-11-02 14:39:58 · 3245 阅读 · 0 评论 -
如果HashMap或者hashTable的key是一个自定义的类该怎么办
需要重写hashCode()和equals()方法,才能保证存入键的唯一性为什么重写equals还要重写hashCode?在object根类的源码中,equals方法本质上就是==,==表示比较两个基本类型的数据或者两个引用变量的地址值是否相等,在实际开发中,我们需要知道引用类型变量的内容是否相等,这时需要在类中重写equals方法,像jdk的类一般都重写了equals方法,如果是自定义的...原创 2018-11-02 14:40:38 · 399 阅读 · 0 评论 -
介绍一下volatile
volatile是Java提供的轻量级的同步机制,比sync的开销要小被volatile定义的变量,系统每次用到它时都是直接从主存中读取,而不是各个线程的工作内存volatile可以像sync一样保持变量在多线程环境中是实时可见的可见性:每个线程都有自己的工作内存,每次线程执行时,会从主存获得变量的拷贝,对变量的操作是在线程的工作内存中进行,不同的线程之间不共享工作内存;对于vol...原创 2018-11-02 14:41:24 · 1921 阅读 · 0 评论 -
jdk1.5 jdk1.7 jdk1.8比较重要的新特性
jdk1.5新特性jdk1.7新特性switch语句可以使用字符串泛型推断(又叫泛型简化) jdk1.8新特性①允许接口中有默认方法和静态方法的实现public interface Inter {public abstract void print();//其中public可以省略public default void defaultPrint...原创 2018-11-02 14:42:19 · 627 阅读 · 0 评论 -
集合的继承体系
Collection下面有两个常用的子类接口,一个是List(有序存放可重复的元素),Set(存放不可重复的元素).List接口下有三个常用的子类ArrayList:底层结构是数组,查询快,增删慢,线程不安全,效率高Vector:底层结构是数组,查询和增删慢,线程安全,效率低(在多线程环境中选用)ArrayList和Vector都有一个初始化的容量的大小,当里面存储的元素超过这个大...原创 2018-11-04 14:15:56 · 758 阅读 · 0 评论 -
Java中的异常处理机制的简单原理和应用
java使用面向对象的方式来处理异常,它把程序中发生的每个异常分别封装到一个对象中,该对象包含有异常的信息.所有异常的根类是Throwable,Throwable又派生了两个子类,Error和Exception,Exception包括运行时期异常和编译期异常运行时期异常的特点:①方法定义中无需throws声明,调用者也无需try-catch处理此异常.②运行时期异常一旦发生,需要程序人...原创 2018-11-03 09:56:31 · 8550 阅读 · 3 评论 -
javase之反射
-第33天 反射今日内容介绍u 类加载器u 反射构造方法u 反射成员变量u 反射成员方法u 反射配置文件运行类中的方法类加载器类的加载当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。l 加载 就是指将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个C转载 2017-12-05 21:32:18 · 169 阅读 · 0 评论 -
面向对象的特征详解(详细易懂)
面向对象有三个特征,封装,继承,多态封装:类和方法其实都是封装,封装的好处有提高了代码的复用性,隐藏了实现的细节,提高了安全性继承:提高了代码的复用性,是多态产生的前提.但是增加了类与类之间的耦合,继承打破了封装性 要优先使用组合而不是继承,在包内使用继承是非常安全的,对于具有很好的文档说明的类来说,使用继承也是非常安全的,但是对于普通的具体类继承跨包继承是非常危险的,当两者存在is-a...原创 2018-11-03 09:50:35 · 595 阅读 · 0 评论 -
final,finally和finalize有什么区别
final修饰的变量为常量,这些变量只能赋值一次,final修饰的方法不能被覆盖,final修饰的类不能被继承finally是异常处理语句结构的一部分,表示总是执行,经常被用在需要释放资源的情况下finalize是Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的这个方法,可以覆盖此方法提供垃圾收集时的其他资源的回收,例如关闭文件等.JVM不保证此方法总被调用...原创 2018-11-03 09:51:21 · 105 阅读 · 0 评论 -
instanceof有什么作用
用来判断引用类型的变量所指向的对象是否是一个类(或者接口,抽象类,父类)的实例常用的方法是:result=object instanceof classname.如果Object是class的一个实例,那么instanceof运算符返回为true,不是(或者Object为null),那么结果返回false输出结果为truetruefalse...原创 2018-11-03 09:52:42 · 2721 阅读 · 0 评论 -
什么是不可变类
不可变类是指,一旦一个类的对象被创建出来,在其整个生命周期中,它的成员变量就不能被修改.java平台的类库中包含许多不可变的类,比如说String,基本类型的包装类,BigInteger和BigDecimal.存在不可变的类有许多理由:不可变的类比可变的类更加容易设计,实现和使用.它们不容易出错,而且更加安全.如何设计一个不可变类?①使类中所有的成员变量被final修饰②类中没有修改成...原创 2018-11-03 09:53:44 · 8121 阅读 · 4 评论 -
new String(“abc”)创建了几个对象(不看后悔,一看必懂)
String a = “abc”;String b = new String("abc");这两种声明方法得到的String是不一样的,第一种声明方法得到的String是存储在String常量池里面的,而第二种方式的声明很明显是正常的创建一个对象的使用方法,所以存储在堆中。当String类直接赋值时,如果常量池内存在这个字符串,则s1直接指向常量池的地址,若没有,则先在常量池内创建这个...原创 2018-11-03 09:54:15 · 4304 阅读 · 0 评论 -
"=="和equals方法究竟有什么区别?
在object根类的源码中,equals方法本质上就是==,==表示比较两个基本类型的数据或者两个引用变量的地址值是否相等,在实际开发中,我们需要知道引用类型变量的内容是否相等,这时需要在类中重写equals方法,像jdk的类一般都重写了equals方法,如果是自定义的类,需要自己重写.重写equals方法时一般都要重写hashCode方法,如果不重写hashCode方法,hashSet就不能保证...原创 2018-11-03 09:54:39 · 210 阅读 · 0 评论 -
finally块中的代码什么时候被执行
任何语句要执行都只能在return前执行,因此finally块中的代码也是在return前执行的.输出结果为:finally1finally块中的return语句会覆盖别处的return语句,最终返回到调用者的是finally的语句值输出结果为:finally3对于基本类型的数据,在finally块中改变return的值,对返回值没有影响,而对引用类型的数据...原创 2018-11-03 09:55:56 · 4734 阅读 · 0 评论 -
java程序的初始化顺序
java程序的初始化一般遵循3个原则(优先级依次递减):①静态对象优先于非静态对象,其中,静态变量只初始化一次,而非静态变量可能会初始化多次②父类优先于子类进行初始化③按照成员变量定义的顺序进行初始化,即使变量定义散布在方法定义之中,它们依然在任何方法(包括构造函数)被调用之前进行初始化java初始化操作可以在许多不同的代码块中完成(例如静态代码块,构造函数等),它们的初始化顺序如...原创 2018-11-02 14:42:49 · 104 阅读 · 0 评论