
Java
文章平均质量分 72
汇聚 Java 所有相关知识!
王廷云的博客
一个热爱科学技术的人,喜欢创新,喜欢技术分享!
展开
-
【Java开发】之获取客户端真实 IP 地址
一般的客户端(例如浏览器)发送HTTP请求是没有 X-Forwarded-For 头的,当请求到达第一个代理服务器时,代理服务器会加上 X-Forwarded-For 请求头,并将值设为客户端的IP地址(也就是最左边第一个值),后面如果还有多个代理,会依次将IP追加到 X-Forwarded-For 头最右边,最终请求到达Web应用服务器,应用通过获取 X-Forwarded-For 头取左边第一个IP即为客户端真实IP。这种方式在中间没有代理的情况下,获取连接到服务器的客户端 IP 的最简单有效的方式。原创 2023-11-11 17:42:41 · 4084 阅读 · 0 评论 -
【Java开发】之 OOM 内存溢出
OOM,全称 Out Of Memory,意思是内存耗尽或内存溢出。对应Java 程序抛出的错为,这个错误在官方的解释如下:意思就是说,当 JVM 因为没有足够的内存来为对象分配空间并且垃圾回收器也已经没有空间可回收时,就会抛出这个 error(注意:这错误并非 exception,因为这个问题已经严重到不足以被应用处理)。原创 2023-07-03 19:27:20 · 1288 阅读 · 0 评论 -
【Java并发编程】之线程安全
本文介绍了Java多线程下的一些安全问题以及解决方案。原创 2022-08-21 00:26:34 · 343 阅读 · 0 评论 -
【Java 集合】之 CopyOnWriteArrayList
讲解 CopyOnWrite 的原理,同时介绍了 CopyOnWriteArrayList原创 2022-07-24 11:58:57 · 781 阅读 · 0 评论 -
【Java并发编程】之 CountDownLatch
CountDownLatch 的概念CountDownLatch 是一个同步工具类(位于 java.util.concurrent 包下),用来协调多个线程之间的同步,起到线程之间的通信作用。CountDownLatch 能够使一个线程在等待其他线程完成各自工作之后,再继续往下执行。其使用一个计数器进行实现,计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在 CountDownLatch 上等待的线程就可以继续执行接下原创 2022-04-08 16:25:08 · 773 阅读 · 0 评论 -
【Java开发】之 JDK 自带的 JVM 性能调优监控工具
一、简介JDK 本身自带了许多 JVM 调优监控工具,可以帮助我们查看 Java 应用程序的进程、线程、内存栈等信息。这些工具命令包括 jps、jstack、jmap、jhat 等等。这些命令所在位置:Linux:安装完 JDK 后,这些命令工具会默认放在 /usr/bin/ 下,直接使用即可;Windows:在 Windows 下,这些命令工具在安装 Java 目录的 jdk_xxx/bin/ 目录下,比如 C:\Program Files\Java\jdk1.8.0_212\bin,如果想要原创 2022-02-28 20:06:48 · 3710 阅读 · 0 评论 -
【Java开发】之模板引擎 freemarker
目录一、简介二、FreeMarker 实战三、Freemarker 常用标签 一、简介1、FreeMarker 介绍FreeMarker 是一款 基于模板和要改变的数据 的模板引擎, 是用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。FreeMarker 模板的工作方式为 MVC(模型、视图、控制器)模式,常用来在 MVC 模式的 Web 开发框架中生成 HTML 页面。原创 2022-02-15 17:22:55 · 2172 阅读 · 0 评论 -
【Java开发】之 Long 类型序列化成 String
一、情景介绍在项目开发过程中,当后端返回给前端的类型为 Long 类型时,如果值超过了前端 js 显示的长度范围的话会导致数字精度丢失,但我们又不想变更字段的类型,此时我们可以在序列化返回时将 Long 类型转换成 String 类型。二、转换方式1、使用 @JsonSerialize 注解import com.fasterxml.jackson.databind.annotation.JsonSerialize;import com.fasterxml.jackson.databind.原创 2022-02-11 19:08:12 · 6039 阅读 · 1 评论 -
【Java开发】之转义html标签字符
1、引入依赖<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-text</artifactId> <version>1.9</version></dependency>2、编写Java代码import org.apache.commons.text.StringEscapeUtils;原创 2021-09-30 13:58:31 · 423 阅读 · 0 评论 -
【Java开发】之网络图片转Base64
1、引入依赖<dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.13</version></dependency>2、获取图片并转Base64@Test void Test() throws IOExceptio原创 2021-09-30 13:44:35 · 535 阅读 · 0 评论 -
【Java开发】之配置文件的读取
目录一、使用 @Value 读取二、使用 @ConfigurationProperties 读取一、使用 @Value 读取原创 2021-09-18 17:11:28 · 912 阅读 · 0 评论 -
【Java开发】之网页爬取分析工具 Jsoup
一、Jsoup 简介1、Jsoup 介绍Jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据(官网地址为:https://jsoup.org/)。2、Jsoup 提供的主要功能从一个URL,文件或字符串中解析HTML;使用DOM或CSS选择器来查找、取出数据使用DOM或CSS选择器来查找、取出数据;可操作HTML元素、属性、文本可操作HT原创 2021-08-18 16:07:15 · 505 阅读 · 0 评论 -
【Java开发】之中文转汉语拼音
一、引入 Maven 依赖<dependency> <groupId>com.belerweb</groupId> <artifactId>pinyin4j</artifactId> <version>2.5.0</version></dependency>二、实战实例1、编写中文转拼音方法import net.sourceforge.pinyin4j.PinyinHel原创 2021-08-16 12:02:48 · 301 阅读 · 0 评论 -
【Maven】之常用配置
1、添加阿里云仓库打开 conf 目录下的 settings.xm 配置文件 <mirrors> <!-- 阿里云仓库 --> <mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://mave原创 2021-08-04 15:42:44 · 153 阅读 · 0 评论 -
【Java基础】之 Arrays.asList 和 ArrayList 的 subList
一、浅谈 Arrays.asList1、不能往 Arrays.asList 生成的 List 集合中添加元素1)场景:Arrays.asList() 方法很方便地为我们快捷创建一个 List 集合,比如:List<String> list = Arrays.asList("123", "456", "789");但是,如果我们往生成的 list 添加元素时:list.add("2233");会抛出 java.lang.UnsupportedOperationException原创 2021-03-26 16:09:49 · 669 阅读 · 0 评论 -
【Java编程】之 List 与数组之间的相互转换
数组转换成 List 集合数组转 List 集合常用的方式是使用 java.util 包下的 Arrays.asList 方法进行转换:import java.util.Arrays;List<String> list = Arrays.asList("123", "456", "789");关于 Arrays.asList 方法的一些注意点可以参考我的另一篇博客:【Java编程】之浅谈 Arrays.asList 和 ArrayList 的 subListList 集合转数组原创 2021-03-26 10:07:17 · 8398 阅读 · 1 评论 -
【SpringMVC】之问题总结
前端 Json 数据转换成 Java 对象当前端发送请求时,如果附带有 Json 数据,比如(使用 PostMan 工具进行模拟请求) :后端 Java 的 Controller 层如果想要接收并把 Json 数据转换成对应的 Java 对象,需要使用 @RequestBody 注解:@RestController@RequestMapping("/user")@Slf4jpublic class UserController { /** * 用户注册 * @pa原创 2020-11-30 10:23:37 · 153 阅读 · 0 评论 -
【Java开发】之 JVM 理论知识总结
一、Java 内存区域1、JVM 的主要组成部分及其作用JVM包含两个子系统和两个组件,两个子系统为 Class loader(类装载)、Execution engine(执行引擎):Class loader(类装载):根据给定的全限定名类名(如:java.lang.Object)来装载 class 文件到 Runtime data area 中的method area。Execution engine(执行引擎):执行classes中的指令。两个组件为 Runtime data area原创 2020-10-22 10:42:47 · 179 阅读 · 0 评论 -
【Java 开发】之 Java Web 理论基础知识总结
1、什么是 ServletServlet 是运行在服务器上的一个 java 小程序,它可以接收客户端发送过来的请求,并响应数据给客户端;Servlet 是 JavaEE 规范之一,规范就是接口;Servlet 就 JavaWeb 三大组件之一。三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。Servlet(Server Applet)是 Java Servlet 的简称,是使用 Java 语言编写的运行在服务器端的程序。具有独立于平台和协议的特性,主要功能原创 2020-10-21 18:41:52 · 487 阅读 · 1 评论 -
【Java开发】之常用开发经验汇总
1、如何统计 String 中字符的个数@Testpublic void countCharacter() { String str = "jfefuieffdjfiedfdjf"; // 使用 hashmap 存储统计 HashMap<Character, Integer> result = new HashMap<>(); for (char ch : str.toCharArray()) { result.put(原创 2020-10-20 16:04:21 · 117 阅读 · 0 评论 -
【SpringMVC】之理论知识总结
SpringMVC 概述SpringMVC 简介Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间的配合。SpringMVC 的优点可以支持各种视图技术,而不仅仅局限于JSP;与Spring框架集成(如IoC容器、AOP等);清晰的角色分配:前端控制器(dispatcherServlet) ,请求到处理器映射(han原创 2020-09-17 16:03:01 · 315 阅读 · 0 评论 -
【Spring】之理论知识总结
Spring 是什么Spring 是一个轻量级的 IoC 和 AOP 容器框架。是为 Java 应用程序提供基础性服务的一套框架,目的是用于简化企业应用程序的开发,它使得开发者只需要关心业务需求。Spring 常见的配置方式有三种:基于XML的配置基于注解的配置基于Java的配置。主要由以下几个模块组成:Spring Core:核心类库,提供IOC服务;Spring Context:提供框架式的Bean访问方式,以及企业级功能(JNDI、定时任务等);Spring AOP:AOP服原创 2020-09-16 16:36:53 · 183 阅读 · 0 评论 -
【Spring】之配置 Druid 数据库连接池
Druid的简介:Druid是一个数据库连接池。Druid是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid已经在阿里巴巴部署了超过600个应用,经过一年多生产环境大规模部署的严苛考验。Druid是阿里巴巴开发的号称为监控而生的数据库连接池。Druid组成:Druid是一个JDBC组件,它包括三部分:DruidDriver 代理Driver,能够提供基于Filter-Chai原创 2020-07-09 08:07:39 · 1101 阅读 · 0 评论 -
【Java NIO】之 Pipe
下面以一个实例介绍 NIO 的 Pipe 用法/** * 一、使用 NIO 完成网络通信的三个核心: * * 1. 通道(Channel):负责连接 * * java.nio.channels.Channel 接口: * |--SelectableChannel * |--SocketChannel * |--ServerSocketChannel * |--DatagramChannel * * |--Pipe.SinkChanne.原创 2020-07-05 17:08:24 · 205 阅读 · 0 评论 -
【Java NIO】之 NonBlockingNIO
下面以一个实例介绍 NonBlockingNIO 的用法/** * 一、使用 NIO 完成网络通信的三个核心: * * 1. 通道(Channel):负责连接 * * java.nio.channels.Channel 接口: * |--SelectableChannel * |--SocketChannel * |--ServerSocketChannel * |--DatagramChannel * * |--Pipe.SinkC.原创 2020-07-05 17:06:23 · 252 阅读 · 0 评论 -
【Java NIO】之 Channel
下面以一个实例介绍 Channel 的各种用法/** * 一、通道(Channel):用于源节点与目标节点的连接。在 Java NIO 中负责缓冲区中数据的传输。 * Channel 本身不存储数据,因此需要配合缓冲区进行传输。 * * 二、通道的主要实现类 * java.nio.channels.Channel 接口: * |--FileChannel * |--SocketChannel * |--ServerSocketChann.原创 2020-07-05 17:03:02 · 602 阅读 · 0 评论 -
【Java NIO】之 Buffer
下面以一个实例介绍 NIO 的 Buffer/** * 一、缓冲区(Buffer):在 Java NIO 中负责数据的存取。缓冲区就是数组。用于存储不同数据类型的数据 * * 根据数据类型不同(boolean 除外),提供了相应类型的缓冲区: * ByteBuffer * CharBuffer * ShortBuffer * IntBuffer * LongBuffer * FloatBuffer * DoubleBuffer * * 上述缓冲区的管理方式几乎一致,通过 all.原创 2020-07-05 17:01:26 · 144 阅读 · 0 评论 -
【Java NIO】之BlockingNIO
下面以一个实例来演示如何使用 BlockingNIO/** * 一、使用 NIO 完成网络通信的三个核心: * * 1. 通道(Channel):负责连接 * * java.nio.channels.Channel 接口: * |--SelectableChannel * |--SocketChannel * |--ServerSocketChannel * |--DatagramChannel * * |--Pipe.SinkCha.原创 2020-07-05 16:59:17 · 173 阅读 · 0 评论 -
【Java并发编程】之 AQS
AQS 介绍AQS的全称为(AbstractQueuedSynchronizer),这个类在java.util.concurrent.locks包下面。AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用广泛的大量的同步器,比如我们提到的ReentrantLock,Semaphore,其他的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。当然,我们自己也能利用AQS非常轻松容易地构造出符合我们自己需求的.原创 2020-07-05 16:47:06 · 1196 阅读 · 0 评论 -
【Java并发编程】之 Atomic 原子类
介绍一下Atomic 原子类Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程干扰。所以,所谓原子类说简单点就是具有原子/原子操作特征的类。并发包 java.util.concurrent 的原子类都存放在java.util.concurrent.atomic下.JUC 包中的原子类是哪4类基本类型使用原子的方式.原创 2020-07-05 16:35:37 · 168 阅读 · 0 评论 -
【Java并发编程】之 synchronized 关键字
说一说自己对于 synchronized 关键字的了解synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。另外,在 Java 早期版本中,synchronized属于重量级锁,效率低下,因为监视器锁(monitor)是依赖于底层的操作系统的 Mutex Lock 来实现的,Java 的线程是映射到操作系统的原生线程之上的。如果要挂起或者唤醒一个线程,都需要操作系统帮忙完成,而操作系统实现线.原创 2020-07-05 16:26:50 · 211 阅读 · 0 评论 -
【Java并发编程】之线程池
为什么要用线程池?池化技术相比大家已经屡见不鲜了,线程池、数据库连接池、Http 连接池等等都是对这个思想的应用。池化技术的思想主要是为了减少每次获取资源的消耗,提高对资源的利用率。线程池提供了一种限制和管理资源(包括执行一个任务)。每个线程池还维护一些基本统计信息,例如已完成任务的数量。这里借用《Java 并发编程的艺术》提到的来说一下使用线程池的好处:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。.原创 2020-07-05 15:30:28 · 282 阅读 · 0 评论 -
【Java并发编程】之ThreadLocal
ThreadLocal简介通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢? JDK中提供的ThreadLocal类正是为了解决这样的问题。ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这也是ThreadLocal变量名的由来。他们可.原创 2020-07-05 14:49:52 · 236 阅读 · 0 评论 -
【Java并发编程】之 Volatile 关键字
本博客对 Volatile 关键字进行了讲解。原创 2020-07-05 11:15:20 · 204 阅读 · 0 评论 -
【Java并发编程】之乐观锁和悲观锁
小王呀,今天我们就来聊聊乐观锁和悲观锁吧,你先介绍一下它们两者的含义!好的!我先把乐观锁和悲观锁的含义贴出来吧!乐观锁总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使.原创 2020-07-05 09:56:22 · 219 阅读 · 0 评论 -
【Java集合】之同步容器
为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列等。最常见的同步容器就是Vector和Hashtable了,那么,同步容器的所有操作都是线程安全的吗?下面我们来一一分析这个问题。同步容器在Java中,同步容器主要包括2类:Vector、Stack、HashTableCollections类中提供的静态工厂方法创建的类我们以相对简单的Vecotr来举例,我们先来看下Vector中几个重要方法的源码:public synchroniz原创 2020-07-04 21:11:45 · 3047 阅读 · 0 评论 -
【Java集合】之 ArrayList 详解
小王,听说你对 ArrayList 很熟呀!今天我们就来聊一下它吧!(小 case 了,这种问题早就滚瓜烂熟了呀!放马过来吧!)好的,没问题,想了解什么都可以问!你先说一下 ArrayList 是一个什么东西?可以用来干嘛?ArrayList就是数组列表,主要用来装载数据,当我们装载的是基本类型的数据int,long,boolean,short,byte…的时候我们只能存储他们对应的包装类,它的主要底层实现是数组Object[] elementData。ArrayList底层是用数组实现的.原创 2020-07-04 20:48:26 · 1728 阅读 · 0 评论 -
【Java集合】之 ConcurrentHashMap
介绍了 ConcurrentHashMap 的并发原理原创 2020-07-04 19:11:06 · 454 阅读 · 0 评论 -
【Java集合】之 HashMap
小王,听说你对HashMap很熟悉呀,可以说说它的数据结构和底层原理吗?好的,没问题!我们知道 HashMap 是我们非常常用的数据结构,由数组和链表组合构成的数据结构,数组里面每个地方都存了Key-Value这样的实例,在Java7叫Entry在Java8中叫Node,因为他本身所有的位置都为null,在put插入的时候会根据key的hash去计算一个index值。你提到的还有链表,为啥需要链表,链表又是怎么样子的呢?我们都知道数组长度是有限的,在有限的长度里面我们使用哈希,哈希本身就存在概率性,也原创 2020-07-02 23:15:28 · 618 阅读 · 0 评论 -
【Java基础】之 JSR 介绍
JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。Web Service技术 Java Date与Time API ( JSR 310) Java API for RESTful Web Services (JAX-RS) 1.1 (JSR 311原创 2020-06-24 08:23:50 · 1504 阅读 · 0 评论