堪称神级!GitHub上标星157K的Java教程,全程干货,只讲重点
兄弟萌,福利来了!
昨晚有个小伙伴私信我说,“哥,能推荐一些高质量的 Java 教程吗?
都这么叫咱了,咋着也得找一份牛掰的教程给他不是,于是就有了今天这份神仙级Java教程,刚在GitHub看的时候还是129k,现在已经标星157k了,里面涵盖了 Java 所有的知识点,包括 Java 语法、Java 集合框架、Java IO、Java 并发编程和 Java 虚拟机,内容不多,只讲重点。
话不多说,下面将这份教程的内容展示给大家,希望能帮助到正在学习Java的小伙伴
花了三个小时把这份教程整理成 PDF 后,我发给了小伙伴,他连忙发私信给我说,“哥,对不起,对不起,是我不懂规矩,你也太用心了,这份教程的质量真的高,不服不行!”
如果你也对这份 PDF 感兴趣的话或者想看看GitHub地址,可以帮忙转发文章后关注私信回复【学习】来获取!
Java基础
Java容器
Java并发
Java虚拟机
Java IO
限于文章篇幅原因,就展示到这里了,有需要这份文档及GitHub地址的小伙伴可以帮忙转发文章后关注私信回复【学习】来获取!
太牛了!腾讯T9耗时69天整理出最全架构师进阶核心知识点笔记
俗话说的好:
每一个程序员应该都想着如何快速提升自己(反正我是这样想的),从程序员进阶到架构师再到技术专家再到CTO 。当然这其中需要大量的知识储备,是一个不断学习的过程,话不多说下面我直接上图。
Spring 原理
Netty 与RPC
RabbitMQ
负载均衡
数据库
数据结构与算法
这本Java全栈PDF一共283页,由于篇幅限制无法将全部内容展示出来,需要的小伙伴帮忙点赞转发加关注一下,然后私信【666】即可得到获取方式
- Spring框架的七大模块
- Bean定义5种作用域
- spring ioc初始化流程?
- BeanDefinition加载流程?
- DI依赖注入流程? (实例化,处理Bean之间的依赖关系)
- 依赖注入怎么处理bean之间的依赖关系?
- Bean的生命周期?
- Spring的IOC注入方式
- 怎么检测是否存在循环依赖?
- Spring如解决Bean循环依赖问题?
- Spring 中使用了哪些设计模式?
- 解释一下AOP
- AOP 主要应用场景有
- AOP源码分析
- AOP使用哪种动态代理?
- jdk动态代理
- 动态代理与静态代理区别
- CGLIB与JDK动态代理区别
- SpringMVC
- springMVC流程:
- Mybatis
- Mybatis原理
- Mybatis一级缓存与二级缓存
- Zookeeper+eureka+springcloud
- SpringBoot启动流程
- Spring Boot 的核心注解
- SpringBoot常用starter都有哪些
- Spring Boot 的核心配置文件
- Zuul与Gateway区别
- Zuul原理分析
- Gateway原理分析
- Zookeeper 工作原理(待查)
- zoo与eur区别
- Hystrix原理(待查)
- 为什么需要hystrix熔断
- 微服务优缺点
- eureka自我保护机制
- MQ对比
- AVL树与红黑树(R-B树)的区别与联系
- 为啥redis zset使用跳跃链表而不用红黑树实现
- JAVA基本数据类型
- IO与NIO
- 异常类
- LVS(4层与7层)原理
- StringBuilder与StringBuffer
- interrupt/isInterrupted/interrupt区别
- sleep与wait区别
- CountDownLatch和CyclicBarrier区别
- 终止线程方法
- ThreadLocal的原理和应用
- threadLocal 内存泄漏问题
- 如果我们要获取父线程的ThreadLocal值呢
- 线程状态
- Java中的线程池是如何实现的?
- 如果线程池中的一个线程运行时出现了异常,会发生什么
- 线程池原理
- 拒绝策略
- newFixedThreadPool (固定数目线程的线程池)
- newCachedThreadPool(可缓存线程的线程池)
- newSingleThreadExecutor(单线程的线程池)
- newScheduledThreadPool(定时及周期执行的线程池)
- synchronized实现原理
- ReentrantLock 是如何实现可重入性的 ?
- ReentrantLock如何避免死锁?
- tryLock 和 lock 和 lockInterruptibly 的区别
- CountDownLatch和CyclicBarrier的区别是什么
- synchronized与ReentrantLock区别
- 什么是信号量Semaphore
- Semaphore 应用
- 可重入锁概念
- CAS+AQS队列来实现
- AQS 原理
- AQS两种资源共享方式
- CAS原理
- 公平锁与分公平锁
- 4种锁状态
- 轻量级锁与偏向锁的区别
- 自旋锁升级到重量级锁条件
- 读写锁了解嘛,知道读写锁的实现方式嘛
- zookeeper实现分布式锁
- volatile变量
- volatile如何保证线程间可见和避免指令重排
- jre、jdk、jvm的关系
- JVM内存模型
- 对象4种引用
- 对象的构成:
- 如果判断一个对象是否存活
- java是根据什么来执行可达性分析的:
- JVM 类加载顺序
- JVM三种类加载器
- 双亲委派机制
- 双亲委派模型有啥作用
- 如何打破双亲委派模型?
- 双亲委派机制缺陷?
- 导致fullGC的原因
- 堆外内存的优缺点
- JVM七种垃圾收集器
- arthas 监控工具
- 定位频繁full GC,堆内存满 oom
- G1垃圾回收器(重点)
- 什么时候发生Full GC呢?
- 那为什么不在引用赋值语句处直接更新RS呢?
- 线程本地分配缓冲区(TLAB:Thread Local Allocation Buffer)?
- PLAB:Promotion Thread Local Allocation Buffer
- OOM问题定位方法
- dubbo流程
- Dubbo推荐使用什么序列化框架,还有哪些?
- Dubbo默认使用的是什么通信框架,还有哪些?
- Dubbo有哪几种负载均衡策略,默认是哪种?
- RPC流程
- 服务暴露、服务引用、服务调用(TODO)
- redis单线程为什么执行速度这么快?
- Redis数据结构底层实现
- redis事务
- redis事务的实现特征
- Redis的同步机制?
- redis集群模式性能优化
- Redis集群方案
- 集群不可用场景
- redis 最适合的场景
- 缓存淘汰策略
- redis过期key删除策略
- 缓存雪崩以及处理办法
- 缓存击穿原因以及处理办法
- redis阻塞原因
- hot key出现造成集群访问量倾斜解决办法
- Redis分布式锁
- Redis如何做持久化
- 对方追问那如果突然机器掉电会怎样?
- redis锁续租问题?
- bgsave的原理是什么?
- RDB与AOF区别
- 1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
- 如何使用Redis做异步队列?
- 可不可以不用sleep呢?
- 能不能生产一次消费多次呢?
- pub/sub有什么缺点?
- redis如何实现延时队列?
- 为啥redis zset使用跳跃链表而不用红黑树实现?
- 数据库三范式
- 数据库主从复制原理
- 复制方式分类
- 存储引擎
- 聚集索引
- 非聚集索引
- 使用聚集索引为什么查询速度会变快?
- 建立聚集索引有什么需要注意的地方吗?
- InnoDB 表对主键生成策略是什么样的?
- 非聚集索引最多可以有多少个?
- BTree 与 Hash 索引有什么区别?
- 数据库索引优缺点
- 索引的底层实现是B+树,为何不采用红黑树,B树?
- 索引失效条件
- 数据库事务特点
- 七种事务传播行为
- 产生死锁的四个必要条件
- @Transaction
- XA方案
- TCC方案
- 可靠消息最终一致性方案
- 最大努力通知性(定期校对)
- Seata(阿里)
- TCP和UDP的比较
- TCP三次握手
- TCP四次挥手
- 为什么要进行第三次握手
- Lambda表达式
- default关键字
- 新时间日期APILocalDate | LocalTime | LocalDateTime
- JDK1.7与JDK1.8 ConcurrentHashMap对比
- JDK1.8使用synchronized来代替重入锁ReentrantLock?
- JDK1.9新特性
- 模块系统
- 集合工厂方法
- 改进的 Stream API
- 改进的 Javadoc
- java的集合框架有哪几种?
- List你使用过哪些
- 你知道vector和ArrayList和linkedList的区别嘛
- hashMap和hashTable和ConcurrentHashMap的区别
- 说说你了解的hashmap吧
- concurrentHashMap呢
- concurrentHashMap的扩容方式
- hashMap的put方法的过程
- 为什么修改hashcode方法要修改equals
- TreeMap了解嘛
- LinkedHashMap了解嘛
由于篇幅限制无法将全部答案展示出来,所有答案小编已经整理成一个Word文档,需要的小伙伴帮忙点赞转发加关注一下,然后私信【666】即可得到获取方式~
java编辑PDF文件
在本文中,我们将了解如何使用 Java 编辑PDF 文件的内容。 首先,我们将添加新内容。 然后,我们将专注于删除或替换一些预先存在的内容。
我们将使用 iText7 库向 PDF 文件添加内容。 稍后,我们将使用 pdfSweep 插件来删除或替换内容。
请注意,iText 在 AGPL 下获得许可,这可能会限制商业应用程序的分发:iText 许可模型。
首先,让我们将这些依赖项添加到我们的 pom.xml 中:
让我们了解使用 iText7 处理 PDF 的步骤:
首先,我们打开一个 PdfReader 来读取源文件的内容。 如果在读取文件时随时发生错误,这将引发 IOException。
然后,我们打开一个 PdfWriter 到目标文件。 如果此文件不存在或无法创建,则会引发 FileNotFoundException。
之后,我们将打开一个使用 PdfReader 和 PdfWriter 的 PdfDocument。
最后,关闭 PdfDocument 会同时关闭底层 PdfReader 和 PdfWriter。
让我们编写一个 main() 方法来运行我们的整个处理。 为了简单起见,我们将重新抛出任何可能发生的异常:
在下一节中,我们将逐步完成 addContentToDocument() 方法,以便用新内容填充我们的 PDF。 源文档是一个 PDF 文件,左上角仅包含文本“你好,小王子”。 目标文件将由程序创建。
我们现在将向文件添加各种类型的内容。
- 添加表单
我们将从向文件中添加一个表单开始。 我们的表单将非常简单,并包含一个名为 name 的唯一字段。
此外,我们需要告诉 iText 在哪里放置该字段。 在这种情况下,我们将把它放在以下点:(35,400)。 坐标 (0,0) 指的是文档的左下角。 最后,我们将字段的尺寸设置为 100×30:
此外,我们明确指定 iText 将表单添加到文档的第一页。
- 添加新页面
现在让我们看看如何向文档添加新页面。 我们将使用 addNewPage() 方法。
如果我们想指定它,这个方法可以接受添加页面的索引。 例如,我们可以在文档的开头添加一个新页面:
完整方法如下:
- 添加注释
我们现在要为文档添加注释。 具体来说,注释看起来像一个方形的漫画气泡。
我们将把它添加到现在位于文档第二页的表单之上。 因此,我们将其放置在坐标 (40,435) 上。 此外,我们会给它一个简单的名称和内容。 这些只会在将鼠标悬停在注释上时显示:
这是我们第二页中间现在的样子:
- 添加图片
从现在开始,我们将向页面添加布局元素。 为了做到这一点,我们将无法再直接操作 PdfDocument。 我们宁愿从它创建一个文档并使用它。 此外,我们最终需要关闭文档。 关闭文档会自动关闭基础 PdfDocument,那外层的关闭document就需要注释。
//注释外面的关闭文档
现在,要添加图片,我们需要从它的位置加载它。 我们将使用 ImageDataFactory 类的 create() 方法来执行此操作。 如果无法解析传递的文件 URL,则会引发 MalformedURLException。 在此示例中,我们将使用放置在资源目录中的 rejoice图片:
下一步是在文件中设置图片的属性。 我们将其大小设置为 550×100。 我们将把它放在 PDF 的第一页,在 (10,50) 坐标处。 让我们看看添加图片的代码:
图像会自动重新缩放到给定的大小。 如下图所示:
- 添加段落
iText 库带来了一些工具来将文本添加到文件中。 字体可以在片段本身上进行参数化,也可以直接在段落元素上进行参数化。
例如,让我们在第一页的顶部添加以下句子:this is a demo from the princess runs to the end。 我们将这句话开头的字体大小设置为 16,将段落的全局字体大小设置为 8:
注意:只能用英文,如果想要用中文,需要手动添加字体包,这里为了方便不做演示
- 添加表格
最后但并非最不重要的一点是,我们还可以在文件中添加一个表。 例如,我们将定义一个复式表,其中包含两个单元格和两个表头。 我们不会指定任何位置。 所以它会自然地添加到文档顶部,就在我们刚刚添加的段落之后:
现在让我们看看文档第一页的开头:
现在让我们看看如何从 PDF 文件中删除内容。 为简单起见,我们将编写另一个 test 方法。
我们的源 PDF 文件将是 a-modified.pdf 文件,目标将是一个新的 a-cleaned.pdf 文件。 我们将直接处理 PdfDocument 对象。 从现在开始,我们将使用 iText 的 pdfSweep 插件。
- 从文件中擦除文本
要从文件中擦除给定的文本,我们需要定义一个清理策略。 在此示例中,策略将只是查找与 the 匹配的所有文本。 最后一步是调用 PdfCleaner 的 autoSweepCleanUp() 静态方法。 此方法将创建一个自定义 PdfCleanUpTool,如果在文件处理期间发生任何错误,它将引发 IOException:
如我们所见,源文件中出现的 the 词在结果文件中被黑色矩形覆盖。 例如,此功能适用于数据脱敏:
- 从文件中擦除其他内容
不幸的是,很难检测到文件中的任何非文本内容。 但是,pdfSweep 提供了擦除文件一部分内容的可能性。 因此,如果我们知道要擦除的内容的位置,我们就可以利用这种可能性。
例如,我们将擦除位于第二页 (35,400) 的大小为 100×35 的矩形的内容。 这意味着我们将摆脱表单和注释的所有内容。 下面是执行所有这些操作的代码:
如下图所示,第二页中的表单被删除了
在本节中,我们将做与前面相同的工作,只是我们将用新文本替换以前的文本,而不是只删除它。
为了更清楚起见,我们将再次使用新的 test() 方法。我们的源文件将是 a-modified.pdf 文件。我们的目标文件将是一个新的 a-fixed.pdf 文件。
之前我们看到删除的文本被黑色背景覆盖。但是,此颜色是可配置的。由于我们知道文件中文本的背景是白色的,我们将强制覆盖为白色,与我们之前擦除的方法的类似。
但是,在调用 autoSweepCleanUp() 之后,我们将查询策略以获取已擦除代码的位置。然后,我们将实例化一个包含替换文本 abc的 PdfCanvas。此外,我们将删除上边距以使其与原始文本更好地对齐。默认对齐确实不太好。让我们看一下生成的代码:
我们可以看一下效果:
在本教程中,我们了解了如何编辑 PDF 文件的内容。 我们已经看到,我们可以添加新内容、删除现有内容,甚至可以将原始文件中的文本替换为新内容。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。