
Java核心
文章平均质量分 52
罗彬桦
君子以自强不息
展开
-
通用权限解决方案介绍
通用权限设计目前一些知名的权限框架有Shiro和Soring Security。正常情况,直接使用框架没什么问题,方便,快速,但是需要一定的学习成本,得学习如何使用这些框架。用框架还有一个缺点是不太好定制,因为每个产品的业务都不太一样要控制的权限都不太一样,此时如果硬是套用框架,就会很别扭。通用权限的设计解决方案权限拦截的对象:用户权限拦截的点:菜单(控台左侧的菜单),路由,接口,按钮控制用户对资源的访问权限的操作:配置,读取,拦截100用户 × 100资源(直接用户和资源做关联来控制权限,原创 2021-05-16 13:27:19 · 741 阅读 · 0 评论 -
JVM内存结构详解
JVM内存结构堆虚拟机栈方法区常量池-静态常量池也叫class文件常量池,主要存放: 字面量:例如类和接口的全限定名、字段的名称和描述符、方法的名称和描述符常量池-运行时常量池当类加载到内存中后,JVM就会将静态常量池中的内容存放到运行时的常量池中;运行时常量池里面存储的主要是编译期间生成的字面量、符号引用等等常量池-字符串常量池字符串常量池,也可以理解成运行时常量池分出来的一部分,类加载到内存的时候,字符串,会存到字符串常量池里面持久...原创 2021-08-19 20:37:08 · 86 阅读 · 0 评论 -
必知必会的注解
反射的获取源用XML来保存类相关的信息以供反射调用用注解来保存类相关的信息以供反射调用注解提供一种为程序元素设置元数据的方法元数据是添加到程序元素如方法、字段、类和包上的额外信息注解是一种分散式的元数据设置方式,XML是集中式的设置方式注解不能直接干扰程序代码的运行注解的核心是 package java.lang.annotation;所有注解类均继承Annotation,通过反编译可以了解到注解的功能作为特定的标记,用于告诉编译器一些信息编译时动态处理,如动态生成代码原创 2021-05-31 16:20:49 · 70 阅读 · 0 评论 -
J.U.C知识点梳理
J.U.C知识点梳理java.util.concurrent:提供了并发编程的解决方案CAS是java.util.concurrent.atomic包的基础AQS是java.util.concurrent.locks包以及一些常用类比如Semophore,ReentrantLock等类的基础J.U.C包的分类线程执行器executor锁locks原子变量类atomic并发工具类tools并发集合collections并发工具类闭锁 CountDownLatch栅栏 Cyc原创 2021-05-24 22:21:05 · 271 阅读 · 0 评论 -
ConcurrentHashMap
如何实现线程安全的Mappackage com.interview.javabasic.threadtest;import java.util.Collections;import java.util.HashMap;import java.util.Map;public class SafeHashMapDemo { public static void main(String[] args) { Map hashMap = new HashMap();原创 2021-05-24 20:47:51 · 103 阅读 · 0 评论 -
HashMap
集合之MapMap的key是基于Set的,说明具有去重功能的Map的value是基于Collection的,所以可以重复HashMap、HashTable、ConccurentHashMapHashMap(Java8以前):数组+链表 //数组查询较快增删较慢、链表查询速度慢增删较快默认数组长度是16的,每个数组存储的就是链表的头结点。通过 hash(key.hashCode())%len(通过位运算)来确定存放的数组位置,如果hash取到的值常相同,这样会让桶特别长,由于链表查询需要重原创 2021-05-23 22:41:22 · 119 阅读 · 0 评论 -
Collection体系
Java集合框架工作中消失而面试却长存的算法与数据结构优秀的算法和数据结构被封装到了Java的集合框架之中数据结构考点数组和链表的区别;链表的操作,如反转,链表环路检测,双向链表,循环链表相关操作;队列,栈的应用;二叉树的遍历方式及其递归和非递归的实现;红黑树的旋转;算法考点内部排序:如递归排序、交换排序(冒泡、快排)、选择排序、插入排序;外部排序:应掌握如何利用有限的内存配合海量的外部存储来处理超大的数据集,写不出来也要有相关的思路。考点扩展哪些排序是不稳定的,稳定原创 2021-05-23 21:27:45 · 284 阅读 · 3 评论 -
Java异常要点分析
Java的异常处理机制抛出异常:创建异常对象,交由运行时系统处理捕获异常:寻找合适的异常处理器处理异常,否则终止运行package 任务5;public class ExceptionHandleMechanism { public static int doWork() { try { int i = 10 / 0; System.out.println("i="+i); } catch (ArithmeticException e) { //捕获 Arithme原创 2021-05-22 21:57:17 · 158 阅读 · 1 评论 -
Java异常体系
Java异常体系Java异常以及常用工具类体系Java异常异常处理机制主要回答了三个问题What:异常类型回答了什么被抛出Where:异常堆栈跟踪回答了在哪抛出Why:异常信息回答了为什么被抛出Error和Exception的区别RuntimeException:不可预知,程序应当自行避免非RuntimeException:可预知的,从编译器校验的异常从责任角度看:Error属于JVM需要负担的责任;RuntimeException是程序应该负担的责任;Checked原创 2021-05-22 21:09:50 · 86 阅读 · 2 评论 -
Java线程池
Java线程池Pool池塘,Executor执行利用Executors创建不同的线程池满足不同场景的需求newFiexdThreadPool(int nThreads)指定工作线程数量的线程池newCachedThreadPool()处理大量短时间工作任务的线程池,(1) 试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;(2) 如果线程闲置的时间超过阈值,则会被终止并移除缓存;(3) 系统长时间闲置的时候,不会消耗什么资源newSingleThreadExecu原创 2021-05-22 20:33:44 · 171 阅读 · 0 评论 -
CAS
CAS(Compare and Swap)一种高效实现线程安全性的方法支持原子更新操作,适用于计数器,序列发生器等场景属于乐观锁机制,号称lock-freeCAS操作失败时由于开发者决定是继续尝试,还是执行别的操作CAS思想包含三个操作数——内存位置(V)、预期原值(A)和新值(B)public class CASCase { public volatile int value; public synchronized void add() { value++; }}原创 2021-05-22 19:20:59 · 76 阅读 · 0 评论 -
jmm的内存可见性
什么是Java内存模型中的happens-beforeJava内存模型JMMJava内存模型(即Java Memory Model,简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JMM中的主内存存储Java实例对象包括成员变量、类信息、常量、静态变量等属于数据共享的区域,多线程并发操作时会引发线程安全问题...原创 2021-05-22 19:01:19 · 223 阅读 · 0 评论 -
synchronized和ReentrantLock的区别
ReentrantLock(再入锁)位于java.util.concurrent.locks包和CountDownLatch、FutureTask、Semaphore一样基于AQS实现能够实现比synchronized更细粒度的控制,如控制fairness调用lock()之后,必须调用unlock()释放锁性能未必比synchronized高,并且也是可重入的ReentrantLock公平性设置ReentrantLock fairLock = new ReentrantLock(tru原创 2021-05-22 12:47:48 · 77 阅读 · 0 评论 -
synchronized底层实现原理
synchronized底层实现原理实现synchronized的基础Java对象头Monitor对象在内存中的布局对象头实例数据对齐填充对象头的结构Mark Word原创 2021-05-22 01:13:36 · 729 阅读 · 1 评论 -
synchronized
synchronized线程安全问题的主要诱因存在共享数据(也称临界资源)存在多线程共同操作这些共享数据解决问题的根本方法:同一时刻有且只有一个线程在操作共享数据,其他线程必须等到该线程处理完数据后再对共享数据进行操作互斥锁的的特性互斥性: 即在同一时间允许一个线程持有某个对象锁,通过这种特性来实现多线程的协调机制,这样在同一时间只有一个线程对需要同步的代码块(复合操作)进行访问。互斥性也称为操作的原子性。可见性: 必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线原创 2021-05-21 20:00:57 · 85 阅读 · 0 评论 -
线程状态以及状态之间的转换图
原创 2021-05-21 17:29:29 · 145 阅读 · 0 评论 -
interrupt函数
如何中断线程已经被抛弃的方法通过调用stop()方法停止线程 //太暴力通过调用suspend()和resume()方法目前使用的方法调用interrupt(),通知线程应该中断了1、如果线程处于被阻塞状态,那么线程将立即退出被阻塞状态,并抛出一个InterruptedException异常。2、如果线程处于正常活动状态,那么会将该线程的中断标志设置为true。被设置中断标志的线程将继续正常运行,不受影响。需要被调用的线程配合中断1、在正常运行任务时,经常检查本线程的中断标志位,如果原创 2021-05-21 13:36:31 · 1065 阅读 · 0 评论 -
yield函数
yield概念当调用Thread.yield()函数时,会给线程调度器一个当前线程愿意让出CPU使用的暗示,但是线程调度器可能会忽略这个暗示。线程调度器忽略了这个暗示package com.interview.javabasic.thread;public class YieldDemo { public static void main(String[] args) { Runnable yieldTask = new Runnable() {原创 2021-05-21 12:42:49 · 321 阅读 · 0 评论 -
notify和notifyall的区别
notify和notifyall的区别可以通过notify或者是notufyall对锁进行唤醒package com.interview.javabasic.thread;public class WaitSleepDemo { public static void main(String[] args) { final Object lock = new Object(); new Thread(new Runnable() { @O原创 2021-05-21 10:15:52 · 303 阅读 · 0 评论 -
sleep和wait的区别
sleep和wait的区别基本的差别sleep是Thread类的方法,wait是Object类中定义的方法sleep()方法可以在任何地方使用wait()方法只能在synchronized方法或者synchronized块中使用最主要的本质区别Thread.sleep只会让出CPU,不会导致锁行为的改变Object.wait不仅让出CPU,还会释放已经占有的同步资源锁package com.interview.javabasic.thread;public class WaitS原创 2021-05-21 02:27:24 · 255 阅读 · 0 评论 -
线程的状态
线程的状态六个状态新建(New):创建后尚未启动的线程的状态运行(Runnable):包含Running和Ready无限期等待(Waiting):不会被分配CPU执行时间,需要显式被唤醒没有设置 Timeout 参数的 Object.wait()方法。没有设置 Timeout 参数的 Thread.join()方法LockSupport.park()方法。限期等待(Timed Waiting):在一定时间后会由系统自动唤醒Thread.sleep()方法。设置了 Timeout原创 2021-05-21 01:41:01 · 72 阅读 · 0 评论 -
如何实现处理线程的返回值
如何给run()方法传参实现的方法主要有三种构造函数传参成员变量传参回调函数传参如何实现处理线程的返回值实现的方式主要有三种主线程等待法package com.interview.javabasic.thread;public class CycleWait implements Runnable { private String value; public void run() { try { Thread.curren原创 2021-05-20 23:52:36 · 267 阅读 · 0 评论 -
Thread和Runnable的关系
Thread和Runnable是什么关系Threadpackage com.interview.javabasic.thread;public class MyThread extends Thread{ private String name; public MyThread(String name) { this.name = name; } @Override public void run() { for (int i原创 2021-05-19 23:42:06 · 162 阅读 · 0 评论 -
线程的start和run方法的区别
Thread中的start和run方法的区别public class ThreadTest { private static void attack(){ System.out.println("Fight"); System.out.println("Current Thread is : " + Thread.currentThread().getName()); } public static void main(String[] args原创 2021-05-19 21:08:19 · 98 阅读 · 0 评论 -
Java异常简单理解
Java异常什么是异常如何处理异常try-catch-finallythrowthrows自定义异常异常链什么是异常错误在外面编写程序的过程中经常发生,包括编译期间和运行期间的错误。编译期间的错误:括号没有正常的配对语句结束后少写了分号;关键字编写错误运行期间的错误:使用空的对象引用调用方法String str = null;System.out.println(str.length());数组访问时下标越界int[] ary={1,2,3};for(原创 2021-03-29 00:20:59 · 244 阅读 · 0 评论 -
Java包装类
Java包装类知识点:什么是包装类包装类与基本数据类型之间的对应关系包装类的常用方法JAVA中的数据类型为什么需要包装类?因为上述数据类型不能喝对象一样拥有属性、方法、以及对象化的进行交互,那么包装类的产生就是为了解决这种问题。包装类与基本数据类型大部分的包装类和基本数据类型基本相同,只有int-Integer,char-Character,变化较大。基本数据类类型和字符串之间的转换public class WrapTestTwo { public static void ma原创 2021-03-30 11:22:31 · 89 阅读 · 0 评论 -
Java范型
范型 Generics让数据类型变得参数化定义范型时,对应的数据类型是不确定的范型方法被调用时,会指定具体类型核心目标,解决容器类型在编译时安全检查的问题public class GenericDemo { public static void main(String[] args) { List<String> linkedList = new LinkedList(); linkedList.add("works");//原创 2021-03-30 22:02:15 · 325 阅读 · 0 评论 -
Java集合排序
集合排序概述集合中的基本数据类型排序集合中的字符串排序Comparator接口Comparable接口数组的排序//数组排序int[] arr = {15,31,23,46,65,12};Arrays.sort(arr);使用Collections类的sort()方法sort(List list)根据元素的自然顺序对指定列表按升序进行排序。对整型进行排序package com.imooc.sort;import java.util.ArrayList;import原创 2021-05-06 13:16:54 · 164 阅读 · 0 评论 -
集合总结
总结ArrayList低层由数组实现元素有序可以重复可以动态增长,以满足应用程序的需求元素值可以为nullHashSet元素无序并且不可以重复只允许一个null元素记得迭代器的使用HashMap键不能重复允许使用null值和null键HashMap中的Entry对象是无序排列的Iterator(迭代器)Iterator接口以统一的方式对各种集合元素进行遍历Iterator<String> it = set.iterator();while(it原创 2021-05-05 20:04:24 · 97 阅读 · 0 评论 -
Java-Map
MapMap中的数据是以键值对(key-value)的形式存储的key-value以Entry类型的对象实例存在可以通过key值快速地查找value一个映射不能包含重复的键每个键最多只能映射到一个值Map中最常见的一个MapHashMap基于哈希表的Map接口的实现允许使用null值和null键key值是不允许重复的HashMap中的Entry对象是无序排列的案例1完成一个类似字典的功能。将单词以及单词的注释存储到HashMap中显示HashMap中的内容查找某个单原创 2021-05-05 18:58:16 · 79 阅读 · 0 评论 -
Java集合-Set
SetSet是元素无序并且不可以重复的集合,被称为集。HashSetHashSet是Set的一个重要实现类,称为哈希集HashSet中的元素无序并且不可以重复HashSet只允许一个null元素具有良好的存取和查找性能案例:用HashSet存储多个表示颜色的英文单词,并输出。单词包括:“blue”、“red”、“black”、“yellow”、和 “white”Iterator(迭代器)Iterator接口可以以统一的方式对各种集合元素进行遍历hasNext()方法检原创 2021-04-28 20:10:28 · 192 阅读 · 0 评论 -
Java集合-List
Java集合概念体系结构实际应用在体育课中经常有集合。JAVA中的集合是工具类,可以存储任意数量的具有共同属性的对象。存储商品的信息数组 ?集合疑问:为什么使用集合,而不用数组呢?问题:存储20名学生的学生信息。问题:存储商品信息应用场景无法预测存储数据的数量同时存储具有一对一关系的数据需要进行数据的增删数据重复问题集合框架的体系结构Collection: 类的对象Map: 键值对Collection有3个子接口List //表示序列,Queue //表原创 2021-04-20 10:32:37 · 118 阅读 · 0 评论 -
什么是反射
反射JAVA 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。package com.imooc.javabasic.reflect;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Meth原创 2021-05-13 00:31:45 · 85 阅读 · 0 评论 -
反射之获取并操作成员方法
反射之获取并操作成员方法package demo.reflect;public class ReflectTarget extends ReflectTargetOrigin{ //-----构造函数-------- //(默认的带参数构造函数) ReflectTarget(String str) { System.out.println("(默认)的构造方法s = " + str); } //无参构造函数 public Reflec原创 2021-04-18 21:32:36 · 86 阅读 · 0 评论 -
反射获取成员变量的主要方法
反射获取成员变量的主要方法package demo.reflect;public class ReflectTarget { //-----构造函数-------- //(默认的带参数构造函数) ReflectTarget(String str) { System.out.println("(默认)的构造方法s = " + str); } //无参构造函数 public ReflectTarget(){ Sy原创 2021-04-18 21:28:52 · 371 阅读 · 0 评论 -
反射之获取并操作构造函数
反射的主要用法如何获取类的构造方法并使用如何获取类的成员变量并使用如何获取类的成员方法并使用package demo.reflect;public class ReflectTarget { //-----构造函数-------- //(默认的带参数构造函数) ReflectTarget(String str) { System.out.println("(默认)的构造方法s = " + str); } //无参构造函数 p原创 2021-04-18 20:22:40 · 556 阅读 · 0 评论 -
利器之反射
利器之反射谈谈反射允许程序在运行时来进行自我检查并且对内部的成员进行操作反射主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义java.lang.reflect类库里面主要的类Field:表示类中的成员变量Method:表示类中的方法Constructor:表示类的构造方法Array:该类提供了动态创建数组和访问数组元素的静态方法反射机制的作用在运行时判断任意一个对象所属的类在运行时获取类的对象在原创 2021-04-08 12:40:48 · 68 阅读 · 0 评论 -
Java垃圾回收之常见面试题
GC相关的面试题Object和finalize()方法的作用是否与C++的析构函数作用相同与C++的析构函数不同,析构函数调用确定,而它的是不确定的将末被引用的对象放置于F-Queue队列方法执行随时可能会被终止给予对象最后一次重生的机会要两次标记。public class Finalization { public static Finalization finalization; @Override protected void finalize(){原创 2021-05-19 17:42:22 · 191 阅读 · 0 评论 -
Java垃圾回收之老年垃圾收集器
老年代常见的垃圾收集器Serial Old收集器(-XX:+UseSerialOldGC,标记-整理算法)单线程收集,进行垃圾收集时,必须暂停所有工作线程简单高效,Client模式下默认的老年代收集器Parallel Old收集器(-XX: +UseParallelOldGC,标记-整理算法)多线程,吞吐量优先CMS收集器(-XX:+UseConcMarkSweepGC,标记-清除算法)初始标记:stop-the-world并发标记:并发追溯标记,程序不会停顿并发预清理:查找原创 2021-05-19 02:49:57 · 213 阅读 · 0 评论 -
Java垃圾回收之新生代垃圾收集器
分代收集算法(Generational Collector)Stop-the-WorldJVM由于要执行GC而停止了应用程序的执行任何一种GC算法中都会发生多数GC优化通过减少Stop-the-world发生的时间来提高程序性能Safepoint分析过程中对象引用关系不会发生变化的点产生Safepoint的地方:方法调用;循环跳转;异常跳转等安全点数量得适中常见的垃圾收集器JVM的运行模式ServerClient垃圾收集器之间的联系...原创 2021-05-19 00:51:35 · 175 阅读 · 0 评论