自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Mysql事务详解

事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。幻读:一个事务因读取到另一个事务已提交的insert数据。第一级别:读未提交(READ UNCOMMITTED):事物A和事物B,事物A未提交的数据,事物B可以读取到。读未提交存在脏读现象:一个事务读取到另一个事务未提交的数据。事务的回滚:ROLLBACK (一旦事务提交失败,我们需要将数据回滚到之前的状态,需要用到rollback语句)存在不可重复读:一个事务因读取到另一个事务已提交的update。.

2022-08-05 21:34:27 221 1

原创 SpringMVC的工作流程

SpringMVC提供了总开关DispatcherServlet来调用其他组件,处理用户的请求;请求处理映射器(Handler Mapping)和处理适配器(Handler Adapter),视图解析器(View Resolver)进行视图管理;动作处理器Controller接口

2022-07-27 14:34:43 3118

原创 mybatis缓存机制、XML映射器

MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。1.MyBatis中的resultType和resultMap均支持结果映射,对于一些简单的映射操作,我们可以直接使用resultType来完成。二级缓存是基于映射文件的缓存(namespace),缓存范围比一级缓存更大,不同的SQLSession可以访问二级缓存的内容。SqlSession的HashMap存储缓存数据时,是使用[namespacesql参数]作为key,查询返回的语句作为value保存的。...

2022-07-21 21:04:58 192

原创 Spring IOC 概述

使用Spring框架开发可以把Bean对象,Dao组件对象,Service组件对象等交给Spring容器来管理,有效降低代码的耦合度,极大方便项目的后期维护,升级和扩展。class对象的模板类(所有交给IOC容器来管理的类必须要有无参构造函数,因为Spring底层是通过反射机制来创建对象,调用的是无参构造)使用Spring之前,如果想要使用一个对象的话,通过new的方式去获取,使用Spring以后,我们可以直接从Spring容器中去获取对象。-session,会话,表示在一个用户会话内有效。...

2022-07-19 20:31:00 233

原创 Java反射机制

Java反射机制的核心就是在程序运行时动态加载类并获取类的详细信息,从而实现操作类或者对象的属性和方法。本质上就是JVM得到Class对象,再通过Class对象进行反编译,从而获取对象的各种信息。反射java的反射Reflection就是一种自省机制,可以实现在运行时动态的获取类的信息以及动态的调用对象的方法。通过反射允许程序在运行时通过反射API获取任何一个已知名称的class的内部信息,包括修饰词【public static】、父类、实现的接口、属性和方法。反射机制可以在运行时改变任意属性的内容,

2022-06-16 20:26:14 179

原创 TCP编程、Socket、UDP编程

TCP编程TCP是一种面向虚电路连接的端对端的保证可靠传输的协议,使用TCP协议可以得到一个顺序的无差错的数据流。UDP是一种不保证数据的可靠性,但是协议简单、传输速度块。一般用于视频或者音频的传输,不需要很高的可靠性,可以容忍偶尔的丢帧。在具体编程中发送方和接收方必须成对的使用socket建立连接,在tcp协议的基础上进行通信Socket客户端通过构建Socket对象实现连接请求Socket(InetAddress,int) InetAddress就是需要连接的服务器,int就是服务器的监听端

2022-06-14 18:22:35 359

原创 URL编程、http协议

URL编程java.net.URL对象用于代表一个网络环境的资源,资源可以是简单的文件或者目录,也可以是复杂对象的引用,例如数据库或者搜索引擎的查询。URL使用协议名、主机名、端口号和资源组成,基本格式为protocol://host:port/resource,例如http://www.yan.com:80/index.php,由于不同的协议有对应的标准端口号,如果使用标准端口,这个端口号可以省略,http协议的标准端口号为80。URL统一资源定位器,实际上就是一个资源的指针。URI统一资源标识符,实

2022-06-09 09:51:09 266

原创 Java网络编程、TCP/IP、拥塞控制

计算机网络就是通过传输介质、通信设施和网络协议,把分散在不同地点的计算设备互连起来,实现资源共享和数据传输的系统。TCP/IP协议簇TCP/IP协议栈是一系列网络协议的总和,是构成网络通信的核心骨架。分层模型TCP/IP协议栈的分层模型常见的有2个,分别是TCP/IP参考模型和ISO组织提出的OSI参考模型。在TCP/IP参考模型中将网络分为网络访问层【数据链路层】、互联网层【网络层】、传输层、应用层共4层,OSI参考模型分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用层共7个层。TC

2022-05-30 18:09:44 216

原创 Java并发编程、锁分类

三种性质可见性:一个线程对共享变量的修改,另外一个线程能立刻看到。缓存可导致可见性问题有序性:由于编译器优化可能会导致指令顺序发生变化原子性:一个或者多个CPU执行操作不能被中断,线程的切换会导致原子性问题三个问题安全性的问题:线程安全活跃性的问题:死锁问题、活锁、饥饿性能问题:使用无锁结构:TLS线程局部存储、Copy-On-Write、乐观锁、Java的原子类、Disruptor无锁队列减少锁的持有时间:锁粒度的细化,ConcurrentHashMap;可以使用读写锁volati.

2022-05-28 15:05:41 81

原创 Stream相关操作和方法

流的转换操作Stream的操作符基本可以分为中间操作符和终止操作符两大类,中间操作符会继续向下传递,终止操作符直接对数据进行消费或者收集,不会继续向下传递。—中间操作符map转换操作符,可以将一个A转换为一个BflatMap可以将一个A转换为多个Blimit限流操作distinct去重操作,底层采用equals进行比对filter过滤操作,去除不满足条件的数据peek跳出操作skip跳过操作sorted排序操作,Comparable和Comparator接口—终止操作collect收

2022-05-15 11:31:44 275

原创 学习Stream流

1.概述Stream不是集合元素,不是数据结构并不保存数据,Stream是有关算法和计算的,像是一个高级版本的迭代器Iterator。Stream只要给出对其包含的元素执行什么操作,Stream就会隐式地在内部进行遍历,并给出响应的数据转换。单向不可往复、数据只能遍历一次,遍历过后就使用完毕。Stream可以并行化操作,Stream的并行操作是依赖Java7中引入的Fork/Join框架拆分任务和加速处理过程,并且允许数据源是无限的。2.基本的执行流程使用Stream通常包括3个基本步骤:获取一个数

2022-05-10 20:52:10 672

原创 Stack栈、队列Queue笔记

Stack栈数据的插入和删除只能在一个位置(末端)上进行,末端叫作栈顶,特征后进先出LIFO,实际上针对栈只有两种基本操作push进栈和pop出栈,基本实现有数组(顺序栈)和链表(链式栈)。顺序栈的实现:public class ArrayStack { //可以使用泛型或者Object类型 private String[] items;//数组用于储存数据 private volatile int count;//用于记录栈中元素的个数 public ArrayStack(int

2022-04-19 21:44:21 171

原创 Hashtable和TreeMap

Hashtable类定义:public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, java.io.Serializable存储数据:使用Entry数组,hashmap采用的是Node数组。private transient Entry<?,?>[] table;hashtable也是一个散列表,存储内容是key-value映射,通过

2022-04-15 19:49:56 1080

原创 哈希表、哈希冲突

哈希表1.哈希表是一种以键值key存储数据value的结构,以key作为标识值存储value值;只要输入待查找的key,即可获取其对应的value值。当按照键值查询元素时,使用相同的hash函数将key转换为数组下标,从数组中按照下标对应的位置获取数据。它实际上是数组的一种扩展,数组+链表+红黑树。2.哈希表的设计哈希函数的设计首先不能过于复杂,复杂的哈希函数会间接的影响hash表的性能;其次要求哈希值应该尽可能随机且均匀分布,避免或者减少哈希冲突的数量,使每个桶中存储的数据比较平均。常规的设计方法

2022-04-10 16:41:43 492

原创 学习HashMap笔记

类定义public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable如果不指定泛型,则默认key-value的类型都是Object。具体的内部数据存储方式:transient Node<K,V>[] table;//哈希表的本质就是一个数组,数组中的每个元素称为一个桶,桶里存放的是一个key-value组成的链表或者红黑树

2022-04-09 17:07:34 996

原创 学习Map接口

1.定义public interface Map<K,V> { }定义map对象时建议指定key和value对应的类型,key和value要求必须时复杂类型,不能采用int之类的简单类型。map接口中有一个内部接口Entry,每个Entry对象用于封装一对key/value,value允许修改,但是key不允许修改。interface Entry<K,V> { K getKey(); V getValue(); V setValue(V value); }2

2022-03-27 16:40:36 466

原创 TreeSet的使用

TreeSet概述:TreeSet是一种排序的Set集合;数据存储采用的是NaviatableMap,底层实际上是TreeMap实现的,本质上是一个红黑树原理。Random r=new Random(); List<Integer> list=new ArrayList<>(); Set<Integer> set=new TreeSet<>(); while(set.size()<10){ int k=r.nextInt(

2022-03-26 17:40:09 1393

原创 HashSet类、LinkedHashSet

1.概述HashSet的底层实际上就是HashMap,只不过 HashSet是实现了Set接口,并且把数据作为key值,而具体的value值一直使用一个相同的虚值来实现的。由于HashMap的key值不允许重复,并且在HashMap中如果出现key值相同时,会使用新的value覆盖就有value,然后返回就有的value值,那么在hashset中执行这句话就会返回一个false,表示插入失败,这样就能保证了数据的不可重复性。private transient HashMap<E,Object&gt

2022-03-22 17:11:42 390

原创 内置4大函数式接口

Consumer消费性接口 void accept(T t)Supplier供给性接口 T get()Function函数式接口 R apply(T t)Predicate断言式接口 boolean test(T t)Consumer方法定义:public void bb(double num, Consumer<Double> consumer){ consumer.accept(num); }具体调用:Test1 test=new Test1(); test.b.

2022-03-19 15:37:28 112

原创 lambda表达式

允许将函数作为一个方法的参数(将一个方法传递到另外的方法中执行)。语法格式:(参数列表)->表达式,例如(k1,k2)-> k1+k2(参数列表)->{代码块;},例如(k1,k2)->{return k1+k2;}可选的类型声明,不需要声明参数类型,编译器可以统一识别参数类型。可选的参数圆括号,一个参数无需使用(),但是如果多个参数则需要使用()。可选的大括号,如果主体中包含一个语句,则不需要使用{}。可选的return关键字,如果主体中只有一个表达式返回值则编译器自

2022-03-17 17:18:18 352

原创 排序二叉树的编码实现

类定义public class BinarySearchTree { private Node tree;//树的根节点 public static class Node{ private int data;//具体存储的数据 private Node left; private Node right; public Node(int data) { this.data=data; } }}插入数据 :首先从根节点开始向下查找自己需要插入数据的具体位置。publi

2022-03-16 18:26:12 1222

原创 二叉树的遍历

二叉树的遍历方式有前序遍历、中序遍历和后序遍历三种方式。前序遍历:根–左--右public void preOrder(Node root){ if(root==null) return; System.out.println(root.data); preOrder(root.left); preOrder(root.right); }中序遍历:左–根--右public void middleOrder(Node root){ if(root==null) return;

2022-03-15 15:21:47 37

原创 树结构、二叉树概念

树实际上是一种抽象数据类型 ADT 或者实现这种抽象数据类型的数据结构,可以用于模拟具有树状结构性质的数据集合,是由 n 个有限节点构成的一个具有层次关系的集合。树结构特点:1、每个节点都只有有限个子节点或者无子节点 2、没有父节点的节点称为根节点3、每个非根节点尤其仅有一个父节点4、除了根节点外,每个子节点可以分为多个互不相关的子树5、树中没有环路 cycle二叉树就是每个节点最多有 2 个分叉子节点,具体的存储方式有基于指针的链式存储和基于数组的顺序存储,最常见的是基于指针的方式,基于数组的

2022-03-14 12:03:29 622

原创 泛型的笔记

泛型泛型在本质上是指类型参数化,用于声明数据的类型,也是可以改变的,由实际参数来决定的。声明阶段不确定, 仅仅作为占位符使用,在具体调用时类型才能确定,而占位符的所有位置将被指定的类型所替代。泛型类泛型类就是具有多个类型参数的类public class MyClass<T,ID>{private ID id;public T pp(T t){}}泛型方法泛型方法就是带有类型参数的方法泛型类中方法public class MyClass<T,ID>{publi

2022-03-12 20:22:12 168

原创 ArrayList 实现类

1.ArrayList 是实现了 List 接口的可扩容的数组【System.arrayCopy】,它的内部是基于数组实现的,相较于 Java 中的数组,容量能动态增长。2.继承于 AbstractList 抽象类,实现了 List 接口。RandomAccess 接口,提供了随机访问支持。遍历元素的方法有快速随机访问和通过迭代器 Iterator 访问。Clonable 接口,可以被克隆 clone()Serializable 接口,支持序列化。ArrayList 不是线程安全的,所以在无需考

2022-03-12 10:56:49 399

原创 ArrayList、Vector 和 LinkedList

1.ArrayList实现:底层实现为数组,按照索引编号访问速度快 O(1),但是删除或者添加元素可能会导致元素的移动,速度慢 O(n)。不同步,线程不安全,但是并发性高,访问效率高。经常需要快速访问,较少在中间增加 删除元素时使用。2.Vector实现:双向链表,按照索引编号访问元素速度 慢 O(n),但是删除或者添加元素,速度快 O(1)不同步,线程不安全,但是并发性高, 访问效率高。经常增删数据,较少需要随机访问。3.LinkedList实现:数组,按照索引编号访问速度快 O(1),

2022-03-02 21:24:51 233

原创 学习Collection、List、Set 接口

Collection接口有两个重要的子接口,分别是java.util.List和java.util.Setpublic interface Collection< E> extends Iterable< E>特征: 集合中的数据无序,允许重复size():int 获取集合中的元素个数isEmpty():boolean 判断集合中的元素个数是否为 0contains(Object obj):boolean 判断当前集合中是否包含对象 objtoArray():Objec

2022-02-25 17:57:43 432

原创 单向链表的操作

具体实现:在链表中使用节点存储数据,并使用引用串联各个元素。每个节点除了存储数据本身之外,还需要额外存储下一个节点的地址。添加、删除、查找操作的编码如下:public class LinkedList { private Node head = null; // 整个链表的头指针 public void insert(Node a, Node b) { // 在节点a后面插入新节点b if (a == null) { //在链表的头部插入添加数据b b.next=head; he

2022-02-24 16:26:39 257

原创 Lock接口

我最近新学习了Lock接口,它主要用于多线程下共享资源的控制,可以通过显式定义同步锁对象来实现同步处理,可以提供比 synchronized 更广泛灵活的锁定操作,并支持多个相关的 Condition 对象。常用方法如下:void lock():用于尝试获取锁,如果获取到锁则返回,否则阻塞当前线程等待。void lockInterruptibly():尝试获取锁,线程可以在成功获取锁之前被中断,则放弃获取锁操作,而抛出异常。boolean tryLock():尝试获取锁,获取成功则返回 true,否

2022-02-23 22:17:04 136

原创 使用 Runnable 接口实现累加操作

必须通过 join 使得子线程执行结束后再执行主线程中的累加操作,如果子线程没有执行结束,主线程会阻塞等待。学习代码如下:public class JoinTest { public static void main(String[] args)throws Exception { MyRunnable[] mr = new MyRunnable[10]; Thread[] tarr = new Thread[10]; for (int i = 0; i < 10; i++) {

2022-02-18 11:13:02 332

原创 任务提交方法submit和execute

线程池提供了2种任务提交方法submit和execute,一般通过submit提交任务是用于可以有返回值的时候,通过execute提交的任务不能获取任务的执行结果。execute的方法:public class Test1 { public static void main(String[] args) { ExecutorService es=Executors.newFixedThreadPool(3); es.execute(()->{ for(int i=0;i&lt

2022-02-17 15:59:06 577

原创 volatile的使用

volatile 关键字实际上是 Java 提供的一种轻量级的同步手段,因为 volatile 只能保证多线程内存可见性,不能保证操作的原子性。任何被 volatile 修改的变量,都不会进行副本的拷贝,任何操作都即使写在主内存中。因此使用 volatile 修改的变量的修改,所有线程都立刻可以看到。注意:volatile 保证可见性,但是不保证原子性。...

2022-02-14 17:07:33 129

原创 synchronized 底层语义原理

如果同步方法则访问标志值 ACC_SYNCHRONIZED,表示该方法是同步方法,访问时需要获取管程对象,实际上的底层默认实现还是字节码指令。如果是同步代码块,则会在入口位置和退出位置插入 monitorenter 和 monitorexit 两个字节码指令,注意在同步代码块中为了保证一定会执行退出操作,所以默认添加了 try/catch 异常处理,所以很多时候反编译会发现 monitorexit 有 2 次。synchronized 是可重入的、非公平的锁。...

2022-02-13 17:18:02 131

原创 多线程的调度机制

假设只有一个 CPU,在任意时刻只能执行一条机器指令,每个线程只有获取 CPU 的使用权才能执行指令。多线程并发运行在宏观上看是同时运行,实际上是各个线程轮流获取 CPU 使用权才能执行指令。所谓线 程的调度就是按照特定的机制为多个线程分配 CPU 的使用权。主要有 2 种调度模型:分时调度模型和抢 占式调度模型。Unix 系统采用的是时间片算法,windows 属于抢占式。1、分时调度就是让所有线程轮流获取 CPU 的使用权,并且平均分配每个线程占用的 CPU 的时间片。Java 中的线程调度不是分时

2022-02-11 18:07:51 1032

原创 剪切和拷贝文件操作

将input中的文件剪切到output里,代码如下:import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class Jianqie { public static void main(String[] args) { Jianqie test1 = new Jianqie(); try { File

2022-02-10 11:21:50 254

原创 线程的四种创建方式

Thread类覆盖定义run方法,启动线程必须是start方法受到Java中单根继承体系的影响,一般不用Runnable接口函数式接口new Thread(new Runnable(){}).start();run方法不能返回值,不能抛出异常Callable和Future接口Callable接口call方法可以有返回值,可以抛出异常Future接口的实现FutureTask实现类也实现了Runnable接口new Thread(new FutureTask(new Callable(){

2022-02-09 21:20:58 28

原创 线程的5种状态

最近我学习了线程从创建并启动到消亡共经历了5种状态:新建、就绪、运行、阻塞和死亡:1、new新建态(初始态): new Thread(…)2、就绪态(可运行态): 线程初始化后,调用start方法,只能针对新建态线程对象调用start方法,否则出现异常illegalThreadStateException3、执行态(运行态):就绪态获取了CPU,执行线程run方法。注意有多CPU则会有多个线程并行执行。目前采用的是基于时间片轮转法的抢占式调度策略,在选择可以运行线程时会考虑线程的优先级。4、运行态

2022-02-08 16:39:44 550

原创 创建线程池

newFixedThreadPool用于创建一个固定大小的定长线程池,可以控制线程的最大并发数,超出的线程会在队列中等待因为采用的是无界队列,而且实际线程数永远不会变化,适用于可以预测线程数量的业务中,或者服务器负载较重的场景下,对当前的线程数量进行限制由于是无界队列可以会导致大量的任务积压newCachedThreadPool用于创建一个可缓存的线程池,如果线程池长度超过处理需求,可以灵活的回收空闲线程资源,如果没有可回收重用线程时会自动新建线程可以用来创建一个可以无限扩大的线程池(最大.

2022-02-07 22:43:47 502

原创 多线程笔记

线程是进程中的一个执行实体,用来描述进程的执行,负责指向包括在进程内部地址空间中的代码。多线程是指同时存在几个执行体,按几个不同的执行线索共同工作的情况。要用多线程的主要原因是运行过程中需要处理大量的IO操作或者需要有较多的等待时间,比如读写文件、视频图像的采集等。在Java中一个应用可以包含多个线程,每个线程执行特定任务,可以与其它线程并发执行。引入多线程的目标在于减少CPU空转时间,提供CPU的利用率,java多线程提供了一个编程模型隐藏CPU在多任务间切换的实现细节,不需要修改代码就可以实现

2022-01-26 14:45:12 123

原创 进程 vs 线程

一个线程只能属于一个进程,而一个进程可以包含多个线程,至少有一个线程(主线程)资源调度和分配给进程,同一进程中的所有线程共享该进程的所有资源线程在执行过程中,共享数据一般都需要进行协作同步CPU分给线程,真正在处理机上运行的是线程线程是指在进程内部的一个执行单元,也是进程内的可调度的实体,两者都是动态的概念进程和线程最大的区别在于:进程是由操作系统来控制的,而线程是由进程来控制线程本身的数据通常只有寄存器数据以及当前程序在运行时使用的堆栈,所以线程的切换比进程切换的成本要小的多。多个进程.

2022-01-25 14:58:05 308

空空如也

空空如也

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

TA关注的人

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