自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 如何解决Maven资源过滤问题

如何解决Maven资源过滤问题1.定义就是让指定配置文件里面的引用maven属性的内容,能够获取到在pom文件中定义的maven属性的值。指定目录:也就就是指src/main/resources和src/test/resources文件下的所有文件,默认情况下,这些文件会被复制到classpath下面,即target/classes下面。2.例子介绍:在pom.xml文件做以下设置: <properties> <project.build.sourceEncoding&

2020-07-24 23:32:23 1010

原创 Java中IO模型之NIO(同步非阻塞模型)

NIO:同步非阻塞模型NIO中提供了选择器(Selector 类似底层操作系统提供的IO复用器:select、poll、epoll),也叫做多路复用器,作用是检查一个或者多个NIO Channel(通道)的状态是否是可读、可写。。。可以实现单线程管理多个channel,也可以管理多个网络请求**Channel:**通道,用于IO操作的连接,在Java.nio.channels包下定义的,对原有IO的一种补充,不能直接访问数据需要和缓冲区Buffer进行交互通道主要实现类:SocketChannel

2020-07-21 16:14:35 623

原创 Java中IO模型之BIO(同步阻塞模型)

Java中IO模型之BIO(同步阻塞模型)BIO:同步阻塞模型在JDK1.4之前,建立网络通信采用的BIO模型需要现在服务器启动一个ServerSocket,然后客户端启动一个Socket来对服务端进行连接,默认的情况下服务端需要对每一个请求建立一个线程等待处理,客户端发送请求后,需要等待服务端是否有相应的线程来处理客户端的连接,如果没有线程则会一致等待或者拒绝请求,如果有的话,客户端会等待线程来处理客户端请求在了解BIO模型之前先让我们回顾一下Socket通信流程基于BIO的编程通过网络通信

2020-07-21 16:08:07 754

原创 深入理解三次握手和四次挥手

深入理解三次握手和四次挥手三次握手的过程就像是东北人茬架,场景如下:一天在东北的酒馆里,两个大哥在不同桌吃着饭呢,一个大哥看见另一个大哥看对眼儿了,下面大哥A叫长海,大哥B叫二柱(如有雷同 不胜感激)三次握手长海:你愁啥二柱:瞅你咋滴长海:来!干一架!三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实

2020-07-17 21:51:26 232

原创 深入了解ConcurrentHashMap

深入了解ConcurrentHashMap属性及默认值//默认初始容量 16 static final int DEFAULT_INITIAL_CAPACITY = 16;//默认加载因子 0.75 static final float DEFAULT_LOAD_FACTOR = 0.75f;//默认的并发度 16 ->segments数组的大小 static final int DEFAULT_CONCURRENCY_LEVEL = 16;//容量的上限->seg

2020-07-17 21:12:43 325

原创 银行家算法

银行家算法在了解银行家算法之前,我们先回顾一下死锁产生的条件和处理方法死锁产生的四个必要条件1、互斥条件:一个资源每次只能被一个线程使用2、请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放3、不剥夺条件:进程已获得的资源,在未使用之前,不能强行剥夺4、循环等待条件:若干进程之间形成一种头尾相连接的循环等待资源关系死锁的解除与预防解决死锁的三种途径:预防、避免、检测与恢复。那么如何避免死锁,就是今天所要踢到的经典避免死锁方法——银行家算法。避免死锁(银行家算法)避免死锁的

2020-07-13 22:16:29 1523

原创 生产者消费者模型

生产者-消费者模型生产者-消费者(producer-consumer)问题,称之为有界缓冲区问题,两个线程共享一个固定的大小的缓冲区其中一个是生产者、生产消息存放到缓冲区、另一个是消费者,在缓冲区取出消息具体说明:生产者生产数据到缓存区,消费者从缓存去取数据如果缓存区满了,则生产者线程阻塞如果缓存区空了,消费者线程阻塞将阻塞的线程在一定的时间进行唤醒,通过线程的通信机制来唤醒,对于生产者线程,他的唤醒是有消费者有消费时就可以通知唤醒,同样,对于消费者线程,他的唤醒是有生产者生产了数据后通知唤

2020-07-13 21:50:38 257

原创 深入理解ReentrantLock重入锁

ReentrantLock公平性锁和非公平性锁非公平性:如果一个线程因为CPU时间全部被其他的线程抢走而无法获得CPU的执行时间,这种状态称之为饥饿,而该线程被称为“饥饿致死”,非公平锁就存在“饥饿”,因为线程得不到CPU的运行时间机会。Java的线程饥饿原因:1、高优先级的线程抢夺所有的低优先级的线程CPU时间2、线程被永久阻塞在一个等待进入同步块的状态3、线程在等待一个本身也处于永久等待完成的对象(比如调用这个对象的wait方法)公平性:所有的线程均能公平性的获取到执行的机会公平性锁的实

2020-07-13 21:46:20 168

原创 CAS和Atomic

CAS和Atomic在了解CAS和Atomic之前我们要先来认识一下悲观锁和乐观锁的一个概念!悲观锁和乐观锁悲观锁假设是每次获取数据都认为会被其他线程修改,每次来操作数据(可读、可写)的时候都会加锁悲观锁的实现是Synchronized悲观锁存在问题:1、多线程竞争,引起性能问题 (锁的释放和获取需要上下文切换和调度等)2、一个线程获取锁会导致其他线程被挂起(则塞)乐观锁假设对数据的操作一般都不会发生冲突,读取操作时,不会加锁,在对数据进行变更操作是,才来检测当前的数据是否发送冲突,发生

2020-07-13 18:30:20 951

原创 线程通信之wait() 和notify() 方法

线程通信之wait() 和notify() 方法通信方法wait():调用wait方法的线程,当前持有锁的该线程等待,直至该对象的另一个持锁线程调用notify/notifyAll操作。wait(long timeOut)、wait(long timeOut,int nanos)notify():通知持有该对象锁的所有线程中的的随意一个线程被唤醒notifyAll():通知持有该对象锁的所有线程被同时唤醒线程通信的方法:wait\notify\notifyAll操作都是属于Object类提供的方

2020-07-10 18:44:01 2436 1

原创 深入理解synchronized关键字

深入理解synchronized关键字synchronized是解决线程安全问题的一个方法,提供了线程同步的方式Synchronized的使用方式synchronized关键字可以修饰方法或者代码块,确保多个线程在同一时刻,只能有一个线程处理方法或者是同步块,保证线程对访问变量的可见性,有序性,原子性。• 修饰普通方法• 修饰静态方法• 修饰代码块修饰普通方法//修饰普通方法 public synchronized void add() { //do somethin

2020-07-10 18:26:58 158

原创 深入理解Volatile关键字

深入理解Volatile关键字在仔细讲解Java的volatile关键字之前优先回顾一下并发的特征,并发性的特征一共有三个:原子性,可见性,有序性。-原子性如果一个操作是不可分割的,那这就是一个原子操作。相反,如果一个操作是可以分割的,那么他就是非原子操作,eg:a++是线程安全的操作吗?答:不是。当有多个线程同时操作a++这个过程时,a++的操作可以分割成int a;a=0;a+1;这三步操作,在每一次操作被调用的时候都会发生错误,所以它是非线程安全操作-可见性一个变量被多个线程共享,如果一

2020-07-08 21:47:39 262

原创 线程创建与常用方法介绍

线程创建与常用方法介绍一、线程创建方式- 实现Runable接口- 继承Thread- 实现Callable接口实现Runable接口public interface Runnable { //抽象的run方法 public abstract void run();}实现Runnable接口,实现其提供的run方法Runnable实现类使用Demo//Runnable实现类的使用RunableDemo runable = new RunableDemo();Thre

2020-07-08 16:57:04 464

原创 并发与并行

并发与并行一、什么是并发并发是指多个线程操作同一个资源,不是同时执行,而是交替执行,单核CPU,只不过因为CPU的时间片很短,速度太快,看起来是同时执行(张三、李四厨师,共用一口锅炒菜,交替执行)二、什么是并行并行才是真正的同时执行,多核CPU。每个线程使用一个单独的CPU的资源来运行(张三、李四厨师、一人一口锅,一起炒菜)三、高并发高并发:我们设计的程序,可以执行海量的任务同时执行1.影响高并发性能的四个因素• QPS:每秒能够响应的请求数,QPS并不是并发数• 吞吐量:单位时间内处

2020-07-07 10:49:42 259

原创 PriorityQueue优先队列源码解析

PriorityQueue优先队列源码解析一、什么是PriorityQueue优先队列?PriorityQueue 一个基于优先级的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。PriorityQueue 队列的头指排序规则最小那个元素。如果多个元素都是最小值则随机选一个。PriorityQueue 是一

2020-07-06 18:13:02 257

原创 Java集合比较器的实现

Java集合比较器的实现一、基本概念Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比较器,而Comparator是外部比较器。ComparableComparable是在集合内部定义的方法实现的排序,位于java.util下。是一个对象本身就已经支持自比较所需要实现的接口,如String、Integer自己

2020-07-04 19:54:43 577

原创 HashMap底层源码探究

HashMap底层源码探究一、什么是哈希表1.定义:散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。2.哈希冲突:然而万事无完美,如果两

2020-07-03 17:05:20 164

原创 垃圾回收的三种算法

垃圾回收的三种算法主要阐明垃圾回收算法的思想,而不对相关代码进行深究!其中引用计数法也属于垃圾回收算法中的一种,在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行。那么很显然一个简单的办法就是通过引用计数来判断一个对象是否可以被回收。不失一般性,如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到,那么这个对象就成为可被回收的对象了。这种方式成为引用计数法。这种方式的特点是实现简单,而且效率较高,但是它无法解决循环引用的问题,因此在Java中并

2020-07-01 17:07:42 6641

原创 LinkedList源码解析

LinkedList源码解析简要概述LinkedList类是List接口的实现类,它是一个集合,可以根据索引来随机的访问集合中的元素,还实现了Deque接口,它还是一个队列,可以被当成双端队列来使用。虽然LinkedList是一个List集合,但是它的实现方式和ArrayList是完全不同的,ArrayList的底层是通过一个动态的Object[]数组来实现的,而LinkedList的底层是通过链表来实现的,因此它的随机访问速度是比较差的,但是它的删除,插入操作会很快。LinkedList是基于双向

2020-06-30 18:17:14 123

原创 常见排序算法及其优化

排序算法及其优化一、冒泡排序每次冒泡过程都是从数列的第一个元素开始,然后依次和剩余的元素进行比较,若小于相邻元素,则交换两者位置,同时将较大元素作为下一个比较的基准元素,继续将该元素与其相邻的元素进行比较,直到数列的最后一个元素 public static void main(String[] args) { int arr[] = {13, 15, 6, 1, 4, 5}; for (int i = 0; i < arr.length-1; i++) {

2020-06-27 22:01:03 933

原创 JavaSE面试问题总结

JavaSE基础复习题1.如何更快实现2的3次方如何实现任意数的任意次幂代码如下:public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.println("请输入基数num的值"); int num=sc.nextInt(); System.out.println("请输入幂power的值"); int p

2020-06-06 12:03:40 340

原创 Java二叉树(递归实现)

Java二叉树1.二叉树的创建。2.二叉树的先序,中序,后序,层序遍历。3.求二叉树的节点个数。4.求二叉树的高度。5.打印二叉树第K层元素。6.求其第K层元素个数。7.判断二叉树是否为完全二叉树。1.二叉树的创建 private int data;//根节点数据 BinaryTree left;//左子树 BinaryTree right;//右子树 ...

2020-03-23 19:32:49 545

原创 Java实现阶乘(循环与递归)

Java实现阶乘(循环与递归)递归实现public static void main(String[] args) { System.out.println("输入要计算的值:"); Scanner sc = new Scanner(System.in); String inta = sc.nextLine(); Intege...

2020-03-07 10:17:54 947

原创 java实现ArrayList

java实现ArrayList认识ArrayListArrayList继承自AbstractList 并实现List接口。1.ArrayList是一个可变数组,与Java中数组相比,它的容量是动态增长的,它继承自AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。2.ArrayList继承Abstr...

2019-12-09 19:41:56 185

原创 双向链表

**双向链表**class DoubleLinkList<E>{ protected Node<E> head; protected Node<E> tail; class Node<E>{ protected E data; protected Node<E> prev;...

2019-11-26 16:03:50 81

原创 单向循环链表

**单向循环链表**对于单链表而言,最后一个结点指针域是空指针,如果将该链表头指针置入该指针域,则使得链表头尾结点相连,这就构成了单循环链表。和单链表的操作基本相同,只是把最后一个结点的指针域指向头指针而已,其他没有变化。上篇博文我们说单链表有个缺点,就是无法随机查找,每次查找一个结点都要从头开始,那么单循环链表就很好地解决掉了这个问题。单循环链表可以从表中任意结点开始遍历整个链表。代码...

2019-11-26 16:00:39 431

原创 单链表的基本操作(逆置、合并、查找倒数第K个元素、在指定节点插入元素、输出相交节点、判断是否有环)

**单链表的基本操作**一、逆置单链表

2019-11-26 15:45:08 425

原创 java实现单链表的增删改查

java实现单链表的增删改查链表: 链表是由节点组成的,节点是next域连接起来的,每个节点=data+next,同时链表在内存中是不连续的。特点:1.访问某个特定的节点,从头开始去找2.删除、添加某一个特定的节点到某一个位置,只需要找到前一个节点,即可直接添加或删除3.链表是一种内存上不连续的数据结构创建一个单链表protected Node<E> head;//头节点...

2019-11-15 11:28:43 307

原创 Java反射机制

Java反射机制Java反射的内容:操作类的Class对象通过类的Class对象 ——或者类的所有的成员信息,包括:成员变量 ——Field构造函数——Construct普通方法——Method解释Java的反射Java之所以支持反射,是因为Java的每一个类,都有一个Class对象,通过Class对象可以获取这个类的构造方法,成员方法,成员变量,通过反射的方式进行调用或者修改,而不...

2019-11-05 16:05:06 88

原创 类的加载过程

类的加载过程JVM如何加载Student这个类第一次执行下面代码,第一次使用Student类Student stu=new Student();1.JVM先从磁盘上寻找Student.class字节码文件(加载)jvm从系统环境变量得CLASSPATH里面找字节码文件的搜索路径 .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar;%JAVA_HOME%...

2019-11-05 09:37:45 107

原创 String、StringBuilder、StringBuffer的区别联系

1.String是一个不可变类,StringBuilder是一个可变类,String对象的相加底层都是通过StringBuilder的append方法进行字符串连接的。2.在循环中,进行String字符串相加,其效率很低,会生成很多的String对象,此时应该直接使用StringBuilder进行字符串连接,所有字符串连接完成后,可以调用toString方法转成String类型的字符串对象...

2019-11-03 20:33:41 96

原创 final、finally、finalize的区别

final:1.修饰类: 表示它为密封类 密封类不能被继承 一般在设计基类时考虑将它设计成final类 (包装类型 字符串类型)2.修饰方法: 基类的方法 当基类的方法不想被派生类重写时 就会被定义成final类3.修饰变量: 表示为常量 一般作为左值 保证固定的量值不被修改finally:用在java的异常当中 一般跟到 try cathch后面 不管代码是否...

2019-11-03 20:30:57 120

原创 访问限定与异常体系

访问限定与异常体系类以及成员的访问限定Java工程 =》 包 =》 类一个/不同包里面的类互相访问定义类时需要注意以下几个问题:1.一个Java源文件只能定义一个和文件名字相同的public类,还可以定义其它的类,但是不能再用public修饰。2.public公有类的访问权限是:整个Java工程的所有包里面,都可以任意访问public公有类3.友好类(没有添加访问限定符的):它们只具...

2019-11-03 20:03:55 94

原创 Java的泛型编程

泛型编程Java的泛型编程:1.所写的代码可以处理任何的类型2.Java1~Java4时期Java并不支持泛型编程 ————直到Java5开始才支持泛型编程泛型编程的本质意义:1.能够检测参数的类型是否正确,合法2.自动类型转换,避免用户手动类型转换Java泛型的类型擦除机制在编译阶段,Java编译器通过泛型类型进行类型检查和自动类型转换,处理完成后,就会把T类型一直往上擦除,直...

2019-10-25 11:02:23 229

原创 多态的认识

**多态的认识**抽象方法:1.是在实例方法的返回值前面添加abstract,代表该方法不用提供实现2.抽象方法一般放在基类里面3.拥有抽象方法的类,一定得定义成抽象类注:拥有抽象方法的类 一定是 抽象类抽象类 不一定拥有 抽象方法什么是多态:多态就是用基类引用,引用不同的派生类对象,通过基类的引用变量调用同名覆盖方法,这个基类引用 、引用了哪个派生类对象,就会调用哪个派生类...

2019-10-24 21:19:53 120

原创 继承的用法和意义

**继承的用法及意义**OOP中两个类常有的关系有两种:1.组合关系:满足a part of… 一部分 一个类定义的对象称为另一个类的成员变量 has a…的关系A类是B类的一部分,A和B就设计成组合关系,设计如下:class A{}class B{A a; // B组合了A对象public B{this.a = new A():}}2.继承关系:满足 a k...

2019-10-22 13:40:14 464

原创 Java迷宫

今天我们用简单的函数调用实现一个迷宫,具体操作如下:迷宫的功能描述1.提示“请输入迷宫的行列数:5 5”2.提示“请输入迷宫的路径信息(0是可以行走,1是不能行走):”0 0 1 1 11 0 0 0 11 0 1 1 11 0 1 1 11 0 0 0 0搜索迷宫路径…3.若不存在路径则打印“迷宫不存在有效路径”4. 若存在路径则再次打印迷宫,把是路径的地方用 * 打印出...

2019-10-10 21:03:31 654

原创 Java中对象的产生过程

**Java中对象的产生过程**new ObjectInitTest()对象的产生过程1.JVM会在ObjectInitTest.class文件2.先加载类级别的成员(静态成员变量 静态块初始化)3.再加载对象级别的成员(实例成员变量 实例块初始化)eg:public class ObjectInit { // 成员变量给了默认的初始化 private i...

2019-10-09 11:45:48 321

原创 递归函数(二分搜索,汉诺塔问题,斐波那契数列)

**递归函数的调用**递归实现if => 递归的结束条件else =>递推关系(隐含了一个规模的缩减)递归实现二分搜索public class test { public static void main(String[] args) { int [] arr=new int [11]; Random rd=new Random...

2019-09-27 11:41:53 273

原创 Java函数调用

函数调用举例说明Java中函数的调用public class test { public static void main(String[] args) { int i = 0; func(i); i = i++; System.out.println(i); String str = "hello wo...

2019-09-26 20:30:08 17669

空空如也

空空如也

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

TA关注的人

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