![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 79
怎么取名啊
这个人很勤奋 什么都留下了
展开
-
ThreadLocal的实现原理
ThreadLocal是什么ThreadLocal,即线程本地变量。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地拷贝,多个线程操作这个变量的时候,实际是操作自己本地内存里面的变量,从而起到线程隔离的作用,避免了线程安全问题。ThreadLocal内存结构图由内存结构图可以看出:每一个Thread对象中都持有一个ThreadLocalMap的成员变量。ThreadLocalMap内部维护了一个Entry数组,每个Entry代表一个完整的对象,ke原创 2021-10-07 15:08:43 · 157 阅读 · 0 评论 -
Spring集成Mybatis
创建步骤1.新建maven项目2.加入maven的依赖1)spring的依赖2)mybatis的依赖3)MySQL的驱动4)spring的事务的依赖5)mybatis和spring集成的依赖:mybatis官方提供的,用来在spring项目中创建mybatis的SqlSessionFactory dao对象的3.创建实体类4.创建dao接口和mapper文件5.创建mybatis配置文件6.创建service接口和实现类,实现类的属性是dao7.创建spring的配置文件:声明myb原创 2021-09-17 09:56:31 · 128 阅读 · 0 评论 -
初识AOP
什么是AOP?在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP的术语连接点:类里的哪些方法可以被增强,这些方法被称为连接点。切入点:实际被增原创 2021-09-15 23:38:29 · 189 阅读 · 0 评论 -
Spring注解
在配置文件中添加组件扫描器在Spring配置文件beans.xml中加入组件扫描器,代码如下:<context:component-scan base-package="cqucc.pojo" />base-package属性对应值为需要扫描的包名。类上添加注解在类上添加注解,可以让组件扫描器发现添加注解的类,Spring容器即可创建对应类的对象。类上添加的注解如下:@Componet:基本注解,标识了一个受Spring管理的组件。@Respository:标识持久层的组件。原创 2021-09-14 18:10:34 · 114 阅读 · 0 评论 -
初识Spring
什么是SpringSpring是Java EE编程领域的一个轻量级开源框架,该框架由一个叫Rod Johnson的程序员在 2002 年最早提出并随后创建,是为了解决企业级编程开发中的复杂性,实现敏捷开发的应用型框架。Spring是一个开源容器框架,它集成各类型的工具,通过核心的Bean factory实现了底层的类的实例化和生命周期的管理。在整个框架中,各类型的功能被抽象成一个个的 Bean,这样就可以实现各种功能的管理,包括动态加载和切面编程。Spring的特点是什么(1)方便解耦,简化开发通过原创 2021-09-13 19:35:42 · 211 阅读 · 1 评论 -
JSP+Servlet实现上传文件
准备工作1.使用Maven下载commons-fileupload组件和commons-io依赖(也可直接导入jar包)。commons-fileupload:<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload --><dependency> <groupId>commons-fileupload</groupId> <arti原创 2021-09-03 14:39:34 · 327 阅读 · 0 评论 -
Hash冲突
什么是Hash冲突在Hash表中,Hash函数进行计算时,对应不同的关键字可能获得相同的Hash地址,即 key1≠key2,但是f(key1)=f(key2)。这种现象就是冲突,而且这种冲突只能尽可能的减少,不能完全避免。为了解决这种冲突,我们常用四种方法来解决:开放地址法再哈希法链地址法建立公共溢出区法开放地址法所谓的开放定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只要散列表足够大,空的散列地址总能找到,并将记录存入。开放地址法公式为:fi(key) = (f(key)+原创 2021-08-16 20:42:05 · 79 阅读 · 0 评论 -
Java线程池原理
线程池适用场景Java中经常需要用到多线程来处理一些业务,我们非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。线程池涉及到的几个核心类及接口包括:Executor、Executors、ExecutorService、ThreadPoolExecutor、FutureTask、Callable、Runnable等。使用线程池的优原创 2021-08-09 21:56:31 · 95 阅读 · 0 评论 -
Java的强引用、软引用、弱引用和虚引用
强引用Java中的最普遍的一个引用,我们使用的大部分引用实际上都是强引用。一个对象如果具有强引用,只要这种引用还存在,就不会被垃圾回收器所回收。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误使程序异常终止,也不会随意回收具有强引用的对象来解决内存不足问题。如:String s = "abc";List<String> list = new ArrayList<>();list.add(s);Object obj = new Object();原创 2021-08-07 14:47:31 · 60 阅读 · 0 评论 -
Java浅拷贝和深拷贝
对象拷贝Java中的对象拷贝(Object Copy)指的是将一个对象的所有属性(成员变量)拷贝到另一个有着相同类类型的对象中去。假设有一个类S,它有两个对象A和B,分别具有属性a和b,则对对象A进行拷贝操作赋值给对象B就是:B.a = A.a;B.b = A.b;浅拷贝对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值复制一份给新的对象。因为是两份不同的数据,所以对其中一个对象的该成员变量值进行修改,不会影响另一个对象拷贝得到的数据。对于数据类型是引用数据类型原创 2021-08-04 21:49:34 · 94 阅读 · 0 评论 -
Java引用传递和值传递
值传递在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,因为实参和形参再内存上是两个独立的变量,所以方法执行中形式参数值的改变不影响实际参数的值。简单来说值传递中传递的参数是值的拷贝传递。基本数据类型是值传递引用传递在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。实际参数是对象(或数组),这时形参和实参在内存上指向的是同一地址,对形参的改变会影响实参。对形式参数的操作实际上就是对实际参数的操作,这个结果原创 2021-08-03 20:35:51 · 71 阅读 · 0 评论 -
算法:全排列
全排列编写一个函数求解某字符串中所有字符的排列(不包括重复)。例如字符串“ABC”,它的全排列有:ABC ACB BAC BCA CAB CBA思路全排列实际上只需要以下步骤:选择“老大”,即将字符串中的其中一个字符移至字符串最前面,当作此字符串的“老大”。在除了“老大”字符之外的字串中再选择一个“老大”。重复上述步骤,直到字串只有一个字符时,返回上一层,将“老大”更换成没有当过“老大”的字符。如子串中的字符都当过“老大”,则继续返回上一层。过程现在用图片进行举例,使用例子为字原创 2021-07-23 21:09:13 · 98 阅读 · 0 评论 -
算法:棋盘覆盖问题
棋盘覆盖问题在一个2的k次方乘2的k次方(k > 0)个方格组成的棋盘中,有一个特殊方格和其他的不同。棋盘覆盖问题要求使用4种不同形状的L型骨牌覆盖给定棋盘上除了特殊方格以外的所有方格,且任何L型骨牌不能重叠覆盖。如下图,灰色为特殊方格,其他颜色的L型骨牌加上特殊方格正好可以铺满整个棋盘。思路假设我们要考虑4x4大小的棋盘,且因为此题所给棋盘为正方形、边长一定为偶数,所以可以使用分治法将4x4大小的棋盘划分为4个2x2大小的棋盘来进行处理。此时,每个2x2大小的小棋盘都可以使用一个L型骨原创 2021-07-19 22:13:53 · 4364 阅读 · 0 评论 -
Java代码实现动态数组ArrayList
ArrayList简介ArrayList是Java集合框架中的一个重要的类,它继承于AbstractList,实现了List接口,是一个长度可变的集合,提供了增删改查的功能。集合中允许null的存在。ArrayList类还是实现了RandomAccess接口,可以对元素进行快速访问。ArrayList有如下特点:底层结构是动态数组线程不同步更擅长做随机访问(遍历)添加和删除元素速度比LinkedList慢定义接口ListList是线性结构的接口,里面定义了该线性结构的一些通用操作并支持泛型原创 2021-07-16 21:17:29 · 371 阅读 · 0 评论 -
HashMap底层原理(JDK1.7)
HashMap简介HashMap是Java中最常用的集合类框架,是Java语言中非常典型的数据结构,也是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。键值对:Entry(Key , Value)HashMap在获取元素时,可以通过Key来获取Value。HashMap有如下特点:根据键的HashCode值存储数据只允许一条记录的键为null,允许多条记录的值为null(允许null值)线程不安全底层是HashTable(哈希表)遍历无序初始长度为16默认加载因子0.75原创 2021-07-11 21:48:47 · 127 阅读 · 0 评论 -
Java代码实现DOM解析XML
DOM概述DOM全称为Document ObjectModel,中文名为文档对象模型,是W3C组织推荐的处理可扩展置标语言的标准编程接口。它是一种与平台和语言无关的应用程序接口(API),它可以动态地访问程序和脚本,更新其内容、结构和www文档的风格。DOM是把整个XML文件看成是一个倒挂的树形结构来解析,其中使用的包是org.w3c.dom。XML文件现在有一个文件名为department.xml的XML文件,文件所在位置为Java文件所在的文件夹下,文件内容如下:<?xml ver原创 2021-07-10 21:22:32 · 154 阅读 · 0 评论 -
Java二叉排序树的代码实现
什么是二叉排序树二叉排序树,又称二叉查找树,是二叉树的一种。它要求:如根结点上有左结点,则左结点的值一定小于根结点如根结点上有右结点,则右结点的值一定大于根结点创建结点类Node创建结点类Node用于表示树内的每个结点。变量value用于存放数据Node类型的left表示左结点Node类型的right表示右结点创建构造方法用来初始化结点的数据域重写toString方法方便输出class Node { public int value; //数据域 public Nod原创 2021-07-08 22:06:41 · 120 阅读 · 0 评论 -
设计模式:工厂模式
工厂模式概述工厂模式(Factory Pattern)解决的是实例化对象的问题,在某些情况下,需要创建的对象的初始化操作十分复杂,放在构造函数中会影响代码的可读性;亦或是待一次性需要实例化的对象太多,直接实例化的代码会重复执行很多次,影响执行的效率,这时候如果定义一个形同工厂的类专门负责对象的实例化创建,便可以增加代码可读性和复用性。在任何需要生成复杂对象的地方,都可以使用工厂模式。较为简单的对象实例化没必要使用工厂模式,反而会增加系统的复杂度工厂模式分为三种:简单工厂模式工厂方法模式抽象原创 2021-06-12 16:39:20 · 61 阅读 · 0 评论 -
Java双端队列的代码实现
什么是顺序队列顺序队列是先进先出的数据结构,它是一种特殊的线性表,只能在队头front进行删除操作,只能在队尾rear进行插入操作,所以把进行插入操作的一端称为队尾,进行删除操作的一端称为队头。顺序队列的队头指针front指向队头元素,队尾指针rear指向下一个入队元素的存储位置由于入队和出队操作时头尾指针只会增加不会减小,当rear指向到分配的连续空间之外时,队列无法再插入新元素,被删除元素的空间永远无法被重新利用,这种情况叫队列的“假上溢”现象,即头尾指针前的空间没有使用,但是却显示队列已满。原创 2021-06-11 17:40:40 · 1443 阅读 · 1 评论 -
Java链表的代码实现
什么是链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn原创 2021-06-10 15:25:05 · 267 阅读 · 1 评论 -
Java栈的代码实现
什么是栈栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。(摘自百度百科)栈:先进后出,只在栈顶进行操作栈的基本操作push():将数据压入栈中pop():将栈顶元素弹出peek():不弹出获取栈顶元素isEmpty(原创 2021-06-09 23:02:26 · 353 阅读 · 0 评论 -
设计模式:单例模式的8种实现方式
定义单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。核心思想:构造方法私有化。原理单例模式的类中有且仅有一个实例被创建,其他的类要使用单例对象时都要通过这个类提供的特殊渠道来进行获取。如果不想有那么多的实例,可以使构造方法私有化。原创 2021-06-03 17:07:32 · 246 阅读 · 1 评论 -
关于Java异常处理中的try、catch、finally
各自用法try块:包含可能会有异常发生的代码catch块:当有异常发生的时候才会执行finally块:无论是否有异常发生都会执行基本格式try { //可能会有异常发生的代码 }catch(Exception e) { // 当有异常发生的时候,catch块被执行 }finally { //不管异常是否发生都要执行 }无异常原创 2021-06-02 23:49:31 · 251 阅读 · 0 评论 -
LeetCode.9:判断回文数
题目给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如“123321”是回文,而“1234”不是。思路建立循环,不停比较整数左右两边是否相等,如果不相等直接返回false,循环正常执行结束则返回true。得到需要判断的数字时,把整数转换为字符串更加方便处理,循环中i的值对应字符串的左边第i个数字,字符串s的长度-1-i表示字符串从右起第i个数字。使用charAt(i)来获取位于第i个位置的字原创 2021-05-25 08:44:01 · 135 阅读 · 3 评论 -
Java类中构造函数、静态代码块、代码块的执行顺序
不包含子类时新建一个包含代码块和静态代码块的Animal类,代码如下:public class Animal { private String name; private int legs; static{ System.out.println("静态代码块"); } { System.out.println("代码块"); } public Animal(String name,int legs) { this.name=name; this.legs=原创 2021-05-23 20:29:37 · 355 阅读 · 0 评论