- 博客(59)
- 收藏
- 关注
原创 NullPointerException底层源码分析
是由 JVM 在检测到空引用操作时自动抛出的,它继承自。通过查看底层字节码和 JVM 源码,我们可以更清楚地理解 NPE 的抛出机制。
2024-10-03 08:04:49
182
原创 Java开发类加载器实现机制
插件系统:在开发插件系统时,需要能够动态加载和卸载插件。这通常要求每个插件在自己的命名空间中运行,以避免与其他插件或主应用程序的类冲突。热部署:在不重启应用的情况下更新代码。隔离环境:隔离不同组件或模块以避免类冲突。从非标准源加载类:如数据库、网络、加密文件等。安全考虑:加载加密的类文件并进行解密。在自定义类加载器中覆盖loadClass// 不使用默认父类加载器@Override} else {@Override。
2024-10-03 07:57:33
266
原创 Java 中 MySQL 自增 ID 的与案例分析
定义:在 MySQL 中,如果某一列被定义为,则每次插入新记录时,这一列会自动分配一个唯一且递增的值。初始化:自增值从1开始,并随着每次插入操作而递增。持久化:当前的自增值存储在内存中,但在服务器重启或者表重建期间,InnoDB 会从表的数据文件中重新计算最大值并继续递增。
2024-10-03 07:55:25
636
原创 JDBC 事务操作底层的技术原理
JDBC(Java Database Connectivity)用于Java应用程序与数据库之间的连接和操作。事务是指一组作为单个逻辑单元执行的一系列操作,确保数据的一致性和完整性。
2024-10-03 07:54:16
203
原创 Java 抽象语法树(AST)的底层分析
通过上述示例,我们可以看到如何利用抽象语法树(AST)来表示和匹配正则表达式。每个节点类型(如CharNodeConcatNodeUnionNode)都实现了特定的匹配逻辑。最终,通过组合这些节点,我们可以生成一个复杂的正则表达式,并对输入字符串进行匹配操作。这样的设计不仅清晰,而且便于扩展和维护。设置解析器:创建并配置ASTParser。解析源代码:将源代码解析成。访问节点:使用ASTVisitor遍历 AST。创建新节点:通过 AST 创建新的语法节点(如方法声明)。修改结构:使用。
2024-10-03 07:52:48
775
原创 Java 正则表达式校验字符串源码分析
Java中的正则表达式实现是基于状态机和递归匹配的内部机制。:将正则表达式字符串编译成一个Pattern对象。:创建一个Matcher对象,准备对输入字符串进行匹配操作。:使用节点树从头到尾依次匹配输入字符串。节点树:每个节点执行对应的匹配逻辑,并递归调用下一个节点,直到整个表达式匹配成功或失败。
2024-10-03 07:47:16
355
原创 Java 常用序列化对比
使用第三方库,如 FastJson、Jackson 或 Gson,将对象转换为 JSON 字符串,再将 JSON 字符串还原为对象。使用 Google 的 Protocol Buffers(ProtoBuf)来定义消息格式,并生成相应的 Java 类。对象需要实现该接口,然后通过。进行序列化和反序列化。
2024-10-03 07:43:43
448
原创 Java String底层源码分析
在 JDK 9 及以后,Stringvalue是一个字节数组,用于存储字符串的数据。coder是一个字节值,指示字符串的编码(LATIN1 或 UTF16)。是一个本地方法:它通过本地代码实现高效的数组复制。参数检查和边界验证:在进行实际的内存复制之前,进行必要的参数检查和类型验证。高效内存复制:通常使用底层系统的内存复制函数(如memmove)来实现高效的数组数据移动。优化:针对不同的数据类型和平台进行专门优化,以提供最佳的性能。
2024-10-02 16:44:38
802
1
原创 Java hashcode设计与实现
设计与实现hashCode方法是Java开发中的一个重要部分,尤其是在需要使用对象作为哈希表键的情况下。这里有一些关于如何有效地设计和实现hashCodehashCodeequalshashCodehashCode。
2024-10-02 16:05:12
845
原创 Spring BeanUtils.copyProperties实现机制
Spring框架中的方法提供了一种在两个 Java 对象之间复制属性的便捷方式。与 Apache Commons BeanUtils 类似,它也是基于反射来实现的。
2024-10-02 16:01:48
1056
原创 StringUtils提供的字符串处理方法
StringUtils作为处理字符串的工具类,为开发人员默认提供了多种字符串处理函数。本文针对springframework包下的StringUtils进行详细的方法测试,帮助大家加深对StringUtils工具类的了解。 /** * isEmpty()判断对象是否为空/空字符串 */ public static void isEmptyTest(){ ...
2020-02-28 08:56:06
1431
转载 java Optional类
类作用Optional作为处理空指针的类,主要用途是作为一种返回类型,在获得该类型的一个实例后,如果存在值,可以提取该值;如果不存在值,可以设置一个默认值。常用写法public class OptionalTest { /** * 测试Optional of()、ofNullable() */ private static void test1(){/...
2020-02-22 13:10:59
591
原创 gitignore忽略不需要提交的文件
进行项目开发时,有时很多文件并不需要提交到git仓库。为避免每次add提交时,显示很多的文件信息,采用如下方式自动忽略不需要提交的文件:1.使用ll -a查看文件目录[dhp@dhpMac]: ll -atotal 32drwxr-xr-x@ 10 dhp staff 320B 2 6 20:48 .drwx------+ 52 dhp staff 1.6K ...
2020-02-06 21:55:16
684
转载 解决if else多层嵌套问题
转载自公众号:码农沉思录,值得学习。写在前面不知大家有没遇到过像“横放着的金字塔”一样的if else嵌套:if (true) { if (true) { if (true) { if (true) { if (true) { if (true) { ...
2020-01-03 21:43:12
13296
原创 设计RPC框架应考虑的问题
最近面试遇到一个很好的问题,面试官说如何设计一个RPC框架,虽然自己在Hadoop中会用到RPC,但是从来没总结过PRC框架的知识点,所以记录一下喽。RPC作用RPC作为分布式系统常见的一种通信方法,通俗来讲,RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。框架需解决问题RPC要达到的目标:远程调用时,要能够像...
2019-10-31 11:34:20
1652
原创 多构造器参数使用build设计模式
最近看HDFS源码,看到写副本时,ReplicaInfo类使用到了build设计模式,所以整理这篇文章,加深学习。提出问题当一个业务复杂的类包含多个属性时,如果我们想要创建实例对象时,就必须定义构造器,针对属性的可选性,我们的类可能变得如下:public class User { private final String name; private final int ag...
2019-10-28 21:45:56
1770
原创 自定义一个类叫java.lang.System???
原则上不行,类加载使用了双亲委托机制,当类加载器接收到类加载请求时,首先,该类加载器不会直接去加载类,而是让父类去加载,父类再去找父类去加载;当最顶层的父类无法加载时,才让子类去加载;System类会由启动类加载器去加载,所以我们自定义的System类完全没机会去加载。通过下面源码,可以看到类加载的整个处理逻辑。public Class<?> loadClass(String...
2019-07-26 19:51:59
529
原创 生产者-消费者模式
生产者和消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一个存储空间,生产者往存储空间中添加产品,消费者从存储空间中取走产品,当存储空间为空时,消费者阻塞,当存储空间满时,生产者阻塞。通过平衡生产者的生产能力和消费者的消费能力来提升整个系统的运行效率,这是生产者消费者模型最重要的作用 。/** * 生产者消费者模型 * 通过wait、notify实现 * 缓冲区满和为...
2019-07-22 13:46:51
737
原创 ReentrantLock知识大盘点
定义重入锁就是支持重新进入的锁,表示该锁能够支持一个线程对资源的重新加锁。实现重进入ReenTrantLock为了实现重进入,必须要解决两个问题:(1) 线程再次获取锁;(2) 锁的最终释放。ReentrantLock是通过组合自定义同步器来实现锁的获取和释放,处理逻辑:通过判断当前线程是否为获取锁的线程来决定获取操作是否成功,如果是获取锁的线程再次请求,则将同步状态值进行增加并返...
2019-07-22 13:33:41
808
原创 synchronized大盘点
利用synchronized实现同步的基础Java 中的每一个对象都可以作为锁,具体表现为三种形式:对于普通同步方法,锁的是当前实例对象;对于静态同步方法,锁的是当前类的class对象;对于同步代码块,锁的是synchronzied括号中配置的对象。(静态为何锁的是class对象:synchronzied方法执行之前需要一个monitor,对于一个静态方法而言,monitor关联的是类...
2019-07-09 22:46:48
1018
原创 java线程池知识点
线程池的优势合理的使用线程池会带来三个好处:降低资源的消耗。通过重复利用已创建的线程降低线程创建和销毁的开销;提高响应速度。当任务到达时,任务不需要等到线程创建就能直接执行;提高线程的可管理性。线程是稀缺资源,使用线程池可以进行统一分配、调优和监控。工作原理线程池保存一定量的线程,当有任务提交到线程池时,线程池若还没有达到最大线程数,则创建一个线程执行任务。若所有的线程都处于工作状...
2019-06-30 20:50:12
1308
1
原创 反射和动态代理
1 关于反射反射最大的作用之一就在于我们可以不在编译时知道某个对象的类型,而在运行时通过提供完整的”包名+类名.class”得到。注意:不是在编译时,而是在运行时。功能:在运行时能判断任意一个对象所属的类。在运行时能构造任意一个类的对象。在运行时判断任意一个类所具有的成员变量和方法。在运行时调用任意一个对象的方法。通俗来讲,利用Java反射机制我们可以加载一个运行时才得知名称的c...
2019-06-23 14:14:48
1125
原创 hdfs mkdir递归建立目录背后的设计
我们都知道hdfs命令:hdfs fs -mkdir -p /xx1/xx2/xx3 可递归创建一个目录,简单的命令背后,hadoop源码是如何执行的呐?接下来一起领略一下hadoop的源码魅力。接下来直接上mkdirs方法:public boolean mkdirs(Path f) throws IOException{ Path parent = f.getParent(); //...
2019-05-12 15:37:52
4247
原创 记一次有趣的hadoop源码编译
之前看到过很多人讲解源码编译,但自己一直没有尝试过。最近由于工作需要,想在本地搭建一个hadoop阅读环境,学习一下hadoop源码。准备阶段(1)首先下载要编译的hadoop源码版本,镜像链接如下:http://mirror.bit.edu.cn/apache/hadoop/common/(2)进入到hadoop目录,查看BUILDING.txt,了解编译需要的环境要求:比如本人编译的...
2019-05-04 13:58:14
1752
原创 常用linux命令汇总
后台进程ps -aux | more #查看后台运行的所有进程ps -aux|grep XXX ##查看指定内容的后台进程ps -aux | grep sshd ##查看sshd服务是否启动ps -ef | more #查看父进程ps -ef | grep sshd #查看sshd服务的父进程pstree -p #进程树ps -a:显示当前终端的所有进程信息ps...
2019-04-23 22:50:17
1662
原创 一个多线程面试题引发的思考
最近在梳理多线程的问题,遇到一个多线程的面试题,由此引发了一点思考:自己与优秀的工程师差距在哪里,这个面试题让自己看到了差距。希望自己以后在注重量的同时,能更多的关注质。题目:实现一个容器,提供两个方法:add,size。 写两个线程,线程1添加10个元素到容器中,线程2实现容器元素个数的监听,当个数达到5个时,线程2给出提示并结束。答案:方式一:public class T12 {...
2019-04-20 11:55:06
1823
原创 hive调优总结
###(1)本地模式:hadoop默认会将job提交到YARN集群,如果在测试阶段数据量比较小,可开启本地模式,加快程序执行的速度。set hive.exec.mode.local.auto=true;###(2)小表join大表1、保证大表在后,小表在前;原因:多表join时,hive假定查询中最后一个表是最大的表,在对每行记录进行join操作时,他会尝试将其他表缓存起来,然后扫描最后...
2019-04-08 17:40:22
1933
原创 flink Window机制
什么是 Window在流处理应用中,数据是连续不断的,因此我们不可能等到所有数据都到了才开始处理。当然我们可以每来一个消息就处理一次,但是有时我们需要做一些聚合类的处理,例如:在过去的5分钟内有多少用户点击了我们的网页。在这种情况下,我们必须定义一个窗口,用来收集最近一分钟内的数据,并对这个窗口内的数据进行计算。窗口可以是时间驱动的(Time Window,例如:每30秒钟),也可以是数据驱动...
2019-03-03 23:10:37
2356
原创 git feature分支远落后于dev分支解决方案
在团队合作中,每个人基本都是从dev分支建立自己的feature分支,完成feature分支开发任务后,merge到dev分支。如果我们的feature分支开发周期十分长,导致feature分支代码远落后于dev的代码,这时候如果我们想在自己的feature分支看到最新的dev分支代码怎么办?步骤:(1)进入自己的feature分支:git checkout frature-XXX...
2019-01-27 18:37:56
7111
2
原创 docker打包python程序
docker安装文档:https://docs.docker.com/docker-for-mac/#check-versionshttp://www.runoob.com/docker/macos-docker-install.htmldocker打包步骤(pipenv shell虚拟环境下python项目打包):项目最终结构:docker_test├── Dockerfile├─...
2018-12-29 13:34:38
9372
2
原创 hive中order by 、sort by、distribute by、cluster by、group by操作
order by对输入做全局排序,因此只有一个reducer,会导致当输入规模较大时,需要较长的计算时间。SELECT * FROM db_hive.employee ORDER BY empID desc; //按照empID降序排列sort by不是全局排序,其在数据进入reducer前完成排序。因此,如果用sort by进行排序,并且设置mapreduce.job.redu...
2018-12-11 09:48:47
4651
原创 数据倾斜解决方案
数据倾斜定义简单的讲,数据倾斜就是我们在数据计算的时候,由于数据的分散度不够,导致大量的数据集中到了一台或者几台机器上计算,这些机器的计算速度远远低于整个集群的平均计算速度,导致整个计算过程十分缓慢。常见数据倾斜现象数据倾斜往往会发生在数据开发的各个环节中,比如:用Hive数据计算的时候reduce阶段卡在99.99%用SparkStreaming做实时算法的时候,一直会有executo...
2018-12-11 09:11:47
3057
原创 spark-submit参数说明
提交spark job时需要传入的参数说明Usage: spark-submit [options] <app jar | python file> [app options]
2018-12-07 14:16:45
2584
原创 spark的checkpoint机制
引入checkpoint机制原因Spark 在生产环境下经常会面临 Transformation 的 RDD 非常多(例如一个Job 中包含1万个RDD) 或者是具体的 Transformation 产生的 RDD 本身计算特别复杂和耗时(例如计算时常超过1个小时) , 这个时候如果可以对计算的过程进行复用,就可以极大的提升效率,此时我们必需考虑对计算结果的持久化。如果采用 persists ...
2018-12-07 09:53:59
8018
原创 Spark Streaming从Kafka中接收数据的两种方式
spark streaming流式处理kafka中的数据,首先是把数据接收过来,然后转换为spark streaming中的数据结构Dstream。接收数据的方式有两种:1.利用Receiver接收数据;2.直接从kafka读取数据。基于Receiver的方式(旧方法)流程:此方法使用Receiver接收数据。Receiver是使用Kafka高阶API接口实现的。与所有接收器一样,从Kafk...
2018-12-07 09:34:13
4484
3
原创 RDD算子操作
1、RDD定义RDD(Resilient Distributed Dataset)叫做分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。2、RDD的属性1)一组分片(Pa...
2018-12-06 19:04:51
3277
原创 hive自定义函数UDF的使用方法
虽然Hive已经提供了很多内置的函数,比如count()、sum(),但是还是不能满足用户的需求,因此提供了自定义函数供用户自己开发函数来满足自己的需求。本实例通过编写自己的UDF,实现通过一个人的出生日期,计算其所属的星座。一、自定义函数分类UDF(User-Defined-Function)用户自定义函数,输入一个数据然后产生一个数据;UDAF(User-Defined Aggregat...
2018-12-06 14:05:43
11355
2
原创 Hive调用python脚本
Hive的 TRANSFORM 关键字提供了在SQL中调用自写脚本的功能,本实例通过python脚本对电影数据进行清洗,帮助读者了解hive调用python脚本的整个流程。操作步骤:1、创建基表CREATE TABLE u_data ( userid INT, //用户ID movieid INT, //电影ID rating INT, //电...
2018-12-06 11:04:29
6073
1
原创 sparkStreaming kafka保证数据不丢失、不重复
sparkStreaming接收kafka数据的方式有两种:1.利用Receiver接收数据;2.直接从kafka读取数据(Direct 方式)保证数据不丢失(1)Receiver方式为确保零数据丢失,必须在Spark Streaming中另外启用预写日志(Write Ahead Logs)。这将同步保存所有收到的Kafka数据到分布式文件系统(例如HDFS)上,以便在发生故障时可以恢复所...
2018-12-05 20:27:54
7124
原创 kafka的安装与使用
安装zookeeper(以两个节点为例master、slave)1.解压zookeeper安装包tar -zxvf zookeeper-3.4.12.tgz2.配置(先在一台节点上配置)2.1添加一个zoo.cfg配置文件cd $ZOOKEEPER/confmv zoo_sample.cfg zoo.cfg2.2修改配置文件(zoo.cfg)dataDir=/home/hado...
2018-12-05 16:12:52
1687
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人