- 博客(40)
- 收藏
- 关注
原创 Java LeetCode题 6 Z字形变换
题目描述将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:P A H NA P L S I I GY I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows); 示例 1:输入:s
2021-05-26 11:14:20
287
原创 Java LeetCode 寻找两个正序数组的中位数
题目给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 示例 1:输入:nums1 = [1,3], nums2 = [2]输出:2.00000解释:合并数组 = [1,2,3] ,中位数 2示例 2:输入:nums1 = [1,2], nums2 = [3,4]输出:2.50000解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5示例 3:输入:nums1 = [0,0
2021-05-07 11:38:16
373
原创 Java 爬虫
条件目标网页:天眼查条件:注册资金3000万左右结果数据:公司名称,法人姓名,公司logo代码依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2021-04-16 13:46:31
503
1
原创 Java 8 HashMap全章节跳转
这一章总和一下做个跳转文章地址Java 8 HashMap(一)—— 构造方法Java 8 HashMap(二)—— resize()初始化和扩容方法和get()查找方法Java 8 HashMap(三)——put()插入方法Java 8 HashMap(四)——remove删除方法Java 8 HashMap(五)——TreeNode的介绍Java 8 HashMap(六)——treeifyBin()树化和treeify()方法Java 8 HashMap(七)——TreeNode的ge
2021-04-04 11:47:18
142
原创 Java 8 HashMap(终)——TreeNode的untreeify和split方法
说明看注释一、untreeify final Node<K, V> untreeify(HashMap<K, V> map) { //hd 链表头节点 //tl 链表尾节点 Node<K, V> hd = null, tl = null; //q为当前使用方法的TreeNode,在q节点从Node转为TreeNode之前的链表关系还在,遍历链表
2021-04-03 23:20:23
776
2
原创 Java 8 HashMap(九)——TreeNode的removeTreeNode和balanceDeletion
说明看注释一、removeTreeNode /** * @param movable 处理时,是否移动其他节点 */ final void removeTreeNode(HashMap<K, V> map, Node<K, V>[] tab, boolean movable) { int n; //数组为空直接返回 if (tab == nul
2021-04-03 23:17:37
946
3
原创 Java 8 HashMap(八)—— putTreeVal方法和balanceInsertion方法以及左旋和右旋
说明看注释一、putTreeVal方法 final TreeNode<K, V> putTreeVal(HashMap<K, V> map, Node<K, V>[] tab, int h, K k, V v) { //kc key的class Class<?> kc = null; //已搜索 boolean searched = false;
2021-04-03 23:14:34
450
2
原创 Java 8 HashMap(七)——TreeNode的getTreeNode()方法
说明看注释 /** * 从根结点寻找h和k符合的结点 */ final TreeNode<K, V> getTreeNode(int h, Object k) { return ((parent != null) ? root() : this).find(h, k, null); } /** * 从根结点p开始根据hash和key值寻找指定的结点。kc
2021-04-03 23:10:22
692
1
原创 Java 8 HashMap(六)——treeifyBin()树化和treeify()方法
说明看注释一、treeifyBin方法 final void treeifyBin(Node<K, V>[] tab, int hash) { //n 数组的长度,index 数组位置 int n, index; Node<K, V> e; if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY) { //如果当前数组为
2021-04-03 23:05:20
801
原创 Java 8 HashMap(五)——TreeNode的介绍
一、红黑树的特性(1)每个节点或者是黑色,或者是红色。(2)根节点是黑色。(3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!](4)如果一个节点是红色的,则它的子节点必须是黑色的。(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点二、TreeNode和一些方法static final class TreeNode<K, V> extends LinkedHashMap.Entry<K, V> {
2021-04-03 23:05:04
3675
原创 Java 8 HashMap(四)——remove删除方法
说明看注释 @Override public V remove(Object key) { //e 当前要移除的节点 Node<K, V> e; //e节点是否为空,空返回null,否则返回e节点的value return (e = removeNode(hash(key), key, null, false, true)) == null ? null : e.value;
2021-04-03 22:50:48
1183
1
原创 Java 8 HashMap(三)——put()插入方法
直接上代码,说明看注释 @Override public V put(K key, V value) { return putVal(hash(key), key, value, false, true); } Node<K, V> newNode(int hash, K key, V value, Node<K, V> next) { return new Node<>(hash, key, value,
2021-04-03 22:48:33
472
2
原创 Java 8 HashMap(二)—— resize()初始化和扩容方法和get()查找方法
废话不多说直接上代码,说明都在代码注释上 final Node<K, V>[] resize() { //获得当前Map的Node数组,此步骤在于不直接对table进行修改 Node<K, V>[] oldTab = table; //获取当前Map的容量 int oldCap = (oldTab == null) ? 0 : oldTab.length; //获取当前Map扩容位置
2021-04-03 22:45:50
655
2
原创 Java 8 HashMap(一)—— 构造方法
一、类属性 //默认容量16 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; //最大容量2的30次方 static final int MAXIMUM_CAPACITY = 1 << 30; //默认加载因子0.75 static final float DEFAULT_LOAD_FACTOR = 0.75f; //单个节点上的链表长度大于8时转换为红黑树 sta
2021-04-03 22:42:56
809
2
原创 Java Map选择元素操作lambada方式
描述用lambada表达式在Map中对符合条件的Key的Value进行操作,其他不变。准备MapMap<Integer, Integer> map = new HashMap<>(); for (int i = 1; i <= 10; i++) { map.put(i, i * 2); }条件和操作:对符合key%2 == 0条件的value进行除2操作;代码 map.keySet().stream().
2021-03-28 13:31:44
592
原创 Java 简单的CAS原理实现
1.什么是CASCAS的英文为Compare and Swap 翻译为比较并交换,是一种乐观锁。其本质是在修改某个值不对其进行上锁,而是在修改时比对自己在修改前获得的旧值与现在的值进行比较,如果相同则将值进行修改,如果不同则说明有其他线程也对这个值进行了操作。为了防止自己修改的值对已经进行了操作的线程的业务逻辑造成影响,于是放弃本次修改2.CAS代码简单实现class A { private volatile int value; public A(int value) {
2021-03-20 20:47:54
391
原创 Synchronized锁升级过程
Synchronized的三个锁阶段偏向锁 -> 轻量级锁 -> 重量级锁1.偏向锁存在于当程序中的并发量并不高,大多数情况下都是一个时间段内只有单个线程在处理业务的情况下。当线程1第一次获取锁对象时,会进行CAS来加锁、解锁,然后被Synchronized修饰的锁对象会在对象头中记录当前线程ID。当线程1再次来获取锁对象时,锁对象会判断是否是同一线程过来请求锁,如果是,则不需要进行CAS加锁,可以直接进入。2.轻量级锁当有线程1在执行业务代码时,线程2过来请求锁对象时,偏向锁会升
2021-03-20 16:34:49
1075
原创 Java 识别有效的IP地址和掩码并进行分类统计
题目描述请解析IP地址和对应的掩码,进行分类识别。要求按照A/B/C/D/E类地址归类,不合法的地址和掩码单独归类。所有的IP地址划分为 A,B,C,D,E五类A类地址1.0.0.0~126.255.255.255;B类地址128.0.0.0~191.255.255.255;C类地址192.0.0.0~223.255.255.255;D类地址224.0.0.0~239.255.255.255;E类地址240.0.0.0~255.255.255.255私网IP范围是:10.0.0.0~10.
2021-03-20 14:30:49
674
原创 Java 坐标移动
题目描述开发一个坐标计算工具, A表示向左移动,D表示向右移动,W表示向上移动,S表示向下移动。从(0,0)点开始移动,从输入字符串里面读取一些坐标,并将最终输入结果输出到输出文件里面。输入:合法坐标为A(或者D或者W或者S) + 数字(两位以内)坐标之间以;分隔。非法坐标点需要进行丢弃。如AA10; A1A; %; YAD; 等。下面是一个简单的例子 如:A10;S20;W10;D30;X;A1A;B10A11;;A10;处理过程:起点(0,0)A10 = (-10,0
2021-03-09 20:49:09
1816
原创 Java 购物单
题目描述王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:主件 附件电脑 打印机,扫描仪书柜 图书书桌 台灯,文具工作椅 无如果要买归类为附件的物品,必须先买该附件所属的主件。每个主件可以有 0 个、 1 个或 2 个附件。附件不再有从属于自己的附件。王强想买的东西很多,为了不超出预算,他把每件物品规定了一个重要度,分为 5 等:用整数 1 ~ 5 表示,第 5 等最重要。他还从因特网上查到
2021-03-08 21:39:57
535
2
原创 Java 合并表记录
题目描述数据表记录包含表索引和数值(int范围的正整数),请对表索引相同的记录进行合并,即将相同索引的数值进行求和运算,输出按照key值升序进行输出。输入描述:先输入键值对的个数然后输入成对的index和value值,以空格隔开输出描述:输出合并后的键值对(多行)示例1输入40 10 21 23 4输出0 31 23 4代码结果一: public static void main(String[] args) throws IOException {
2021-03-06 14:11:58
311
原创 Java 质数因子
题目描述功能:输入一个正整数,按照从小到大的顺序输出它的所有质因子(重复的也要列举)(如180的质因子为2 2 3 3 5 )最后一个数后面也要有空格输入描述:输入一个long型整数输出描述:按照从小到大的顺序输出它的所有质数的因子,以空格隔开。最后一个数后面也要有空格。示例1输入180输出2 2 3 3 5代码 public static void main(String[] args) throws IOException { //接收输入字符串,为什么不
2021-03-06 13:50:05
974
原创 Java 字符串分隔
题目描述•连续输入字符串,请按长度为8拆分每个字符串后输出到新的字符串数组;•长度不是8整数倍的字符串请在后面补数字0,空字符串不处理。输入描述:连续输入字符串(输入多次,每个字符串长度小于100)输出描述:输出到长度为8的新字符串数组示例输入abc123456789输出abc000001234567890000000代码public static void main(String[] args) { Scanner sc = new Scanner(Sy
2021-02-28 13:03:01
213
原创 Java 明明的随机数
题目描述明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作(同一个测试用例里可能会有多组数据,希望大家能正确处理)。注:测试用例保证输入参数的正确性,答题者无需验证。测试用例不止一组。当没有新的输入时,说明输入结束。输入描述:注意:输入可能有
2021-02-28 12:38:09
159
原创 如何用Netty做一个简单的群聊天系统
1、服务器端代码public class GroupChatServer { //监听端口 private int port; public GroupChatServer(int port){ this.port = port; } //编写run方法,处理客户端请求 public void run() throws InterruptedException { //创建一个处理连接的线程组,处理连接用一个线程就行了
2021-02-18 14:28:43
144
原创 BIO和NIO的区别
1.BIO基本介绍BIO是传统的Java IO编程,其基本的类和接口在java.io包中BIO(blocking I/O):同步阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销BIO方式使用于连接数目比较小且固定的架构,这种服务方式对服务器资源要求比价高,并且局限于应用中,JDK1.4以前的唯一选择,程序简单易理解BIO基本模型:2.NIO基本介绍NIO全称 java non-blocking
2021-02-18 14:13:59
21590
3
原创 java sleep、wait和yield的区别
sleep:为java的原生方法,需要指定等待的时间,它可以让当前正在执行的线程在指定的时间内暂停执行(睡眠),进入阻塞状态,该方法既可以让其他同优先级或者高优先级的线程得到执行的机会,也可以让低优先级的线程得到执行机会。在休眠期间该线程的资源释放,但不会释放“锁标志”,这个锁是在synchronized代码块或方法下才有效,会锁定共享资源,如类的静态属性,对象锁等;如果没有synchronized,那共享资源同样会释放。也就是说如果有 synchronized 同步块,其他线程仍然不能访问共享数据。w
2021-02-07 13:45:55
161
原创 Cookie和Session的区别
Cookie:Cookie是一种存储在远程客户端并以此来跟踪和识别用户的机制。简单的说,cookie是web服务器暂时存储在用户硬盘上的一个文本文件,并随后被web浏览器读取。当用户再次访问web网站时,网站通过读取cookie文件记录这位访客的特定信息,从而迅速做出响应,如在页面中不需要输入用户的id和密码即可直接登录网站。cookie限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个。Sessi
2021-02-07 13:30:29
225
原创 如何写一个日志注解
1、注解首先写一个注解@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface AuditLog { /** * 操作信息 */ String operation();}2、写一个日志实体类该类用来记录日志信息@Setter@Getterpublic class Audit {
2021-01-31 17:01:22
946
原创 Sleuth源码解析
一、概念介绍先说几个概念。span:span是sleuth中最基本的工作单元,一个微服务收到请求后会创建一个span同时产生一个span id,span id是一个64位的随机数,sleuth将其转化为16进制的字符串,打印在日志里面。其对应的实现类是RealSpan。trace id:在一个调用链条中,trace id是始终不变的,每经过一个微服务span id生成一个新的,所以通过trace id可以找出调用链上所有经过的微服务。trace id默认是64位,可以通过spring.sleuth.t
2021-01-31 16:38:13
1239
1
原创 Quartz集群简介
一.TerracottaJobStore1.Terracotta服务器四种配置方式单机,无持久化:服务器把集群要管理的数据保存在内存中,当数据量大于服务器可用内存的时候,会发生内存溢出错误。这种模式一般只在开发中使用;单机,持久化:服务器把集群要管理的数据保存在硬盘中,利用服务器上的内存作为缓存,以提高常用数据的访问速度。当数据量大于服务器可用内存的时候,服务器会把不常用数据从内存中移除,这样就不会发生内存溢出问题。当服务器宕机,然后被从新启动以后,硬盘中的数据被从新激活,这样集群中共享的数据不会丢
2021-01-23 09:48:13
513
原创 OpenFeign 源码解析
基于版本2.2.3.RELEASE一、核心注解1.@EnableFeignClients作用:扫描被指定位置的feign客户端,生成其代理类并作为bean注册到容器中@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.TYPE)@Documented@Import(FeignClientsRegistrar.class)public @interface EnableFeignClients { String[] value()
2021-01-23 09:29:30
480
原创 Java8集合过滤操作
首先准备实体类package entity;public class Person { private Integer age; private String name; public Person(Integer age, String name) { this.age = age; this.name = name; } public Person() { } public Integer getAge
2021-01-17 16:07:00
3017
2
原创 SourceTree 2.4.8.0 安装及使用简介
1.安装和使用下载地址SourceTree官网这个版本安装需要账号密码,没有的话就注册一下。注册非常方便。其他点下一步就是了。最后选择git配置可以选择之前已经下载好的git,或者直接让sourcetree下载一个内嵌的git。安装完后来到这个界面。添加本地已有的仓库,可以将仓库文件夹直接拖到sourcetree的界面或者点击窗口上方的按钮,然后选择本地仓库路径就行了。如果本地没有仓库,需要远程克隆,可以点击上方Clone按钮之后来到此处第一个输入框输入远程仓库的克隆地址;第
2021-01-17 09:42:48
698
原创 feign扫描feignclient的三种方法
方式一:指定包路径扫描String[] basePackages() default {}:这是一个数组你可以指定多个包路径,指定包路径后会扫描该路径下的所有带@Feignclient注解的类和子包中的类,也有默认配置,当你不指定包路径时,他会自动扫表启动类下的所有包。所以为了加快扫描效率,大家以后最好还是指定一下哦。方式二:指定类路径扫描Class<?>[] basePackageClasses() default {}:该方法为指定类下的同级类及子包中的类凡是带有@Feignclien
2021-01-10 17:15:27
2973
原创 springcloud openfeign 如何传递文件
最近在工作时,用到了远程调用传递文件的情况。但是在用openfeign传输文件时,总是发送失败。后面调研了一下发现openfeign本身不支持文件传输,需要在发送方进行一些配置。首先在文件发送方导入依赖 <!-- 用于feginclient上传文件的依赖--> <dependency> <groupId>io.github.openfeign.form</groupId> <artifactId>fei
2021-01-10 16:24:19
1621
原创 Quartz中JobStoreTX与JobStoreCMT的区别
JobStoreCMTJDBCJobStore用于在关系数据库中存储调度信息(Jobs,Triggers和calendars)。实际上,您可以选择两个独立的JDBCJobStore类,具体取决于您需要的事务性行为。JobStoreCMT依赖于正在使用Quartz的应用程序管理的事务。在尝试安排(或取消调度)jobs/Triggers之前,JTA事务必须进行中。这使得调度的“工作”成为应用程序“较大”事务的一部分。JobStoreCMT实际上需要使用两个数据源,一个是由应用程序服务器(通过JTA)管理的连
2021-01-02 16:34:26
2578
原创 如何在两个集合中选择相具有属性的数据进行操作
一、准备工作准备两个实体类class Age{ private Integer id; private Integer age; public Integer getId() { return id; } public Age setId(Integer id) { this.id = id; return this; } public Integer getAge() { re
2021-01-02 15:31:48
412
原创 如何在对象集合中根据对象的某个属性来对集合进行分组
我们经常在工作中会碰到这种情况:让我将对象结合中的对象按照对象的某个属性的值进行操作,然后根据值对集合中的对象进行分组。这种情况听上去不是很难,但是在做起来的时候就会很麻烦。对不清楚Java8新特性的朋友来说,你可能会遍历数组对对象属性进行操作判断,然后在创建几个List对象去存储分组后的对象,这可能需要十几行代码。然而今天,我们来学习一下Java8的其中一个新特性:集合的流式编程,让这种操作只要几行代码搞定。一. 准备阶段1.准备好一个实体类public class Person{ pr
2020-12-27 13:57:31
3731
9
原创 Quartz在QRTZ_JOB_DETAILS表中存储了什么
Quartz在QRTZ_JOB_DETAILS表中存储了什么1.QRTZ_JOB_DETAIL表2. StdJDBCDelegate因为本文章是说明Quartz在QRTZ_JOB_DETAILS表中存储了什么的,所以本篇文章的前提是quartz的配置中是使用了jdbcjobstore的,并且driver代理这里我们使用的是StdJDBCDelegate。1.QRTZ_JOB_DETAIL表这张表是quartz存储job的表,按字面意思这些字段分别为SCHED_NAME:计划名字JOB_NAME:
2020-12-26 20:23:58
5324
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人