
Java
文章平均质量分 72
程勇uestc
电子科大
展开
-
红黑树笔记
0、2-3树满足二分搜索树的基本性质节点可以存放一个元素或者两个元素,分别称为2节点和3节点2-3树绝对平衡2-3树的插入:假设依次插入42,37,12,则首先创建一个节点42,37来之后会和42节点合并形成一个3节点,12来后会先暂时和42,37形成节点[12,37,42],然后进行分裂,37为根,12为左子树,42为右子树红黑树和2-3树的等价性:所有红色节点向左倾斜1、红黑树特性红黑树是一颗二叉搜索树根节点是黑色(2-3树中两种节点显然易得)叶子节点(空节点)是黑色红原创 2021-07-31 21:50:11 · 479 阅读 · 0 评论 -
面试经典问题总结
一、Java类加载过程一个java文件从编码完成到最终执行,一般包括两个过程:编译:将写好的Java文件,通过javac命令编译成字节码,即.class文件运行:将编译生成的.class文件交给JVM执行类加载过程:JVM把.class文件中类信息加载进内存,并进行解析生成对应的class对象的过程。JVM不是一开始就把所有的类都加载进内存中,而是只有第一次遇到某个需要运行的类才会加载,且只加载一次。类加载分为三部分:加载、链接和初始化。其中链接又分为三小部分:验证、准备和解析。1.加载。原创 2021-07-15 18:56:45 · 447 阅读 · 0 评论 -
JVM调优
一、编译器自带的优化1、方法内联将方法展开,避免频繁调用函数,每次调用函数就会创建一个栈帧,消耗资源。是否内联需要满足以下条件:热点方法:如果方法体小于325字节会尝试内联,可以使用-XX:FreqInlineSize修改大小非热点方法:如果方法体小于35字节会尝试内联,可以使用-XX:MaxInlineSize修改大小被调用方法运行时的实现可以被唯一确定public class InlineTest { public static void main(String[] args)原创 2021-07-08 20:23:56 · 436 阅读 · 0 评论 -
Java算法题输入输出模板
头文件一般只需要import java.io.* 和import java.util.*使用BufferReader和BufferWriter输入输出实现readLine()函数读取一整行int类型数字,存在数组里,这个操作很常见import java.io.*;import java.util.*;public class Main { static class Node{ public int x; public int y; pu.原创 2021-06-17 17:22:29 · 1288 阅读 · 0 评论 -
Java知识点集锦
1、Java和C++的区别?都是面向对象的语言,都支持封装、继承和多态Java 不提供指针来直接访问内存,程序内存更加安全Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。Java 有自动内存管理机制,不需要程序员手动释放无用内存...原创 2021-05-31 15:38:47 · 353 阅读 · 1 评论 -
卡特兰数应用
详见卡特兰数原创 2021-05-27 15:49:21 · 334 阅读 · 0 评论 -
Java并发编程(七)——JUC
一、读写锁ReentrantReadWriteLock\quad当读操作远远高于写操作时,可以使用读写锁让读-读可以并发,提高性能。读写操作是互斥的,不能同时进行。二、信号量semaphore\quad用来限制能同时访问贡献资源的上限。public static void main(String[] args) { Semaphore semaphore = new Semaphore(3); // 同一时刻允许三个线程访问 // 没有semaphore,10个线程同时运行同时结束原创 2021-04-28 16:29:34 · 381 阅读 · 0 评论 -
Java并发编程(六)——线程池
一、自定义线程池\quad线程池跟连接池一样,维护线程池可以减少线程创建和关闭的时间。首先实现一个自定义线程池。首先是创建一个管理任务的阻塞队列,防止任务突然变多,线程忙不过来而造成任务丢失的情况。Thread pool维护一堆线程。class BlockingQueue<T>{ // 1. 任务队列(双向链表,先进先出) private Deque<T> queue = new ArrayDeque<>(); // 2. 锁(多个线程获取原创 2021-04-26 20:14:43 · 612 阅读 · 0 评论 -
Java并发编程——无锁(乐观锁)的方式实现并发
1、CAS\quad使用CAS(compare and swap)来实现无锁时线程安全,因为CAS操作底层是原子的。其实CAS底层是lock cmpxchg指令,在单核和多核CPU下都能够保证比较-交换的原子性。CAS操作需要volatile的支持,需要保证变量的可见性,因此可以用AtomicInteger代替int,其内部使用了volatile修饰。\quadCAS效率比synchronized效率高,原因?无锁情况下,即使重试失败,线程始终在高速运行,没有停歇,而 synchronized 会让线程原创 2021-04-21 15:36:32 · 862 阅读 · 0 评论 -
Java并发编程(五)——共享变量在多线程间原子性、可见性和有序性
\quad上一节讲解的Monitor主要关注临界区代码的原子性。Java内存模型(JMM)定义了主存、工作内存的抽象概念,体现在以下几个方面:原子性:保证指令不会受到线程上下文切换的影响可见性:保证指令不会受cpu缓存的影响有序性:保证指令不会受cpu指令并行优化的影响1、可见性\quad内存可见性问题:一个线程对主存数据进行了修改,对其他线程不可见。如下例子,run被主线程修改了,但是t线程被优化了在高速缓存中读取run,导致没有读取改变后的run值,程序会一直运行下去: stati原创 2021-04-20 11:27:16 · 424 阅读 · 0 评论 -
Mysql知识点集锦
1、Mysql常见存储引擎InnoDB\quad在Mysql5.5.8版本后,InnoDB成为Mysql默认存储引擎,支持事务和行级锁和外键,InnoDB通过多版本并发控制(MVCC)来获得高并发性,并实现了事务的四个隔离级别:未提交读:可读取未提交的操作数据,最低的隔离级别,这种情况会出现脏读。脏读:一个事务读取到了缓存中另一个事务未提交的数据。说明:当事务B对data进行了修改但是未提交事务,此时事务A对data进行读取,并使用事务B修改的数据做业务处理。已提交读:一个事务等待另一个事务提交原创 2021-04-13 09:18:16 · 322 阅读 · 0 评论 -
Java面经
1、 类加载机制和类加载器的双亲委派机制\quad虚拟机将描述类的class二进制字节码文件加载到内存,并对数据进行校验、转换解析和初始化,最终成为可以被JVM使用的Java类型,这一整套流程就是类加载机制。细节如下:加载:通过全限定类名获取定义此类的二进制字节流,并将此字节流所代表的静态存储结构转化为方法区运行时的数据结构,最后在内存中生成一个代表这个类的Class对象,这样可以在后面通过该对象获得该类的各种数据,例如获得该类的Methods,Fields等等验证:主要是确保字节码文件中包含的信息原创 2021-03-06 21:52:22 · 1776 阅读 · 3 评论 -
Java并发编程(三)——管程:使用悲观锁的思想解决多线程并发中的共享问题
一、共享带来的问题\quad当多个线程访问一个共同的资源时,会发生线程安全问题。假设有共享变量i=0,有两个任务,任务1对该变量进行+1操作,任务2对该变量进行-1操作。假设线程t1对i进行+1操作,但还未来得及保存,此时i=0,时间片就切换给线程2,此时线程2又对i进行-1操作并保存,此时i=-1,t2线程结束,时间片给t1,t1将上次未保存的结果1给i,最终输出i=1。按理说i最后等于0,但是由于多个线程操作共享资源,导致了线程安全问题。例如下面程序,返回结果就可能是:[-10000,10000]中任原创 2021-03-05 22:22:24 · 359 阅读 · 1 评论 -
剑指offer:最小的k个数
\quad输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0]\quad这里给出一个三路partition的操作,速度最快,可见测试数据中有很多重复元素。class Solution {public: int partition(vect原创 2021-03-04 21:49:28 · 171 阅读 · 1 评论 -
Java并发编程(二)——线程中的常见方法(join,yield,sleep等)和线程状态
1、start():启动一个新线程,在新的线程中运行run方法。注意:该方法只是让线程进入就绪状态,里面代码不一定立刻执行(CPU时间片还没分给它)。2、join():等待线程运行结束,写上t1.join(),程序运行到这句话时会等待线程t1运行结束后再执行后续操作,该方法提供了线程间运行顺序的控制,假设t2线程需要等待t1线程运行完才能执行,则可以在t2线程前加上t1.join()。static int r = 0;@Testpublic void test1() throws Interrupt原创 2021-03-03 22:03:10 · 311 阅读 · 1 评论 -
HashMap源码剖析
\quad红黑树底层实现是数组+链表+红黑树。大体逻辑是:创建一个长度为2的幂大小的数组table,里面存放Node节点当一个键值对插入散列表时,首先计算当前键值对Key的hash值,根据寻址算法(index=(table.length-1)&hash(key)),这样每一个键Key都能映射到[0,table.length-1]的区间中去当多个键值对的Key对应的hash值相同时,会在其对应的位置形成链表或者红黑树,当相同hash值Key数目达到8个时,会从链表树化为红黑树;反之当其数目减少原创 2021-03-03 18:59:57 · 261 阅读 · 1 评论 -
Java并发编程(一)——进程与线程概念和创建线程的方法
一、进程和线程概念进程概念进程是指在系统中正在运行的一个应用程序每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存线程概念线程是进程的基本执行单元,一个进程的所有任务都在线程中执行进程要想执行任务,必须得有线程,进程至少要有一条线程一个进程可以分为多个线程,一个线程就是一个指令流,将指令流的一条条指令交给CPU执行Java中线程是最小调度单位,进程作为资源分配的最小单位二者关系进程间相互独立,线程是进程的组成部分进程的资源供其线程共享,因此线程间通信简单,多个线程可原创 2021-03-03 11:13:52 · 224 阅读 · 0 评论 -
JVM中实用性细节
1、设置Java虚拟机栈大小-Xss\quadJava默认栈大小为1M,如果在多次使用递归函数的情况下可能会爆栈,例如示例程序,我是用递归函数dfs来求解1+2+3+...+n的值,在n=100000时就会爆栈。\quad我们修改配置,加上编译参数-Xss1024m就可以防止爆栈,但是也不能修改得太大,因为总的内存是一定的,如果给每个线程开启的栈内存过大会导致无法开启多个线程。\quad上述爆栈称为栈帧数目过多导致爆栈,在一个线程里面,每一次调用函数都会形成一个栈帧放入栈内,上述例子会调用1000原创 2021-02-21 21:00:43 · 295 阅读 · 4 评论 -
Java 8新特性
1、接口里面不仅可以有抽象方法,还可以有默认方法\quad默认方法需使用default关键字修饰。接口中除了可以定义抽象方法,还可以定义静态常量和静态方法,java8以后还可以定义默认方法。接口中方法都是public的,故而可以省略public不写。如下例子:public interface Formula { // 静态常量 static final String s = "Hello"; // 静态方法 static void say(){ Syst原创 2021-01-31 22:33:28 · 456 阅读 · 0 评论 -
Java lambda表达式
package lambdaTest;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;public class test1 { public static void sort1(){ List<Integer> arr = new ArrayList<>(); arr.原创 2021-01-26 16:33:19 · 367 阅读 · 1 评论 -
Java读取配置文件:xml、properties和yml
\quad在项目中,常常使用配置文件,配置文件类别大都分为三种:xml、properties和yml。接下来我们一一解析这三种文件在java中如何读取。一、读取xml文件\quad我们可以借助dom4j进行解析,先点击此处下载该jar包,将包导入工程中去。我们新建一个class.xml文件,内容如下:<class name="uestc"> <student> <name>张三</name> <age>原创 2021-01-26 16:33:01 · 2087 阅读 · 1 评论 -
Java注解和反射
一、Java注解的概念\qquadJava 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。Java 语言中的类、方法、变量、参数和包等都可以被标注。和 Javadoc 不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。\quad接下来介绍几个常见的注解:@Override:检查该方法是否是重写方法。如果发现其父类,或者是引用的接口中并没有该方法时,会报原创 2021-01-21 16:15:09 · 519 阅读 · 0 评论 -
redis学习和Java调用Redis
一、redis基础知识\quad博主建议redis基础数据类型以及命令在菜鸟教程过一遍即可,一两个小时足矣,点击此处。\quadJava调用redis可以在IDEA上新建一个maven工程,在配置文件pom.xml中导入redis的依赖即可,这样就不需要自己手动下载包再导入了,非常的方便。在pom.xml中依赖如下:<dependencies> <dependency> <groupId>redis.clients</groupId&g原创 2020-12-24 16:12:17 · 2839 阅读 · 0 评论 -
Java垃圾回收机制GC
一、如何判断对象是否为垃圾1、对象被判定为垃圾的标准没有被其他对象引用2、判断对象的引用数量来决定是否是垃圾判定标准:通过判断对象的引用数两来决定对象是否可以被回收;每个对象实例都有一个引用计数器,被引用则+1,完成引用则-1;任何引用计数为0的对象实例可以当作垃圾优点:执行效率高,程序执行受影响小缺点:无法检测出循环引用的情况,如父对象引用子对象,子对象反过来引用父对象,这样这两个对象永远不可能为0,导致内存泄漏。3、可达性分析算法来决定对象是否为垃圾\quad通原创 2020-12-23 21:07:58 · 2770 阅读 · 1 评论 -
JVM
一、Java跨平台性\quadJava源码首先被编译成字节码,再由不同平台的JVM进行解析,Java语言在不同的平台上运行时不需要进行重新编译,Java虚拟机在执行字节码时,把字节码转换成具体平台上的机器指令。查看Java程序对应的字节码:首先使用javac xxx.java指令生成Java文件对应的字节码文件:xxx.class使用javap -c xxx.class指令反编译字节码文件二、JVM如何加载class文件1、JVM架构Class Loader:依据特定格式,加载cla原创 2020-12-22 16:07:34 · 2723 阅读 · 2 评论 -
数据库学习
一、什么是关系型数据库和非关系型数据库1、关系型数据库\quad关系模型可以简单理解为二维表格模型,而一个关系型数据库就是由二维表及其之间的关系组成的一个数据组织。\quad关系型数据库中有许多张表,每张表表示现实世界的各种实体。各种实体之间的联系均用关系模型来表示。特点1.存储方式:传统的关系型数据库采用表格的储存方式,数据以行和列的方式进行存储,要读取和查询都十分方便。2.存储结构:关系型数据库按照结构化的方法存储数据,每个数据表都必须对各个字段定义好(也就是先定义好表的结构),再根据表的原创 2020-12-22 09:03:14 · 1463 阅读 · 0 评论 -
Spring框架剖析
一、Spring概念Spring是轻量级的开源的JavaEE框架Spring可以解决企业应用开发的复杂性Spring有两个核心部分:IOC和AOPIOC:控制反转,把创建对象的过程交给Spring进行管理Aop:面向切面,在不修改源代码的情况下进行功能增强Spring框架的特点:(1)方便解耦,简化开发;(2)Aop编程支持;(3)方便程序测试;(4)方便集成各种优秀框架;(5)方便进行事务操作;(6)降低API使用难度入门案例1.下载Spring5.2.6,地址,下载dist.zip文原创 2020-12-21 14:55:25 · 441 阅读 · 0 评论 -
Maven快速上手
1. Maven的强大之处Maven是一个项目管理工具传统Java工程,jar包在项目中;而在maven开发项目时,jar包不在项目中,放在maven仓库中,通过在项目中建立jar包坐标映射到真实的包中去。这就是依赖管理:maven工程对jar包的管理过程。如果本地仓库没有坐标,则去中央仓库下载,中央仓库几乎放置了开源的所有jar包maven目录结构2. Maven常见命令mvn compile:ompile是maven工程的编译命令,作用是将src/main/java下的文件编译为cl原创 2020-12-03 16:40:21 · 503 阅读 · 0 评论 -
Java多线程
1. 进程和线程概念进程:指一个内存中运行的程序,应用程序都需要在内存中执行线程:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中可以有多个线程,这样的程序称为多线程程序。四核八线程指的是该CPU可以同时执行8个任务。单线程CPU处理多线程任务时CPU在多个线程之间高速切换。线程调度:1.分时调度:所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间;2.抢占式调度:抢先让优先级高的线程使用CPU。Java程序属于抢占式调度。2. 主线程\原创 2020-11-28 15:09:21 · 447 阅读 · 0 评论 -
Java 异常处理
1. 异常概念和体系\quad异常指程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。在Java中异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象,出现异常导致程序中断。\quad异常的根类是Throwable,底下有两大子类:Error和Exception。2. 异常分类\quadException:编译器异常,编译程序时出现的问题。旗下有RuntimeException:运行期异常,是Java程序运行过程中出现的问题。把异常处理掉,程序可以继续执行。若不手动处理异常原创 2020-11-24 22:08:40 · 446 阅读 · 0 评论 -
Java集合之Map
\quad存放键值对的集合。Map常用的实现类有HashMap(无序),TreeMap(无序)和LinkedHashMap(有序)。1. Map接口常用方法V put(K key, V val):添加元素(若键已存在,则用新的值替换之)V get(K key):获取建为key的元素,若不存在则返回nullV remove(K key)boolean containsKey(K key)Set<K> keySet():把map集合中所有的key取出来放在Set集合中,用于遍历Map原创 2020-11-24 15:12:08 · 393 阅读 · 0 评论 -
Java 集合之Collection
1. 集合框架介绍\quad集合是Java提供的一种容器,可以用来存储多个数据。数组也可以存放数据,但其长度固定,而集合的长度是可变的。集合只能存储对象。\quad集合按照其存储结构可以分为两大类:单列集合Collection和键值对集合Map。本博客就Collection抽象类、对应接口及其实现类进行阐述。2. Collection中共性的方法boolean add(E e)void remove(E e)void clear()boolean isEmpty()int size()原创 2020-11-24 10:28:37 · 779 阅读 · 0 评论 -
Java 内部类
\quad一个类内部包含另一个类,被包含的类称为内部类。可以分为成员内部类和局部内部类(包含匿名内部类)。内部类访问外部类,随意访问外部类访问内部类,一定需要新建内部类对象使用成员内部类的两种方法:1.间接使用,通过外部类对象在外部类中使用内部类;2.直接使用,外部类名称.内部类名称 对象名 = new 外部类名称().new 内部类名称()public class Body { // 外部类 public class Heart{ // 成员内部类 public原创 2020-11-22 10:17:04 · 536 阅读 · 0 评论 -
Java之多态
\quad多态:一个对象拥有多种形态,它既有其本身的形态,也有其父类的形态,因此要想一个对象有多种形态,可以这样调用:父类名称 对象名 = new 子类名称() or 接口名称 对象名 = new 实现类名称(),简记为:父类引用指向子类对象。含义:右侧创建一个子类对象,把它当作父类来看待使用,相当于自动类型转型中的向上转型,从小范围转向了大范围,是安全的。一旦向上转型了,子类的特有方法便不再能使用。对于成员变量而言,编译看左边,运行看左边对于成员方法而言,编译看作边,运行看右边public c原创 2020-11-20 22:06:50 · 374 阅读 · 0 评论 -
Java接口
\quad接口是多个类的公共规范。接口时一种引用数据类型,最重要的内容就是其中的抽象方法。接口中可以包含的内容有:常量,抽象方法,在最新的JDK版本中还可以使用私有方法、静态方法和默认方法。接口中的抽象方法,修饰符必须时两个固定的关键字一起修饰:public abstract;但是可以选择性的省略接口不能直接使用,必须有一个实现类来实现该接口:public class 实现类名称 implements 接口名称{}接口的实现类必须重写接口中所有的抽象方法默认方法是为了解决接口升级带来的所有实现类都原创 2020-11-19 21:21:38 · 455 阅读 · 0 评论 -
Java之继承和抽象类
推荐一篇Java继承的博客。\quad继承主要解决不同类之间共性抽取的问题,减少程序量。子类可以继承父类的内容,还可以拥有自己特有的内容。继承使用extends关键字,格式为public class 子类 extends 父类 {}。子类中调用父类中重名的变量和方法需使用super区分子类中对父类方法的重写请使用@Override。一般来说,写与不写没什么区别,JVM可以自识别,但还是要养成良好的习惯。子类方法的返回值方法必须小于等于所重写父类方法的返回值范围,子类方法的权限修饰符必须大于等于父类方原创 2020-11-19 10:19:50 · 656 阅读 · 0 评论 -
Java常用API之ArrayList,String和Arrays
\quad请点击此链接JDK_API_1_6_zh_CN.CHM下载Java官方给出的中文的API文档来使用。1. 动态数组ArrayList\quad定义一个动态数组对象ArrayList<Integer> arr = new ArrayList<>();add(int val):往数组末尾添加一个数add(int index, val):往数组index位置添加一个数ArrayList重载了toString()方法,可以直接打印输出get(int index):取出原创 2020-11-18 22:07:56 · 577 阅读 · 0 评论 -
Java常用API之Scanner,Random,Math,Date,Calendar和StringBuilder
1. API查询和使用步骤\quad请点击此链接JDK_API_1_6_zh_CN.CHM下载Java官方给出的中文的API文档来使用。2. 键盘读入Scanner\quad情形一:读入n个数并存放在数组中// 可读取int, byte, short, long, float, double, boolean, 字符串,大整数和一整行读取// 这是标准写法不用改变Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] ar原创 2020-11-18 22:07:30 · 504 阅读 · 0 评论 -
Java基础快速解读
1. Java语言历史Java由Sun公司在1995年开发,版本为1.01997年发布Java 1.1版本2004年发布Java 5版本2009年Sun被Oracle收购,并发布Java 7版本2018年发布Java 10版本2. JVM——Java跨平台性的保证JVM是Java虚拟机,是Java程序的运行环境,该特性保证了用Java编写的程序可以运行在任何的操作系统上,这就是Java的跨平台性Java的虚拟机本身不具备跨平台功能,每个操作系统下都有不同版本的虚拟机3. JRE和J原创 2020-11-18 15:32:10 · 682 阅读 · 0 评论 -
Java集合——Set
一、综述\quadSet集合包含三个常用的类——HashSet, TreeSet, EnumSet,这三个类各有特色,使用场景不同。这里先讨论Set集合的通用特性:Set集合与Collection基本一样,没有提供额外的方法,只是行为不同Set集合不允许有相同的元素,如果试图把两个相同的元素加入一个Set集合则添加操作失败,add方法将返回falseSet判断两个对象相同不是使用==运算...原创 2020-01-30 18:14:19 · 1280 阅读 · 0 评论