Java学习总结

lix_uan
• 阅读 1209

Java

HashMap和HashTable

  • jdk1.8中采用数组+链表+红黑树实现
  • 首先会创建一个默认长度为16,默认加载因为0.75的table数组
  • 根据hash值和数组的长度计算应存入的位置
  • 判断当前位置是否为空,如果为空则直接存入
  • 如果当前位置不为空,则调用equals方法比较属性值
  • 如果一样则替换为新的,如果不一样则采用头插法插入
  • 当节点数多于8个后,链表转为红黑树
  • HashMap是线程不安全的,HashTable是线程安全的

TreeSet和HashSet

  • HashSet采用hash表实现,其中的元素没有按顺序排列
  • add(),remove()等方法的复杂度都为O(1)
  • TreeSet采用红黑树实现,元素按顺序排列
  • 但是add(),remove()等方法的复杂度都为O(logn)
  • TreeSet还提供了一些方法如first(),headSet()等来处理排列的set

Stringbuffer和Stringbuilder

  • 首先两者在功能上是完全等价的
  • StringBuffer中的方法大都采用了synchronized关键字修饰,因此是线程安全的
  • StringBuilder是线程不安全的
  • 单线程使用StringBuilder效率更高

Final、Finally、Finalize

  • final:修饰类时这个类不能被继承,修饰变量时变量必须赋初始值,并且在使用过程中不能被改变,修饰方法时只能使用,不能被重写
  • finally:通常放在try..catch后,程序是否发生异常,都会执行finally代码块中的内容,通常将释放外部资源的代码写在finally块中
  • finalize:由垃圾回收器在销毁对象之前创建,在垃圾回收器回收之前做一些清理工作,可以重写finalize()方法执行一些操作

== 和equals

  • ==:比较基本数据类型,比较的是变量的值,若比较的是引用数据类型,比较的是地址值

  • equals:没重写之前比较的是两个对象的地址值,重写之后往往比较的是属性的内容

JVM

类加载器的分类

  • 引导类加载器
  • 扩展类加载器
  • 应用程序类加载器
  • 自定义加载器

类加载的过程(双亲委托模式)

  • 下一级的类加载器,如果接到任务时,会先搜索是否加载过,如果没有,会先把任务往上传,如果都没有加载过,一直到根加载器,如果根加载器在它负责的路径下没有找到,会往回传,如果一路回传到最后一级都没有找到,那么会报ClassNotFoundException或NoClassDefError,如果在某一级找到了,就直接返回Class对象
  • 父类已经加载了该类时,子类没有必要再加载,避免了类的重复加载
  • 防止java核心api中定义的类型不会被被随意篡改

垃圾收集的方法

  • 复制算法:年轻代Minor GC采用的是这种算法,效率高但比较占内存,用于占空间比较小,刷新次数多的新生区
  • 标记清除:效率低,会产生碎片,用于老年代
  • 标记压缩:效率低,需要移动对象,但不会产生碎片
  • 标记清除压缩:用于占空间大,刷新次数少的养老区

Java内存回收策略

  • 对象优先在Eden区分配
  • 大的对象直接进入老年代
  • 长期存活的对象直接进入老年代
  • Eden区空间不够时,虚拟机在新生代的Eden区实行一次Minor GC
  • Major GC(Full GC)发生在老年代
  • 可以通过配置,在Full GC之前执行一次Minor GC
  • 这样可以加快老年代的回收速度

JUC

Java中创建线程的几种方式

  • 继承Thread类,重写run方法
  • 实现Runnable接口
  • 实现Callable接口
  • 通过线程池启动多线程

run和start

  • start()用于启动线程
  • run()用于执行代码
  • run()可以重复调用,start()只能调用一次

sleep和wait

  • sleep()来自Thread,wait()来自Object
  • sleep()不释放锁,wait()释放锁
  • sleep()时间到会自动恢复,wait()可以用notify()或notifyAll()直接唤醒

Synchronized与Lock

  • Sychronized能实现的功能Lock都能实现,而且Lock比Sychronized更灵活好用
  • 但是Synchronized可以自动上锁和解锁,Lock需要手动上锁和解锁,如果使用不当会造成死锁

Runnable与Callable

  • Runnable接口中的方法没有返回值,Callable接口中的方法有返回值
  • Runnable接口中的方法没有抛出异常,Callable接口中的方法抛出了异常
  • Runnable接口中的落地方法是call方法,Callable接口中的落地方法是run方法
点赞
收藏
评论区
推荐文章
22 22
2年前
动图图解二叉查找树的基本原理及其实现
本文为系列专题的第12篇文章。1.2.3.4.5.6.7.8.9.10.1.是什么?二叉查找树(BinarySearchTree)必须满足以下特点:若左子树不为空,则左子树的所有结点值皆小于根结点值若右子树不为空,则右子树的所有结点值皆大于根结点值左右子树也是二叉排序树如下图,是一颗二叉查找树:如果你对二叉查找树进行中序
Easter79 Easter79
2年前
sql:mysql:函数:TIMESTAMPDIFF函数实现TimeStamp字段相减,求得时间差
<divclass"htmledit\_views"id"content\_views"<p&nbsp;函数内指定是minute,则最终结果value值的单位是分钟,如果函数内指定为hours,则最终结果value值单位为小时。</p<preclass"has"name"code"<codeclass"hljssql"<
Wesley13 Wesley13
2年前
java语言基础6
hashmap的数据结构,HashMap的数据结构是数组链表红黑树(红黑树sinceJDK1.8)。我们常把数组中的每一个节点称为一个桶。当向桶中添加一个键值对时,首先计算键值对中key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这种现象称为碰撞,这时按照尾插法(jdk1.7及以前为头插法)的方式添
Wesley13 Wesley13
2年前
java实现判断两个二叉树是否相同
1、定义树节点类:节点值、左节点、右节点、构造器2、先判断树是否为空的情况3、树不为空时,判断节点所指的值是否相等,若相等,则递归判断节点的左右节点是否相同,相同则返回true/\\ \Definitionforbinarytree \publicclassTreeNode{ \    intval
Wesley13 Wesley13
2年前
Java中HashMap的实现原理
总结:HashMap的实现原理:1.利用key的hashCode重新hash计算出当前对象的元素在数组中的下标2.存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的keyvalue放入链表中3.获取时,直接找到hash值对应
Easter79 Easter79
2年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
Wesley13 Wesley13
2年前
Java8 HashMap详解
Java8HashMapJava8对HashMap进行了一些修改,最大的不同就是利用了红黑树,所以其由数组链表红黑树组成。根据Java7HashMap的介绍,我们知道,查找的时候,根据hash值我们能够快速定位到数组的具体下标,但是之后的话,需要顺着链表一个个比较下去才能找到我们需要的,时间复杂度取决于链表的
Wesley13 Wesley13
2年前
MySQL表介绍
MySQLInnoDB表介绍一、索引组织表在InnoDB引擎中,表都是根据主键顺序存放的。这种存储方式称为索引组织表,在InnoDB引擎中,每张表都有逐渐。如果没有显示定义主键,则引擎会按照以下方式选择或创建主键。(1)、判断表是否有非空唯一索引,如果有,则该字段为主键。如果有多个非空唯一索引,则选择第一个定义的非空索引字段作为
Stella981 Stella981
2年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
京东云开发者 京东云开发者
3个月前
深入理解经典红黑树 | 京东物流技术团队
本篇我们讲红黑树的经典实现,Java中对红黑树的实现便采用的是经典红黑树。前一篇文章我们介绍过左倾红黑树,它相对来说比较简单,需要大家看完上篇再来看这一篇,因为旋转等基础知识不会再本篇文章中赘述。本篇的大部分内容参考《算法导论》和Java实现红黑树的源码,
lix_uan
lix_uan
Lv1
学无止境,即刻前行
文章
7
粉丝
5
获赞
1