自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 #{}和${}的区别是什么?

#{}是预编译处理、是占位符, ${}是字符串替换、是拼接符。 Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 来赋值; Mybatis 在处理${}时, 就是把${}替换成变量的值,调用 Statement 来赋值; #{} 的变量替换是在DBMS 中、变量替换后,#{} 对应的变量自动加上单引号 ${} 的变量替换是在 DBMS 外、变量替换后,${} 对应的变量不会加上单引号 使用#{}可以有效的防止 SQL 注入,...

2021-09-22 11:04:22 262

原创 线程的生命周期?线程有几种状态

线程通常有五种状态:创建、就绪、运行、阻塞、死亡状态 阻塞的情况又分为三种: 等待阻塞:运行的线程执行wait方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify或notifyAll方法才能被唤醒,wait是Object类中的方法。 同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。 其他阻塞:运行的线程执行slee...

2021-09-08 17:16:32 634

原创 GC如何判断对象可以被回收

引用计数法:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收 可达性分析法:从GC Roots开始向下搜索 ,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明对象时不可用的,那么虚拟机就判断是可回收对象。 引用计数法,可能会出现A引用了B,B又引用了A,这时候就算他们都不再使用了,但因为相互引用计数器=1永远无法被回收。GC Roots的对象有: 虚拟机栈(栈帧中的本地变量表) 方...

2021-09-08 14:44:46 225

原创 Java中的异常体系

java中的所有异常都继承自顶部父类ThrowableThrowable下有两个子类Exception和ErrorError是程序无法处理的错误,一旦出现这个错误,则程序将被迫停止运行。Exception不会导致程序停止,又分为两个部分RunTimeException(运行时异常)和CheckedException(检查异常)RunTimeException异常发生在程序运行过程中,会导致程序当前线程执行失败。CheckedException异常发生在程序编译过程中,会导致程序编译不通过..

2021-09-07 20:30:20 117

原创 双亲委派模型

向上委派:实际上就是查找缓存向下查找:查找加载路径向上委派到顶层加载器为止,向下查找到发起加载的加载器为止双亲委派模型的好处: 主要是为了安全性,避免程序员自己编写的类动态地替换java的一些核心类,比如String 同时也避免了类的重复加载,因为JVM中区分不同类,不仅仅是根据全限定名(类名),相同的class文件被不同的ClassLoader加载就是不同的两个类 ...

2021-09-07 19:54:43 102

原创 Java类加载器

JDK自带有三个类加载器: bootstrapClassLoader、ExtClassLoader、AppClassLoaderBootStrapClassLoader是ExtClassLoader的父类加载器,默认负责加载%JAVA_HOME%lib下的jar包和class文件。(主要负责加载JDK提供的工具库,如rt.jar)注意:所谓父类加载器并不是通过extends关键字直接继承,而是通过类中的一个名为parent的变量进行维护的ExtClassLoader是AppClassLoad..

2021-09-07 19:28:23 92

原创 什么是字节码?采用字节码的好处是什么?

java中的编译器和解释器:java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个共同的接口。编译程序只需要面向虚拟机,生成虚拟机能理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在java中,这种供虚拟机理解的代码叫做字节码(即扩展名为.class文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的,java源程序经过编译器编译后变成字节码,字节码由虚拟..

2021-09-07 15:25:29 1153

原创 简单描述如何实现一个IOC容器

新建配置文件配置包扫描路径 递归包扫描获取.class文件 反射、确定需要交给IOC管理的类 对需要注入的类进行依赖注入 配置文件中指定需要扫描的包路径 定义一些注解,分别表示访问控制层、业务服务层、数据持久层、依赖注入层、获取配置文件注解 以配置文件中获取需要扫描的包路径,获取到当前路径下的文件信息及文件夹信息,将当前路径下所有以.class结尾的文件添加到一个Set集合中进行存储 遍历这个Set集合,获取到类上有指定注解的类...

2021-09-06 16:48:40 166

原创 ConcurrentHashMap原理,jdk7和jdk8版本的区别

jdk7:数据结构:ReentrantLock+Segment+HashEntry,一个Segment中包含一个HashEntry数组,每个HashEntry又是一个链表结构元素查询:二次hash,第一次Hash定位到Segment,第二次Hash定位到元素所在的链表的头部锁:Segment分段锁,Segment继承了ReentrantLock,锁定操作的Segment,其他的Segment不受影响,并发度为Segment个数,可以通过构造方法指定,数组扩容不会影响其他的Segment...

2021-09-06 15:02:33 112

原创 HashMap和HashTable有什么区别?其底层实现是什么?

区别:(1)HashMap方法没有synchronized修饰,线程不安全;HashTable线程安全(2)HashMap允许key和value为null,HashTable不允许底层实现:数组+链表实现jdk8开始链表高度到8、数组长度超过64,链表转变为红黑树,元素以内部类Node节点存在 计算key的hash值,二次hash然后对数组长度取模,对应到数组下标 如果没有产生hash冲突(下标位置没有元素),则直接创建Node存入数组。 如果产生hash冲..

2021-09-06 14:28:55 346

原创 ArrayList 和 LinkedList

ArrayList :基于动态数组,连续内存存储,适合下标访问(随机访问),扩容机制:因为数组长度固定,超出长度存数据是需要新建数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动;使用尾插法并制定出事容量可以极大提升性能、甚至超过LinkedList(因为LinkedList插入元素是需要创建node对象)LinkedList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询;需要注意遍历,且遍历时必须使用Iterator,不能使用for循环,因..

2021-09-04 15:27:02 73

原创 抽象类与接口的区别

接口类可以存在普通成员方法,而接口中只能存在public abstract 方法。 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是public static final类型的。 抽象类只能继承一个,接口可以实现多个。 接口的设计目的,是对类的行为进行约束,也就是提供一种机制,可以强制要求不同的类具有相同的行为。它只约束了行为的有无,单不对如何实现行为进行约束。而抽象类的设计目的,是代码复用。抽象类是对类本质的抽象,表达的是is a的关系,比如:BMW i...

2021-09-04 11:12:20 91

原创 String、StringBuffer、StringBuilder

String是final修饰的,不可变,每次操作都会产生新的String对象StringBuffer和StringBuilder都是在原对象操作StringBuffer是线程安全的,StringBuilder是线程不安全的StringBuffer方法都是synchronized修饰的性能:StringBuilder> StringBuffer > String使用场景:经常需要改变字符串内容时使用后面两个优先使用StringBuilder,多线程使用共享变量时使用..

2021-09-03 17:29:49 76

原创 final关键字

最终的 修饰类:表示类不可以被继承 修饰方法:标识方法不能被子类重写,但是可以重载,不可以修饰构造方法 修饰变量:表示变量一旦被赋值就不可以更改它的值 (1)修饰成员变量 如果final修饰的是类变量,只能在静态代码块中指定初始值或者声明该类变量时指定初始值 如果final修饰的是成员变量,可以在非静态代码块、声明该变量或者构造器中执行初始值 (2)修饰局部变量 系统不会为局部变量进行初始化,局部变量必须由程序员显示初始化。因此使用fi..

2021-09-03 17:29:13 92

原创 ==和equals比较

==对比的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址equals: Object中默认也是采用==比较,通常会重写Objectpublic boolean equals(Object obj){ return (this==obj);}Stringpublic boolean equals(Object anObject) { if (this == anObject) { return true; ...

2021-09-02 10:19:34 86

原创 JDK、JRE与JVM

JDK JRE JVMjdk:Java Development Kit (java 开发工具)jre:Java Runtime Environment (java运行时环境)jvm:java Virtual Machine (java虚拟机)

2021-09-02 09:23:28 3361

原创 面向对象的理解

面向对象对比:面向过程更注重事情的每一个步骤及顺序;面向对象更注重事情有哪些参与者(对象),及各自需要做什么比如:洗衣机洗衣服面向过程会将任务拆解为一系列的步骤(函数):1、打开洗衣机---->2、放衣服---->3、放洗衣粉---->4、清洗---->5、烘干面向对象会拆解出人和洗衣机两个对象:人:打开洗衣机、放衣服、放洗衣粉洗衣机:清洗、烘干面向过程比较直接高效,而面向对象更易于服用、扩展和维护...

2021-09-01 14:31:58 106

原创 hashCode与equals

hashCode 介绍hashCode()的作用是获取哈希吗,也称为散列码;它实际上是返回一个int证书。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在JDK的Object.java中,Java中的任何类都包含hashCode()方法。散列表存储的是键值对(key-value),它的特点是:能根据key快速检索出对应的value。其中利用到了散列码!(可以快速找到所需要的对象)为什么要有hashCode以“HashSet如何检查重复”为例来说明为什么要有hashCo

2021-09-01 09:57:10 94

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除