数组——双指针法
双指针法用两个同向或者反向的指针来代替两重循环。
提醒:不要老想着用同向双指针,有时候,相向双指针更容易解决问题。
LeetCode2712345678910111213141516171819202122class Solution { public int removeElement(int[] nums, int val) { int j=0; for(int i=0;i<nums.length;i++){ if(i!=j){ nums[j]=nums[i]; } if(nums[i]==val){ }else{ j++; } } return j; }}
28312 ...
数组——二分查找
二分查找前提条件
数组是有序的
数组中没有重复的元素
二分方法一般有两种写法一 左闭右闭当左大于右时,整体结束。如果左小于等于右则继续查找。每次mid =左加((右减左)/2)除2操作也可以看做时右移一位如果mid 值为目标则返回否则mid 值大于目标让右等于mid+1否则mid 小于目标让左等于mid+1
二左闭右开当左大于等于右时循环结束如果左小于右则继续查找每次mid=左加((右减左)/2)除2操作也可以看做时右移一位如果mid 值为目标则返回否则mid 值大于目标让右等于mid否则mid 小于目标让左等于mid+1
时间复杂度与空间复杂度二分查找的方法时间复杂度为o(logn)因为一直除2的操作,假如查找了k次,那么2^k为n空间复杂为o(1).
Leetcode 35题
写法1123456789101112131415161718192021222324252627282930class Solution { public int searchInsert(int[] nums, int target) ...
算法第一天——数组理论基础
数组数组是存放连续内存空间上的相同类型数据的集合,数组的下标都是从0开始,数组内存空间的地址是连续的。数组元素不能删除,只能修改。即数组数组一旦分配了内存空间就不能修改空间大小。但是在java中,java的内存的空间地址不允许用户访问,完全交给虚拟机寻址。所以不知道java中的内存地址是否连续,通过hashcode打印的值也是经过处理的。所以猜测java 中数组是这样排列的。
优缺点针对数组而言,最大的优点是存取速度快,其缺点包括插入和删除的效率非常低。最坏情况下时间复杂度是O(N) 。
补充基本数据类型byte、short、int、long 符号位+数值负数用补码表示float、double符号位+指数位+尾数位10.625(10)=1010.101(2)=符号位1 阶码为+3 尾数位010101float 符号位1位 阶码8位 尾数为23位double 符号位1位 阶码11位 尾数为52位 阶码也有符号位称为阶符
JAVA 中 ArraylistArrayList的底层实现是数组,是一个顺序容器,存放的数据和放进去的顺序相同。但是没有实现同步,有一个容量限制表示 ...
Future
FutureFuture接口由FutureTask 实现类定义了操作异步任务执行的一些方法,比如异步任务的执行结果、取消任务的执行、判断任务是否被取消、判断任务执行是否完毕等。Future 接口可以为主线程开一个分支任务,专门为主线程处理耗时和费力的业务。
Future是java5新加的一个借口,提供了一种异步并行计算的功能。目的异步多线程任务执行且返回有结果三个特点多线程/有返回/异步任务
runable 实现run方法 没有返回值 无异常callable 实现call方法 有返回值 有异常
多线程只能接受Runable,RunableFuture同时满足了线程和异步FutureTask 这个类支持构造注入,满足三个要求多线程/有返回/异步任务
FutureTask 继承实现关系图
futuretask demo123456789101112131415161718192021222324252627282930313233343536373839package com.jhj.Thread.future;import java.util.co ...
mysql调优
索引索引是帮助mysql 高效获取数据的排好序的数据结构红黑树就是平衡二叉树,mysql 不同红黑树 是因为树太高了b树 存储更多的索引元素 在树高度可控制的前提下 存储更多数据(多路搜索)b+树 非叶子节点不存储data 只存储第一个叶子节点数据的索引(冗余)叶子节点包含所有索引字段,叶子节点用指针连接查找过程折半查找,进行一次I/Ohash 一维数组加二维链表 虽然效率高但是几乎不用hash hash 仅能满足= in 不支持范围查询
b树与b+树区别叶子节点没有双向指针,查询范围不能连续b树没有冗余索引 b+树有
存储引擎存储引擎形容数据库表的 表结构 存储引擎 索引等存储在data 目录下用的比较多的 InnoDB 索引和数据都放在ibd 文件中 叶节点放data 所在行的其他列数据聚集索引 叶子节点包含了完整的数据记录 非聚集索引是索引和数据没有存放在一起就是非聚集的 一般情况下聚集索引查询会快一点
为什么推荐使用自增整数主键如果innoDB 如果找不到主键索引那么就去找一列唯一的 来构建B+树,如果找不到唯一的会帮你维护一个隐藏了rowid,自己键主键的 ...
JVM性能调优
java 如何跨平台,如何一次编译到处执行是由于java在不同的jvm上编译,jvm在软件层面屏蔽不同操作系统在底层硬件与指令上的区别。
jvm 包括new 的对象都是放在堆中栈,给线程单独使用(线程私有),存储一个一个栈帧(存储局部变量)给方法分配一个栈帧,放方法自己的局部变量 一个方法对应一个栈帧内存,方法结束,栈帧销毁。栈帧由 局部变量表(局部变量(对象的话存的是对象在堆中的内存地址),还有其索引)、操作数栈(操作的 加载到操作数栈)、动态链接(把一些符号引用转换为直接引用 类名方法名都是符号引用 通过符号引用找到直接引用的位置(方法的话就是方法区域的内存的地址))、方法出口(方法返回)组成。程序计数器(线程私有),马上要执行的一行代码的行号或者位置(方法区的内存地址)(存在原因 多线程安全,被另一个线程抢占了 重新回到本线程时怎么知道我执行到那里了)类通过类加载子系统 主要将类加载到方法区,字节码执行引擎主要执行方法区里面的代码,程序计数器的值是字节码执行引擎动态修改的。方法区 1.8之前 持久代 永久代 1.8后元空间 存放常量+静态变量+类信息本地方法栈:存储 native ...
docker-compose 部署ELK
目录结构docker-compose 文件1234567891011121314151617181920212223242526272829303132333435363738394041424344454647version: '3'services: elasticsearch: image: elasticsearch:7.17.2 container_name: elasticsearch restart: always ports: - 9200:9200 - 9300:9300 environment: # 设置集群名称 cluster.name: elasticsearch # 以单一节点模式启动 discovery.type: single-node ES_JAVA_OPTS: "-Xms512m -Xmx512m" volumes: - ./elk/elasticsearch/plugins:/usr/share ...
sleuth-zipkin springcloud
docker-compose文件123456789101112zipkin: image: openzipkin/zipkin:2.21 container_name: zipkin depends_on: - elasticsearch restart: always ports: - 9411:9411 environment: - TZ=Asia/Shanghai - STORAGE_TYPE=elasticsearch - ES_HOSTS=ES_HOSTS
springCloud 集成pom 文件引入
12345678<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-sleuth</artifactId></dependency><dependency> &l ...
SEATAdocker-compose部署
docker-compose 文件1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283version: '3'services: mysql7: image: mysql:5.7 container_name: mysql7 restart: always environment: MYSQL_ROOT_PASSWORD: ${ MYSQL_ROOT_PASSWORD} TZ: Asia/Shanghai command: --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci --default-authenticati ...
深拷贝与浅拷贝
深拷贝是将类的属性类也进行拷贝,而浅拷贝对于类的属性类进行公用操作。即深拷贝改变属性类的值拷贝对象不会随其变化,而浅拷贝会变化。
1234567891011121314151617181920212223public static void main(String[] args) { test s=new test(); s.setA(1); test1 test1 = new test1(); test1.setT(s); test1.setA(1); test1 test2 = new test1(); //浅拷贝 org.springframework.beans.BeanUtils.copyProperties(test1,test2); // 序列化 深拷贝 test1 clone = org.apache.commons.lang3.SerializationUtils.clone(test1); ...