![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java基础
文章平均质量分 74
Java的基础知识整理
Alex_ChuTT
这个作者很懒,什么都没留下…
展开
-
HashMap详解(三)
上一篇分析的扩容是基于JDK1.8,当发生哈希碰撞的时候采用尾插法,并会动态决定用红黑树和链表来串,但是我们还是有必要了解一下,简单来说:HashMap在多线程操作的时候,由于碰撞的时候链表采用头插法,线程A执行put的时候发现需要扩容,走到一半挂起,线程B也去put发现需要扩容,则resize,rehash一顿操作并把位置放好了,此时A线程拿到时间片操作也是一顿操作,此时出现同一index的第一个和第二个键值对相互指向,形成循环链表,此时get(第一个key)和get(第二个key)其实也都是没问题的,原创 2020-07-22 11:50:08 · 191 阅读 · 0 评论 -
HashMap详解(二)
上一篇写到了HashMap的底层结构、构造函数、重要参数等putVal(), put(K key, V value) //put一个键值对,底层其实走的是下面的putVal()方法 public V put(K key, V value) { return putVal(hash(key), key, value, false, true); }final V putVal(int hash, K key, V value, boolean onlyIfAbsen原创 2020-07-21 20:02:54 · 133 阅读 · 0 评论 -
HashMap详解(一)
字典小学时候的新华字典,通过偏旁部首找到了某个字,HashMap原理和这差不多,有的编程语言就命名这种数据结构叫字典。前置知识计算机的物理存储结构(数组、链表)数组:采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为O(1);通过给定值进行查找,需要遍历数组,逐一比对给定关键字和数组元素,时间复杂度为O(n),当然,对于有序数组,则可采用二分查找,插值查找等方式,可将查找复杂度降低为O(logn);对于一般的插入删除操作,涉及到数组元素的移动,其平均复杂度为O(n)链表对于链表原创 2020-07-21 19:00:32 · 248 阅读 · 0 评论 -
[转载]双重校验单例模式的经典实现为什么要加volatile
双重校验单例模式的经典实现为什么要加volatile这里加volatile关键字的用途是为了防止指令重排class Singleton{ private volatile static Singleton singleton; public static Singleton getInstance(){ if(singleton == null){ // 语句1 synchronize转载 2021-02-07 14:33:43 · 126 阅读 · 0 评论 -
进程的预备知识
进程隔离在操作系统中,进程与进程间的内存和数据都是不共享的。两个进程就好像大海中相互独立的两个岛屿,各自生活在互相平行的两个世界中,互不干扰,各自为政。这样做的目的,是为了避免进程间相互操作数据的现象发生,从而引起各自的安全问题。为了实现进程隔离,采用了虚拟地址空间,两个进程各自的虚拟地址不同,从逻辑上来实现彼此间的隔离。跨进程通信每一个进程完成的功能有限,就像现在的你我,往往只能做一个需求里的一个或者几个任务,而不是把所有事情都给做了,就这样,每个进程就时不时需要与其他进程之间通信了。两个进程原创 2020-08-06 15:12:39 · 226 阅读 · 0 评论 -
依赖倒置原则的理解
一直不太理解这个原则,直到看到了这个例子:class DriverTest { @Test fun main(){ val driver = Driver() val benz = Benz() driver.driver(benz) }}class Driver{ fun driver(car: Benz){ car.run() }}class Benz{ fun run(){原创 2020-12-11 18:38:36 · 304 阅读 · 0 评论 -
Java和Android序列化相关知识点记录
概念序列化:将数据结构或对象转换成二进制串的过程。反序列化:反之。常见的序列化协议Serializable Java的序列化方案Parcelable Android独有json,xml,protbuf … 广义的序列化Serializablepublic interface Serializable { }Serializable 用来标识当前类可以被 ObjectOutputStream 序列化,以及被 ObjectInputStream 反序列化。public c原创 2020-12-08 14:14:26 · 102 阅读 · 0 评论 -
Java线程梳理
线程和进程的基本概念线程:一言以蔽之就是CPU调度的最小单位,必须依赖于进程。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享。进程:一言以蔽之就是程序运行资源分配的最小单位,当我们运行一个程序,就启动了一 个进程。显然,程序是死的、静态的,进程是活的、动态的。进程可以分为系统进程和用户进程。凡是用于完成操作系统的各种功能的进程就是系统进程,用户进程就是所有由我们启动的进程。CPU核心数和线程的关系一般情况原创 2020-12-07 23:07:54 · 118 阅读 · 0 评论 -
动态代理相关知识记录
静态代理抽象角色 指代理角色和真实角色对外提供的公共方法,一般为一个接口真实角色 需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色调用。也就是真正的业务逻辑在此代理角色 需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。将统一的流程控制都放到代理角色中处理!静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现相同的接口或者是继承相同父类。一般来说,被代理对象和代理对象是一对一的关系,当然一原创 2020-12-06 00:39:16 · 122 阅读 · 0 评论 -
Java注解和反射相关知识总结
注解与声明一个"Class"不同的是,注解的声明使用 @interface 关键字。一个注解的声明如下:/** - Created by Alex on 12/1/20 */public @interface PassengerType {}元注解:作用在注解上的注解@TargetElementType.ANNOTATION_TYPE 可以应用于注解类型。ElementType.CONSTRUCTOR 可以应用于构造函数。ElementType.FIELD 可以应用于字段原创 2020-12-03 00:07:08 · 123 阅读 · 0 评论 -
Java泛型知识点总结
为什么需要泛型适用于多种数据类型执行相同的代码。比如:List list = new ArrayList<>()list.add("aa");list.add("bb");list.add(123);因为List里面可以放object,所以上面没问题。但是在取出元素用的时候 就容易出现 int转成string报错ClassCastException。而使用泛型List<String>lisit = new ArrayList<>();在编译期不允原创 2020-11-26 14:11:35 · 255 阅读 · 0 评论