![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 77
Java编程语言基础
@Sup
学无止境!
展开
-
ThreadLocal与内存泄漏
1. ThreadLocal 简介通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢?JDK 中提供的ThreadLocal类正是为了解决这样的问题。ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal变量名的..原创 2022-03-06 12:22:32 · 137 阅读 · 0 评论 -
HashMap、HashSet、HashTable的区别
一.HashMap与HashSet的区别HashMap HashSet 实现了Map接口 实现Set接口 存储键值对 仅存储对象 调用put()向 map 中添加元素 调用add()方法向Set中添加元素 HashMap使用键(Key)计算hashcode HashSet使用成员对象来计算hashcode值,对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性 ...原创 2022-03-05 22:29:25 · 568 阅读 · 0 评论 -
synchronized 关键字详解
1.对synchronized 关键字的理解synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下。为什么呢?因为监视器锁(monitor)是依赖于底层的操作系统的Mutex Lock来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操...转载 2022-03-06 10:43:02 · 494 阅读 · 0 评论 -
Java反射机制详解
一.什么是反射如果说大家研究过框架的底层原理或者咱们自己写过框架的话,一定对反射这个概念不陌生。反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。二.反射的应用场景像咱们平时大部分时候都是在写业务代码,很少会接触到直接使用反射机制的场景。但是,这并不代表反射没有用。相反,正是因为反射,你才能这么轻松地使用各种框架。像 Spring/Spring Boot、MyBatis 等原创 2022-03-04 12:34:23 · 177 阅读 · 0 评论 -
Arraylist 与 LinkedList 的区别
是否保证线程安全: ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全; 底层数据结构: Arraylist 底层使用的是 Object 数组;LinkedList 底层使用的是 双向链表 数据结构(JDK1.6 之前为循环链表,JDK1.7 取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!) 插入和删除是否受元素位置的影响: ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行add(E e)方法的时候, Array原创 2022-03-05 21:52:49 · 94 阅读 · 0 评论 -
Java中的IO流分类
按照流的流向分,可以分为输入流和输出流; 按照操作单元划分,可以划分为字节流和字符流; 按照流的角色划分为节点流和处理流。Java IO 流共涉及 40 多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。 OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出原创 2022-03-04 12:27:32 · 505 阅读 · 0 评论 -
为什么在重写equals()方法的时候需要重写hashCode()方法
hashCode 方法用于散列集合的查找,equals 方法用于判断两个对象是否相等。1.为什么需要重写hashCode()方法和equals()方法?有时在我们的业务系统中判断对象时有时候需要的不是一种严格意义上的相等,而是一种业务上的对象相等。在这种情况下,原生的equals方法就不能满足我们的需求了.我们所知道的JavaBean的超类(父类)是Object类,JavaBean中的equals方法是继承自Object中的方法.Object类中定义的equals()方法是用来比较两个引用所指向的对原创 2022-04-04 21:39:41 · 133 阅读 · 0 评论 -
Java Coder为什么不建议使用Stack类来实现栈功能
最近在做Leetcode算法题的时候,发现了一个有趣的问题。当需要用到栈这种数据结构时,在java题解中,有的人使用的Stack类来实现,有的人使用LinkedList来实现,还有的人使用Queue或者Deque来实现。对于我这个菜鸡来说,小小的脑袋大大的问号,为了查清楚到底哪种写法是规范化的写法,本菜鸡在查看了很多技术文章后,终于理清了思路。下面直接贴一下我觉得总结的很全面的一篇微信公众号文章,希望能帮助到有同样问题的小伙伴。以下是原文在 Leetcode 的交流区,可以看到这样的一个讨.原创 2022-04-28 15:31:17 · 1297 阅读 · 0 评论 -
Java中的自动装箱与拆箱机制剖析
一.什么是装箱?什么是拆箱?装箱:将基本类型用他们的引用类型包装起来 拆箱:将包装类型转换为基本数据类型在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行Integer i = new Integer(10);而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了:Integer i = 10;这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱。跟装箱对应,就是自动原创 2022-03-03 17:12:55 · 287 阅读 · 0 评论 -
垃圾收集算法与垃圾收集器总结
一.垃圾收集算法1 标记-清除算法该算法分为“标记”和“清除”阶段:首先标记出所有不需要回收的对象,在标记完成后统一回收掉所有没有被标记的对象。它是最基础的收集算法,后续的算法都是对其不足进行改进得到。这种垃圾收集算法会带来两个明显的问题:效率问题 空间问题(标记清除后会产生大量不连续的碎片)2 标记-复制算法为了解决效率问题,“标记-复制”收集算法出现了。它可以将内存分为大小相同的两块,每次使用其中的一块。当这一块的内存使用完后,就将还存活的对象复制到另一块去,然后再把使用的空间一原创 2022-03-07 12:34:54 · 212 阅读 · 0 评论 -
CAS理解
java使用CAS之前,在JDK5之前Java语言是靠synchronized关键字保证同步的,这会导致有锁,锁机制存在以下问题:在多线程竞争下,加锁、释放锁会导致比较多的上下文切换和调度延时,引起性能问题 一个线程持有锁会导致其他所有需要此锁的线程挂起 如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置,引起性能风险独占锁是一个悲观锁,synchronized就是一种独占锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁。而另一种更加有效的锁就是乐观锁,CAS就是一种乐观原创 2022-02-23 21:05:28 · 615 阅读 · 0 评论 -
类文件结构及加载过程分析
一.类文件结构1.魔数:确定这个文件是否为一个能被虚拟机接收的Class 文件。2. Class 文件版本:Class 文件的版本号,保证编译正常执行。3.常量池 :常量池主要存放两大常量:字面量和符号引用。4.访问标志:标志用于识别一些类或者接口层次的访问信息,包括:这个Class是类还是接口。是否为public 或者 abstract 类型,如果是类的话是否声明为final 等等。5.当前类索引,父类索引:类索引用于确定这个类的全限定名,父类索引用于确定这个类的父类的全限定名,由于.原创 2022-03-07 12:53:52 · 468 阅读 · 0 评论 -
Collections 工具类和 Arrays 工具类常见方法总结
Collections 工具类和 Arrays 工具类常见方法CollectionsCollections 工具类常用方法:排序 查找,替换操作 同步控制(不推荐,需要线程安全的集合类型时请考虑使用 JUC 包下的并发集合)排序操作void reverse(List list)//反转void shuffle(List list)//随机排序void sort(List list)//按自然排序的升序排序void sort(List list, Comparator c)//定制转载 2022-03-09 10:24:27 · 581 阅读 · 1 评论 -
JMM中的指令重排,Volatile关键字(内存屏障)
JMM的概念Java内存模型,不存在的东西,概念!约定!关于JMM的一些同步的约定:1、线程解锁前,必须把共享变量立刻刷回主存。2、线程加锁前,必须读取主存中的最新值到工作内存中!3、加锁和解锁是同一把锁线程、工作内存与主存之间的关系内存交互操作有8种,虚拟机实现必须保证每一个操作都是原子的,不可在分的(对于double和long类型的变量来说,load、store、read和write操作在某些平台上允许例外)lock (锁定):作用于主内存的变量,把一个变量标识为线..原创 2022-02-23 21:00:07 · 305 阅读 · 0 评论 -
线程池详解
线程池优势1.降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;2.提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;3.方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。4.管理线程线程池需要掌握的知识点1.三大方法package com.kuang.pool;impor.原创 2022-02-23 20:51:22 · 116 阅读 · 0 评论 -
ConcurrentHashMap 线程安全的具体实现方式
一.JDK1.7首先将数据分为一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成。Segment 实现了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色。HashEntry 用于存储键值对数据。static class Segment<K,V> extends ReentrantL原创 2022-03-05 23:03:17 · 425 阅读 · 0 评论