Java学习总结

lix_uan
• 阅读 950

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方法
点赞
收藏
评论区
推荐文章
技术小男生 技术小男生
4个月前
linux环境jdk环境变量配置
1:编辑系统配置文件vi/etc/profile2:按字母键i进入编辑模式,在最底部添加内容:JAVAHOME/opt/jdk1.8.0152CLASSPATH.:$JAVAHOME/lib/dt.jar:$JAVAHOME/lib/tools.jarPATH$JAVAHOME/bin:$PATH3:生效配置
光头强的博客 光头强的博客
4个月前
Java面向对象试题
1、请创建一个Animal动物类,要求有方法eat()方法,方法输出一条语句“吃东西”。创建一个接口A,接口里有一个抽象方法fly()。创建一个Bird类继承Animal类并实现接口A里的方法输出一条有语句“鸟儿飞翔”,重写eat()方法输出一条语句“鸟儿吃虫”。在Test类中向上转型创建b对象,调用eat方法。然后向下转型调用eat()方
22 22
1年前
动图图解二叉查找树的基本原理及其实现
本文为系列专题的第12篇文章。1.2.3.4.5.6.7.8.9.10.1.是什么?二叉查找树(BinarySearchTree)必须满足以下特点:若左子树不为空,则左子树的所有结点值皆小于根结点值若右子树不为空,则右子树的所有结点值皆大于根结点值左右子树也是二叉排序树如下图,是一颗二叉查找树:如果你对二叉查找树进行中序
Wesley13 Wesley13
1年前
Java中HashMap的实现原理
总结:HashMap的实现原理:1.利用key的hashCode重新hash计算出当前对象的元素在数组中的下标2.存储时,如果出现hash值相同的key,此时有两种情况。(1)如果key相同,则覆盖原始值;(2)如果key不同(出现冲突),则将当前的keyvalue放入链表中3.获取时,直接找到hash值对应
Wesley13 Wesley13
1年前
MySQL表介绍
MySQLInnoDB表介绍一、索引组织表在InnoDB引擎中,表都是根据主键顺序存放的。这种存储方式称为索引组织表,在InnoDB引擎中,每张表都有逐渐。如果没有显示定义主键,则引擎会按照以下方式选择或创建主键。(1)、判断表是否有非空唯一索引,如果有,则该字段为主键。如果有多个非空唯一索引,则选择第一个定义的非空索引字段作为
Wesley13 Wesley13
1年前
java语言基础6
hashmap的数据结构,HashMap的数据结构是数组链表红黑树(红黑树sinceJDK1.8)。我们常把数组中的每一个节点称为一个桶。当向桶中添加一个键值对时,首先计算键值对中key的hash值,以此确定插入数组中的位置,但是可能存在同一hash值的元素已经被放在数组同一位置了,这种现象称为碰撞,这时按照尾插法(jdk1.7及以前为头插法)的方式添
Wesley13 Wesley13
1年前
java实现判断两个二叉树是否相同
1、定义树节点类:节点值、左节点、右节点、构造器2、先判断树是否为空的情况3、树不为空时,判断节点所指的值是否相等,若相等,则递归判断节点的左右节点是否相同,相同则返回true/\\ \Definitionforbinarytree \publicclassTreeNode{ \    intval
Easter79 Easter79
1年前
sql:mysql:函数:TIMESTAMPDIFF函数实现TimeStamp字段相减,求得时间差
<divclass"htmledit\_views"id"content\_views"<p&nbsp;函数内指定是minute,则最终结果value值的单位是分钟,如果函数内指定为hours,则最终结果value值单位为小时。</p<preclass"has"name"code"<codeclass"hljssql"<
Easter79 Easter79
1年前
Tcl命令操作实验
字符串操作:stringoptionstring1string2其中option可以是:compare 按字母顺序比较,小于则返回1,等于返回0,大于返回1match 判断是否匹配first判断string2中string1第一次出现的位置,如果没有则返回1last 和first作用相反,最后一次出现的位置,如果没有则返回
Stella981 Stella981
1年前
SpringBoot自定义序列化的使用方式
场景及需求:项目接入了SpringBoot开发,现在需求是服务端接口返回的字段如果为空,那么自动转为空字符串。例如:\    {        "id":1,        "name":null    },    {        "id":2,        "name":"x
lix_uan
lix_uan
Lv1
学无止境,即刻前行
7
文章
4
粉丝
0
获赞