
Java
文章平均质量分 59
分享 Java 学习心得
阿越coding
Fighting!
展开
-
JDK 8 ArrayList 的扩容机制
调用 add 方法时,public boolean add(E e) { // 先获取最小扩容量 ensureCapacityInternal(size + 1); // 为数组赋值,完成添加。 elementData[size++] = e; return true;}先获取最小扩容量,若数组为空,则为默认容量 10,否则为 size + 1,size 指当前存储的元素个数。private void ensureCapacityInternal(int原创 2021-06-17 16:46:25 · 300 阅读 · 0 评论 -
AtomicInteger 底层实现原理
AtomicIntger 是对 int 型的封装,底层基于 CAS 提供原子性的操作,并用 volatile 修饰属性 value,保证可见性。private volatile int value;CAS 指比较并写回,是一种轻量级锁。底层通过操作系统原语实现,保证了原子性。在 CAS 中,线程读取数据不用加锁,在准备写回时,比较原值是否修改,若未被修改则写回,若已被修改,则重新执行读取流程,这是一种乐观策略,认为并发冲突并不总会发生。它适用于少量线程竞争的场景,但会存在几个问题:ABA:比如原创 2021-05-22 12:01:59 · 474 阅读 · 0 评论 -
简述 synchronized 底层原理及锁升级
底层原理讲一下 synchronized 关键字的底层原理?synchronized 是最常用一种的线程同步方式,可以锁对象、代码块以及方法,底层原理和 JVM 有关。对象在内存中分为三块区域:对象头、实例数据和对齐填充,对象头中保存了指向 Monitor 地址。Monitor 中有 Owner 和 计数器,Owner 指向持有 Monitor 的线程,计数器从 0 开始记录进入数。另外还有两个队列:EntryList、WaitSet,用来存放进入及等待获取锁的线程。进入 synchron原创 2021-05-20 08:41:16 · 317 阅读 · 0 评论 -
看招,Java 基础十连击!
面向对象面向对象是一种编程思想,从业务中抽象出一个个类,类中包含属性和方法,相比直接实现函数功能的面向过程,更容易维护和扩展,有封装、继承、多态三大特性:封装:将对象的属性私有化,对外只提供接口访问,从而隐藏内部实现,提高程序安全性。继承:从已有类得到继承信息创建新类的过程,实现了代码的复用。子类拥有父类所有属性和方法,但无法访问访问父类私有属性和方法。子类可以拥有自己的属性和方法。子类可以重写父类方法。多态:分为编译时多态(重载)和运行时多态(重写)重载:指同一个类中同名的方法有不同原创 2021-05-10 09:54:23 · 101 阅读 · 0 评论 -
【Java集合】4 HashMap
文章目录简单介绍实现原理hashputgetresize长度为 2 的整数次方1.8 的优化和 Hashtable 的区别线程安全性节点无序简单介绍Q:简单介绍一下 HashMap?概述+原理+属性+方法:概述HashMap 与 Hashtable 类似,基于哈希表实现,但支持 null 键和值,并且不是线程安全的,性能更好;散列正常时,能提供常数时间的 put / get 操作,但不保证有序;如果需要满足线程安全,可以用 Collections.synchronizedMap(),或者直接用原创 2020-10-19 08:38:21 · 111 阅读 · 1 评论 -
【Java集合】3 HashSet
文章目录实现原理元素不重复实现原理Q:HashSet 的实现原理?HashSet 基于 HashMap 实现,底层创建了一个 Dummy 对象 “PRESENT” 作为 value,所有元素以键的形式放入 HashMap 中,即 HashSet 是以哈希算法来存储元素,所以散列正常时,能提供常数时间的 add、remove 和 contain 操作,但不保证有序。元素不重复Q:HashSet 怎么保证元素不重复的?HashSet 基于 HashMap 实现,底层创建了一个 Dummy 对象 “P原创 2020-10-19 08:37:56 · 82 阅读 · 0 评论 -
【Java集合】2 ArrayList
文章目录VectorLinkedListVectorQ:ArrayList 和 Vector 的区别?都是基于动态数组实现,支持随机访问,查询快,增删慢,因为要移动后续所有的元素,但 Vector 是线程安全的,ArrayList 不是线程安全的,性能更好;底层使用对象数组保存数据,当数组满时,会自动扩容,创建新的数组,并拷贝原有数组数据,扩容后 ArrayList 容量增加 50%,Vector 增加一倍。LinkedListQ:ArrayList 和 LinkedList 的区别?都原创 2020-10-18 21:56:05 · 368 阅读 · 3 评论 -
【Java集合】1 集合概述
Q:Java 中常用的集合有哪些?Java 集合分为 Collection 和 MapCollectionColletion 包括 List、Set、QueueList:有序集合,允许有重复元素,主要实现类有Vector:线程安全的动态数组ArrayList:与 Vector 类似,基于动态数组实现,支持随机访问,查询快,增删慢,因为要移动后续所有的元素,但它不是线程安全的,性能更好;底层都是使用对象数组保存数据,当数组满时,会自动扩容,创建新的数组,并拷贝原有数组数据,扩容后容量 Arra原创 2020-10-18 21:54:44 · 318 阅读 · 4 评论 -
【Java基础】8 泛型
Java 泛型是通过「类型擦除」实现的伪泛型;类型擦除:指泛型信息只存在编译阶段,之后便会被擦除,所以运行期找不到任何与类型相关的信息;这样做的目的是,为了兼容 Java 5 之前的二进制类库。使用伪泛型的好处在于,实现简单;能提供编译时的类型安全,比如能确保将正确类型的对象放入集合中,避免在运行时出现 ClassCastException;运行期能节省一些类型所占的内存空间;缺点:远不如真泛型灵活和强大。Q:int 可以作为泛型类型吗?基本数据类型不能做泛型类型,可以使用对应的包装原创 2020-10-18 21:51:25 · 145 阅读 · 0 评论 -
【Java基础】7 动态代理
动态代理是代理模式的一种,代理模式指通过代理静默地解决一些业务无关的问题,比如远程、安全、事务、日志、资源关闭等,让开发者可以只关心业务。分为静态、动态代理:静态代理:事先写好代理类实现简单,且不侵入原码缺点是每个业务类都需要写一个,非常不灵活,而且有冗余问题// 静态代理,给 UserService 添加日志处理public class UserServiceProxy implements UserService { // 被代理对象 private UserServi原创 2020-10-18 21:50:45 · 92 阅读 · 0 评论 -
【Java基础】6 反射机制
Q1:什么是反射?反射:指在运行时,能取得任意类的内部信息,调用任意对象的属性及方法,的一种机制。Q2:反射如何实现?它借助于 Reflection API 实现,主要涉及四个类:Field:提供类的属性信息;getFields() 、getDeclaredFields(),获取类公有或所有声明的字段;set() 设置属性值;Method:提供类的方法信息;getMethods() 、getDeclaredMethods(),获取类公有或所有声明的非构造的方法;之后使.原创 2020-10-18 21:50:20 · 100 阅读 · 0 评论 -
【Java基础】5 异常体系
文章目录Exception、Errorthrow、throwsException、ErrorException 和 Error 都是 Throwable 的子类,区别在于:Exception 表示程序可以处理的异常,可以捕获且可能恢复,分为受检查异常和运行时异常:受检查异常:必须显式地进行捕获处理,否则编译不通过,如 IOException 等;运行时异常:通常是可以编码避免的逻辑错误,编译能通过,但是一运行就终止,如 NullPointerException、ClassCastExcepti原创 2020-10-18 21:48:21 · 70 阅读 · 0 评论 -
【Java基础】4 equals()
文章目录==hashCode()==Q:== 和 equals 的区别?==:运算符对于基本数据类型,比较数值是否相等;对于引用类型,比较对象内存地址是否相同。equals():Object 类的方法,用于比较两个对象是否相等,不能比较基本数据类型。默认实现是,用 == 比较对象的内存地址;一般会重写,转换成值的比较。Q:null 哪个能用?都能用,但在 equals 只能做参数Q:不重写equals方法,那么a==b和a.equals(b)一样吗?一样,equals 默认原创 2020-10-18 21:47:01 · 197 阅读 · 0 评论 -
【Java基础】3 final
Q:final、finally、finalize 的区别?final修饰类,表示被不可继承;修饰方法,表示不可被重写;从而保护类的基础功能不被篡改。修饰变量:对于基础类型,使其数值不变,可用于保护只读数据,减少额外的同步开销;对于引用类型,使其引用不变,但对象本身不受影响;比如,修饰一个 list 对象,它的引用不能被修改,但可以正常增删元素,要 list 真正不可变,要用 Java 9 后提供的 list.of() 。List<String> list = List.of(原创 2020-10-18 21:45:11 · 83 阅读 · 0 评论 -
【Java基础】2 基础类
基础类StringObjectStringQ:String、StringBuilder、StringBuffer 的区别?String:底层用被 final 修饰的 char 数组保存数据,所以它是不可变的,也是线程安全的;Java 9 后改用 byte 数组和一个标识编码的属性 coder,因为发现实际存储拉丁字符居多,改用 byte 可以节省内存,提高操作速度;由于 String 的不可变,所以每次对它的改变,都要产生新的 String 对象,这会影响系统的性能,所以只适合操作少量数据。原创 2020-10-18 21:43:51 · 135 阅读 · 1 评论 -
【Java基础】1 基本特性
Java 特点是:是一门面向对象的语言,相比直接实现功能的面向过程语言,更易维护和扩展,有封装、继承、多态三大特性:封装:将对象的属性私有化,对外只提供接口访问;继承:从已有类得到继承信息创建新类的技术。子类拥有父类所有属性和方法,但父类私有属性、方法子类无法访问;子类可以扩展,拥有自己的属性和方法;子类可以重写父类方法;多态:同个引用调用同个方法,因实例不同执行不同的操作;分为编译时多态(方法重载)和运行时多态(方法重写);重载:同个类中同名的方法有不同的参数列表,不能根据返回类型进行区分;原创 2020-08-08 09:55:59 · 189 阅读 · 0 评论