Java基础
文章平均质量分 50
haijiao12138
走向大佬!放纵能满足低级欲望,克制能满足高级欲望!
展开
-
二分查找/排序
二分查找/排序/二维数组中的查找/查找峰值原创 2022-10-18 21:31:01 · 122 阅读 · 0 评论 -
Mysql数据底层一些知识
B-树的优势1、将磁盘IO的低效操作通过内存中数据比较进行替换.在二叉树中,我们一次只能加载一个关键字进行匹配.但是在B-树,我们一次可以加载N个关键字,若我们将磁盘块(节点)的空间大小固定(MySQL中定义为16KB).磁盘块能存储的关键字个数就会与单个关键字内容占用的空间相关.基于预读和操作系统磁盘交互特性.我们磁盘1O一次加载的内容正好都是我们需要比对的内容.将内容的多次10加载转换成在内存中进行数据的比较合理的降低树的高度,减少IO的次数在树形结构中数据的所处高度位置,将带来IO的次数不一样.原创 2022-03-07 17:12:39 · 470 阅读 · 0 评论 -
数组转为list报错--asList的使用的坑
定义数组:Integer[] integers = new Integer[] {1, 2, 3};转化过程:List<Integer> list = Arrays.asList(integers);输出大小是:list.size();为3;再次添加元素报错: list.add(4);输出list.size();报错如下:可见:转变之后没有实现list的方法add等等,所以报错;...原创 2021-09-11 13:07:04 · 259 阅读 · 0 评论 -
Scanner的各种输入
数字输入:int i = scanner.nextInt();char类型输入:Char[j] = scanner.next().charAt(0);String类型的输入:String s = scanner.next();原创 2021-09-05 20:51:58 · 404 阅读 · 0 评论 -
奥运金牌-二维数组排序(按每行数组的第一位数排序)
代码如下:package com.haijiao12138.demo.leetcode.九月刷题.test0905;import java.util.ArrayList;import java.util.Arrays;import java.util.Collections;import java.util.Comparator;/** * @author: haijiao12138 * @ClassName: 二维数组根绝每个数组的第一个值进行排序 * @description:原创 2021-09-05 14:22:20 · 414 阅读 · 0 评论 -
优先级队列
给定一个链表数组,每个链表都已经按升序排列。请将所有链表合并到一个升序链表中,返回合并后的链表。解释:PriorityQueue具有队列先入先出的特点,但优先级队列先通过一些方法对元素进行比较,最小的元素优先级最高,在访问或删除操作时只能对集合中优先级最高的元素进行。该队列不允许使用 null 元素也不允许插入不可比较的对象(没有实现Comparable接口的对象)。示例 1:输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]原创 2021-09-03 19:47:25 · 140 阅读 · 0 评论 -
手 写LRU算法
LRU:最近最少未使用算法package com.haijiao12138.demo.leetcode.九月刷题.test0901;import java.util.LinkedHashMap;import java.util.Map;/** * @author: haijiao12138 * @ClassName: LRUCache * @description: TODO java实现LRU算法 最近最少未使用算法 * @date: 2021/9/1 21:26 */pu原创 2021-09-01 21:44:26 · 189 阅读 · 1 评论 -
数组去重的两种方法
方法1: public static void main(String[] args) { int[] arr = {1,2,3,4,3,2,6}; test(arr); } //1-通过list去重 public static void test(int[] arr) { List<Object> list = new ArrayList<>(); for (int i = 0; i原创 2021-09-01 21:16:30 · 537 阅读 · 0 评论 -
二叉树遍历之根据前序和中序求取后序遍历
package com.haijiao12138.demo.leetcode;/** * @author: haijiao12138 * @ClassName: Tree * @description: TODO * 前序遍历:GDAFEMHZ * 中序遍历:ADEFGHMZ * 求后续遍历 * @date: 2021/8/31 11:14 */public class Tree { public static void main(String[] args) { .原创 2021-08-31 12:49:30 · 247 阅读 · 0 评论 -
不同类型的转换
char类型转换为String类型String.valueOf(s.charAt(i));int类型转换为String类型:Strings=String.valueOf(int m);String类型转换为String类型:Integera=Integer.valueOf(String s);原创 2021-08-30 20:47:34 · 142 阅读 · 0 评论 -
两个线程交替打印出奇数和偶数
package com.haijiao12138.demo.leetcode;/** * @author: haijiao12138 * @ClassName: Thread * @description: TODO * @date: 2021/8/30 18:17 */public class TestThread { public static int count=0; private static final Object object = new Object();.原创 2021-08-30 19:49:24 · 360 阅读 · 0 评论 -
自定义实现链表反转
package com.haijiao12138.demo.leetcode;/** * @author: haijiao12138 * @ClassName: Test * @description: TODO * @date: 2021/8/30 18:06 */public class Test { public static void main(String[] args) { ListNode listNode1 = new ListNode(1); .原创 2021-08-30 19:47:45 · 120 阅读 · 0 评论 -
final和finally和finalize的区别与联系
常量关键字:final修饰基本类型变量,一旦被赋值不能再修改。修饰引用类型变量,变量初始化之后便不能再指向其他对象了,但可以修改该引用所指向的对象的内容。本质上是一回事,因为引用的值是一个地址,final要求值,即地址的值不发生变化。修饰方法,可以被重载,不能被重写。修饰类,不能被继承。若父类中final方法的访问权限为private,将导致子类中不能直接继承该方法,因此,此时可以在子类中定义相同方法名的函数,此时不会与重写final的矛盾,而是在子类中重新地定义了新方法。异常关键字:原创 2021-08-19 21:30:30 · 105 阅读 · 0 评论 -
Java中线程池详解
一.线程池简介线程池的概念线程池就是首先创建一些线程,它们的集合称为线程池,使用线程池可以很好的提高性能,线程池在系统启动时既创建大量空闲的线程,程序将一个任务传给线程池。线程池就会启动一条线程来执行这个任务,执行结束后,该线程并不会死亡,而是再次返回线程池中成为空闲状态,等待执行下一个任务。线程池的工作机制在线程池的编程模式下,任务是提交给整个线程池,而不是直接提交给某个线程,线程池在拿到任务后,就在内部寻找是否有空闲的线程,如果有,则将任务交给某个空闲的线程一个线程同时只能执行一个任务,但原创 2021-08-18 22:35:45 · 4666 阅读 · 1 评论 -
leetcode赋值链表,一维数组和二维数组初始化(热)
二维数组初始化:定义一:int n[3][3] = {{0,0,0},{0,0,0},{0,0,0}};定义二:int[][] arr = {{1,2,3},{4,5,6}};定义三:int[][] arr1 = new int[][]{{1,2}, {2, 3}, {4, 5}};一维数组定义: int[] a = new int[3]; 直接赋值创建对象: int[] b = {1,2,3};new初始化创建对象: int[] c = new int[]{1,2,3}原创 2021-08-17 19:21:23 · 284 阅读 · 0 评论 -
Java中的一些锁
⭐⭐lock接口&&AQS原理lock接口 Lock接口(以及相关实现类)用来实现锁功能,它提供了与synchronized关键字类似的同步功能,只是在使用时需要显式地获取和释放锁。 虽然它缺少了(通过synchronized块或者方法提供的)隐式获取释放锁的便捷性,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字所不具备的同步特性。 Lock接口提供的synchrinized关键字不具备的主要特性:原创 2021-08-17 02:21:54 · 140 阅读 · 0 评论 -
Spring动态代理实现日志功能
代理模式(Proxy)是通过代理对象访问目标对象,这样可以在目标对象基础上增强额外的功能,如添加权限,访问控制和审计等功能。1.自定义业务接口package com.haijiao12138.demo.spring.agentLog0815;/** * @author: haijiao12138 * @ClassName: BusinessClassService * @description: TODO * @date: 2021/8/15 14:33 */public inte原创 2021-08-15 14:52:49 · 510 阅读 · 0 评论 -
Java反射机制-Spring反射机制
什么是反射?(1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。 本质是JVM得到class对象之后,再通过class对象进行反编译,从而获取对象的各种信息。(2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了, 而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到, 所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性, 不需要提前在编译期知道运行的对象是谁。反射:能够分析类能力的程序叫做反射原创 2021-08-15 03:08:35 · 1590 阅读 · 1 评论 -
HashCode和equals的区别
从理论上来说,对于两个不同对象,它们通过 hashCode() 方法计算后的值可能相同。因此,不能使用 hashCode() 方法来判断两个对象是否相等,必须得通过 equals() 方法。也就是说:如果两个对象调用 equals() 方法得到的结果为 true,调用 hashCode() 方法得到的结果必定相等; 如果两个对象调用 hashCode() 方法得到的结果不相等,调用 equals() 方法得到的结果必定为 false;反之:如果两个对象调用 equals() 方法得到的结果为原创 2021-08-14 12:08:54 · 115 阅读 · 0 评论 -
SpringAop应用一之增强代码
AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可拓展性和可维护性。Spring AOP是基于动态代理的,如果要代理的对象,实现了某个接口,那么Spring AOP会使用JDK Proxy,去创建代理对象,而对于没有实现接口的对象,就无法使用 JDK Proxy 去进行代理了,这时候Spring AOP会使用Cgl原创 2021-08-13 00:50:37 · 276 阅读 · 1 评论 -
实现多线程的几种方式
1.继承Thread类 重写Thread类中的run方法public class MyThread extends Thread { @Override public void run(){ System.out.println("创建多线程1"); } public static void main(String[] args) { MyThread myThread = new MyThread(); myThr.原创 2021-08-12 19:04:22 · 126 阅读 · 0 评论 -
多线程启动执行并发任务
当SpringBoot项目启动后,加了@EnableScheduling,扫描项目中的定时任务,如下图@Configurationpublic class SaticScheduleTask extends Thread { //@Scheduled(fixedRate = 1000) @Scheduled(cron = "0/5 * * * * ?") private void configurationTask(){ Thread thread = n原创 2021-08-12 18:20:29 · 424 阅读 · 0 评论 -
创建定时任务的几种姿势
1-使用 TimerTask 创建job定时任务public class JobTimerTask { static long count = 0; public static void main(String[] args) { TimerTask timerTask = new TimerTask(){ @Override public void run() { count++;原创 2021-08-12 17:40:28 · 95 阅读 · 1 评论 -
线程中的run()方法和start()方法的区别
线程中start()/run()方法的区别start():该方法是在当前线程中启动一个新的线程,而新启动的线程会调用run()方法,同时该方法不能重复调用;run() :该方法和普通的方法一样,可以重复执行,不会创建新的线程。所以我们开启一个线程是用start方法而不是run方法;join():是让主进程等待子进程运行完毕后再执行主进程的。(即主进程阻塞)让主进程在原地等待,等待子进程运行完毕,不会影响子进程的执行...原创 2021-08-12 15:24:07 · 316 阅读 · 0 评论 -
Jvm-类加载机制
类加载机制破坏性双亲委派 加载 JVM在该阶段把数据源(.class文件,jar包,网络等)转换为二进制字节流,并生成一个代表该类的java.lang.Class对象 验证 确保class文件的字节流中包含的信息符合约束要求 准备 为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值; 解析 将常量池内符号引用替换为 直接引用;符号引用就是Integer,String定义的那些原创 2021-08-06 20:16:12 · 87 阅读 · 0 评论 -
Jvm-新创建对象如何从新生代晋升到老年代
不一定在堆中可能在栈里面;-》可能在虚拟机栈,绝大部分分布在堆中; 分布在 堆中哪个地方,如何从新生代晋升到老年代;?? 对象优先在Eden分配 大多数情况下,对象在新生代Eden区中分配,当Eden区没有足够空间进行分配时,虚拟机将发起一次新生代GC(Minor GC)。 大对象直接进入年老代 大对象即需要大量连续内存空间的Java对象,如长字符串及数组。 经常出现大对象导致内存还有不少空间时就提前触发垃圾收集以获取足够的连续空间来安置他们。..原创 2021-08-06 20:13:55 · 947 阅读 · 0 评论 -
jvm-垃圾收集器
CMS 老年代,多线程,标记清除算法 初始标记:仅标记一下GCRoots能直接关联到的对象,速度很快,没有关联到底,速度很快 并发标记:从GC Roots的直接关联对象开始遍历整个对象图的过程,这个过程耗时较长,不需要停顿用户线程,可以与垃圾收集线程一起并发运行 为什么?通过什么形式解决了由白到黑的过程 重新标记:因用户程序继续运作而导致标记产生变动的那部分对象的标记记录 并发清除:清理删除掉标记阶段判断的已..原创 2021-08-06 20:12:06 · 72 阅读 · 0 评论 -
Jvm-垃圾回收算法
标记-整理算法: 标记- 清除: 首先标记出所有需要回收的对象 在标记完成后,统一回收掉所有被标记的对象 也可以反过来,标记存活的对象,统一回收所有未被标记的对象。 执行效率不稳定 内存空间碎片化问题,标记、清除之后会产生大量不连续的内存碎片, 标记-复制算法: 它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。 当这一块的内存用完了,就将还存活着 的对象复制到另外一块上面, 然后再把已使用过的内存空间..原创 2021-08-06 20:10:54 · 65 阅读 · 0 评论 -
Jvm相关-如何判断对象已死
引用计数法 有引用+1 断开-1,为0时回收,实现简单 循环引用不好处理 可达性分析 GC Roots引用链上可以存活,没有关联认为已经死 哪些对象可以作为GCROOTS * 虚拟机栈中引用的对象 * 方法区中的静态属性引用的对象 * 方法区常量引用的对象 * 本地方法栈 JNI引用对象 * 虚拟机内部的引用 * 同步锁(synchronized)持有的对象 描述虚拟机的GMSBean ..原创 2021-08-06 20:08:45 · 60 阅读 · 0 评论 -
Redis 内存模型、持久化方式、主从复制、哨兵机制,一致性哈希原理,常用的数据类型、缓存穿透以及缓存雪崩原理和解决方案,过布隆过滤器的实现原理
底层模型 底层模型 Redis底层 跳表-跳着的链表 什么是Redis 高性能非关系型(NoSQL)的键值对数据库。 ,Redis 除了做缓存之外,Redis 也经常用来做分布式锁,甚至是消息队列。 Redis 提供了多种数据类型来支持不同的业务场景。Redis 还支持事务 、持久化、Lua 脚本、多种集群方案。 分布式缓存有哪些 使用的比较多的主要是 Memcached 和 Redis。不过,现在基本没原创 2021-08-04 22:00:49 · 233 阅读 · 1 评论 -
Java 网络编程,Http 协议,Https 协议,Tcp/Ip 协议,三次握手以及四次挥手, Http 长链接和短连接概念以及区别,对称加密,非对称加密原理等
Http协议与Https协议 HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传输减少。 HTTPS:是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。 HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全..原创 2021-08-04 16:18:12 · 990 阅读 · 2 评论 -
进程、线程、管程、纤程、协程概念以及区别
进程 进程是指在操作系统中能独立运行并作为资源分配的基本单位,由一组机器指令、数据和堆栈等组成的能独立运行的活动实体。 进程在运行是需要一定的资源,如CPU、存储空间和I/O设备等。 进程是资源分配的基本单位,进程的调度涉及到的内容比较多(存储空间,CPU,I/O资源等,进程现场保护),调度开销较大,在并发的切换过程效率较低。为了更高效的进行调度,提出了比进程更轻量的独立运行和调度的基本单位。 线程 线程能独立运行,独立调度,拥有资源(..原创 2021-08-04 02:34:38 · 797 阅读 · 0 评论 -
Java 序列化与反序列化原理
Java序列化是指把Java对象转换为字节序列的过程,而Java反序列化是指把字节序列恢复为Java对象的过程; 序列化:对象序列化的最主要的用处就是在传递和保存对象的时候,保证对象的完整性和可传递性。序列化是把对象转换成有序字节流,以便在网络上传输或者保存在本地文件中。序列化后的字节流保存了Java对象的状态以及相关的描述信息。序列化机制的核心作用就是对象状态的保存与重建。 反序列化:客户端从文件中或网络上获得序列化后的对象字节流后,根据字节流中所保存的对象状态及描述信息,通过反序..原创 2021-08-04 02:33:37 · 366 阅读 · 0 评论 -
Java 多线程中的 volatile 关键字,synchronized 锁的实现原理以及优化后锁升级的过程
Volatile volatile只能保证可见性,有序性,不能保证原子性 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 禁止进行指令重排序。 使用Volatile的场景: 对变量的写操作不依赖于当前值 该变量没有包含在具有其他变量的不变式中 synchro..原创 2021-08-04 02:32:34 · 143 阅读 · 1 评论 -
了解ArrayList,HashMap等集合,以及底层相应的数据结构,核心实现方法等
ArrayList(线程不安全) 是list接口下的一个类,是一个有序的集合,带索引的对象数组,提供了随机访问数据,遍历数据的时间(随即便利get方法,for循环是最快的),迭代器最慢。他是一个非线程安全的类,做遍历是较快 HaspMap描述(线程不安全) 添加数据使用put(key, value),取出数据使用get(key),HashMap是允许null,即null value和null key。线程不安全,1.7之前使用数组链表结构,其添加节点时使用头插法,会导致循环..原创 2021-08-04 02:31:10 · 268 阅读 · 0 评论 -
Java 基础如反射,内部类,代理,多态,接口等辨析
反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 反射就是把java类中的各种成分映射成一个个的Java对象 根据一个字符串得到一个类 getClass方法 String name = "Huanglinqing";Class c1 = name.getClass..原创 2021-08-04 02:28:51 · 211 阅读 · 0 评论 -
消息队列、RabbitMQ原理、消息队列保证幂等性,消息丢失,消息顺序性,以及处理消息队列消息积压问题
消息队列 消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已 常见的消息队列 RabbitMq ActiveMq ZeroMq kafka等; 为什么使用RabbitMq? RabbitMQ是一个实现了AMQP(Advanced Message Queuing Protocol)高级消息队列协议的消息队列服务,用Erlang语言的。 可靠性,Rabbit原创 2021-08-03 18:07:11 · 1079 阅读 · 2 评论 -
悲观锁和乐观锁的区别
悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁, 这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程) 传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁 Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。 乐观锁 总是..原创 2021-08-02 02:14:06 · 261 阅读 · 0 评论 -
Java中BIO与NIO、AIO的区别
IO的方式通常分为几种,同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO。 BIO 我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSocket,然后在客户端启动Socket来对服务端进行通信,默认情况下服务端需要对每个请求建立一堆线程等待请求,而客户端发送请求后,先咨询服务端是否有线程相应,如果没有则会一直等待或者遭到拒绝请求,如果有的话,客户端会线程会等待请求结束后才继续执行。 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端..原创 2021-08-02 01:33:58 · 176 阅读 · 1 评论 -
一种生产者和消费者的实现形式
题目: 假设现在有一个任务调度系统负责处理数据:A线程负责从DB里拉待处理的任务放到队列;B线程组负责从队列中处理任务。由于任务处理量较大,所以线程会将任务进行拆分子线程并行处理。当所有子线程处理完成后,由B线程汇总结果并统一落库。要求:A线程组负责生产数据data;B线程组负责消费data数据;A、B线程组要实现阻塞;请尽量考虑异常场景的处理;3、B线程组的一个处理线程在获取到一个数据后,需要再拆分5个子线程并行处理数据,当5个子线程全部处理完成,B的处理线程将结果合并;请尽...原创 2021-07-27 21:08:19 · 181 阅读 · 1 评论