Java语言
Java语法基础
Java集合
Java并发
Jvm
@xiao lin
广东工业大学在校生
展开
-
27.Java中单例模式的实现方式
枚举是实现单例模式的最佳方式,将单例对象定义为一个枚举类型,这种实现方式可以保证线程安全,同时也可以防止反射、反序列化破坏单例模式。原创 2024-05-23 01:42:32 · 552 阅读 · 0 评论 -
26.synchronized和ReentrantLock的区别
ReentrantLock可以实现选择性通知(借助Condition接口和NewCondition()方法实现,在一个Lock对象中创建多个Condition实例(对象监视器),线程可以注册在指定的Condition中,signal()方法会唤醒一个等待在该Condition上的线程,而signalAll()方法会唤醒所有等待在该Condition上的线程,从而实现有选择性的线程通知。),而synchronized不行,只能随机唤醒一个线程notify(),或者全部唤醒notifyAll()。原创 2024-05-19 23:35:55 · 297 阅读 · 0 评论 -
25.线程的状态、线程池的状态
在 Java 中,线程的状态和线程池的状态。原创 2024-05-18 22:19:49 · 281 阅读 · 0 评论 -
24.HashMap的扩容机制
JDK 1.7和JDK1.8的HashMap扩容机制。原创 2024-05-16 02:03:02 · 871 阅读 · 0 评论 -
23.HashMap的put方法流程
【代码】HashMap的put方法流程。原创 2024-05-15 22:07:22 · 554 阅读 · 0 评论 -
22.HashMap的底层数据结构
其中,桶数组是用来存储数据元素,链表是用来解决冲突(哈希冲突:多个键通过哈希函数处理后得到相同的哈希值),红黑树是为了提高查询的效率。原创 2024-05-15 17:55:47 · 266 阅读 · 0 评论 -
21.JVM的垃圾回收算法
标记-整理算法是在标记-清除算法的基础上进行改进,它的标记阶段与标记-清除算法一样,但后续不是直接清除可回收对象。而是将所有存活的对象移动到内存空间的一端,然后直接清理掉边界以外的内存空间。当这块区域用完了,就将还存活的对象复制到另一块区域,然后把使用过的这一块内存区域一次性清理掉。进行垃圾回收过程中会涉及对象的移动,那么为了保证对象引用更新的正确性,必须暂停所有的用户线程。b.清除阶段:会再次遍历所有的对象,回收被标记了的对象。a.标记阶段:会遍历所有的对象,标记出需要回收的对象。原创 2024-05-13 00:25:09 · 384 阅读 · 0 评论 -
20.并发,并行,串行之间的区别
并发就是在同一时刻,只有一个线程在执行,但是在一个时间段内,从整体上看是多个线程同时执行了。(并发的实现依赖于CPU切换线程,因为切换的时间特别短,所以用户基本上是感知不到的)并行就是在同一时刻多个线程都在同时执行。(要求有多个CPU分别执行一个线程)串行就是一个线程执行完,再执行另一个。原创 2024-05-12 23:30:29 · 143 阅读 · 0 评论 -
19.守护线程,用户线程
Java中线程分为两种,一种是daemon(守护线程),另一种是user(用户线程)。原创 2024-05-12 23:14:29 · 129 阅读 · 0 评论 -
18.异常的处理方式
是指遇到异常并不进行具体的处理,而是向上抛给上层调用者。b.throws,用在方法上,来声明可能会抛出的异常类,可以声明多个。a.throw, 用在方法里面显式地抛出异常对象。c.系统自动抛异常。原创 2024-05-10 00:09:37 · 375 阅读 · 0 评论 -
17.Java中的异常体系
b.RuntimeException运行时异常,程序运行时出现的异常,比如空指针异常(NullPointerException),数组下标越界异常(ArrayIndexOutOfBoundsException)等。Error是系统内部错误,这些错误通常是由Java虚拟机抛出的,程序无法捕获和处理。比如有栈溢出(StackOverflowError),内存溢出(OutOfMemoryError)。a.CheckedException受检异常,编译器会强制检查并要求处理的异常。原创 2024-05-09 23:34:18 · 165 阅读 · 0 评论 -
16.字节码
字节码就是Java程序经过编译之后产生的.class文件。原创 2024-05-09 23:01:15 · 185 阅读 · 0 评论 -
15.深拷贝与浅拷贝
指的是对对象的拷贝,而对象里面有两种数据类型,一种是基本数据类型,一种是引用数据类型。原创 2024-05-06 15:17:51 · 386 阅读 · 0 评论 -
14.List和Set的区别
List的实现类有 ArrayList,LinkedList,Vector。Set的实现类主要有HashSet,TreeSet。原创 2024-05-06 00:34:17 · 212 阅读 · 0 评论 -
13.ArrayList和LinkedList的区别
因为ArrayList基于数组实现,get(index)直接通过数组下标获取,时间复杂度为O(1);LinkedList基于双向链表实现,get(index)需要遍历链表,时间复杂度为O(n)。ArrayList的增删,如果是在数组末尾,直接插入或删除即可,但是如果在数组中间位置,则需要移动元素,而且还有可能触发扩容操作。LinkedList基于双向链表,无法根据序号直接获取元素,不支持随机访问。ArrayList基于数组实现,LinkedList基于双向链表实现。原创 2024-05-05 23:55:36 · 264 阅读 · 0 评论 -
12.重载和重写的区别
a.被 final(final关键字用于防止被修改),static(静态方法属于类本身),private(私有方法,只能在自己类中访问,子类访问不到)修饰的方法不能被重写。b.子类返回值范围小于等于父类,抛出异常范围小于等于父类,访问修饰符范围大于等于父类。重写发生在子类与父类之间,子类重写父类的方法,方法名和参数列表相同。重载在同一类中,方法名相同,参数列表不同。a.返回类型和访问权限没有限制。原创 2024-05-05 23:12:43 · 224 阅读 · 0 评论 -
11.==与equals的区别,hashCode与equals之间的关系
而在hashMap的源码中,是先通过hashCode方法获取对象的哈希值,比较两个对象的hash值是否相等,再通过equals方法来进行比较。一旦重写了equals方法,即不再用对象内存地址比较,有自定义的比较规则,那么为了保持这两个方法比较对象是否相等结果的一致性,所以也必须重写hashCode方法,让它不再通过对象的内存地址来获取哈希值,而是自定义其获取哈希值的方式,来实现两个对象使用equals方法比较为true 那么通过hashCode方法获取它们的hash值也必须相等。原创 2024-04-28 22:48:38 · 847 阅读 · 0 评论 -
10.String,StringBuffer,StringBuider之间的区别
String是引用类型,被final修饰,无法被继承。String的值创建后就不能被修改,任何对String值的修改都会引发新的String对象的生成。StringBuffer与String类似,但它的值可以被修改,使用Synchronized来保证线程安全。StringBuider是StringBuffer的线程不安全版本,但它的性能更高。原创 2024-04-28 21:43:55 · 183 阅读 · 0 评论 -
9.JDK,JRE,JVM之间的区别
JRE(Java Runtime Environment)Java运行时环境,是运行已编译Java程序所需所有资源的集合,包括JVM,Java类库,Java命令和其他的一些基础构件。JVM(Java Virtual Machine)Java虚拟机,Java程序运行在Java虚拟机上。针对不同的系统有不同的JVM,所以Java语言可以实现平台无关性。JDK(Java Development Kit)Java开发工具包,拥有JRE拥有的一切,还有编译器和工具,能够创建和编译程序。原创 2024-04-28 21:23:42 · 314 阅读 · 0 评论 -
8.Java中创建线程执行任务的方式
3.实现Callable接口,重写call方法,可以通过FutureTask来获取任务执行的返回值。1.继承Thread类,重写run方法,调用start()启动线程。以上两种方式没有返回值,要获取线程的执行结果,可以。2.实现Runnable接口,重写run方法。原创 2024-04-23 22:36:04 · 165 阅读 · 0 评论 -
7.对象的创建过程
5.然后设置对象头,对象头里包含了对象是哪个类的实例、如何找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。2.检查这个符号引用代表的类是否已被加载、解析和初始化过,如果还没有,就执行相应的类加载过程。4.内存分配完成之后,JVM将分配到的内存空间(其中不包括对象头)都初始化为零值。1.首先检查这个指令的参数是否能在常量池中定位到一个类的符号引用。3.类加载检查通过后,JVM就会为这个新生的对象分配内存。原创 2024-04-23 21:43:03 · 276 阅读 · 0 评论 -
6.类加载器,类加载过程,类的生命周期
用户自定义类加载器(user ClassLoader),用户通过继承 java.lang.ClassLoader类的方式自定义实现的类加载器。原创 2024-04-22 17:50:26 · 363 阅读 · 0 评论 -
5.JVM内存模型
JVM内存区域分为线程私有区和线程共享区,其中方法区和堆是线程共享区,虚拟机栈,本地方法栈,程序计数器是线程隔离的数据区。原创 2024-04-22 11:22:28 · 164 阅读 · 0 评论 -
4.常见典型锁策略
乐观锁认为锁竞争是不激烈的,即是多个线程同时访问同一个共享变量冲突的概率是较小的,所以并不会真正地去加锁,而是直接尝试去访问数据。(其中写锁是只能被独占的,读锁是可以被共享的)实现的方式是:在锁中记录持有该锁的线程身份以及一个计数器来记录该线程的加锁次数,如果发现当前尝试加锁的线程就是此时持有锁的线程,则计数器+1即可。自旋锁的优点是:没有放弃CPU资源,一旦锁被其它线程释放就能第一时间获取到锁,更高效,在锁持有时间比较短的场景下非常有用。悲观锁的实现:先加锁,获取到锁再去操作数据,获取不到锁就等待。原创 2024-04-18 10:43:22 · 422 阅读 · 0 评论 -
3.CAS机制
CAS叫做CompareAndSwap,比较并交换,主要是通过处理器的指令来保证操作的原子性。CAS指令包含3个参数:共享变量的内存地址、预期的值、该共享变量要设置成的新值。只有当共享变量内存地址处的值等于预期的值时,才能将该共享变量设置成新值。作为一条CPU指令,CAS指令本身是能够保证原子性的。原创 2024-04-16 19:28:48 · 275 阅读 · 0 评论 -
2.常见的Java集合
集合相关的类和接口都在Java.util中,主要分为三种: List(列表)、Set (集)、Map (映射)。Map是另外的接口,是键值对映射结构的集合。List:存储的元素是有序的,可重复的。Set:存储的元素是无序的,不可重复的。原创 2024-04-08 23:09:08 · 123 阅读 · 0 评论 -
1.理解Java面向对象
多态是指程序中定义的引用变量所指向的具体类型和通过这个引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定。子类拥有父类所有的属性和方法(包括私有属性和私有方法),但是对于父类中的私有属性和私有方法,子类只是拥有,无法访问。Java中有两种形式实现多态:继承(多个子类对父类同一方法的重写)和接口(实现接口并重写接口中的同一方法)。继承是使用已经存在的类作为基础创建新的类,子类继承父类的属性和方法,也可以增加新的属性和方法。可以把一个对象的属性私有化,同时可以对外界提供一些访问属性的方法。原创 2024-04-08 22:45:33 · 279 阅读 · 0 评论