
java
文章平均质量分 64
小楼夜听雨dayrain
只要静下心来,世界上没有学不会的知识
展开
-
Java相对路径与类路径详解
相对的是工作目录# 相对的是class文件所在的根目录# 相对的是ClassPathDemo.class所在的目录# 相对的是class文件所在的根目录,并且一定不能加斜杠。原创 2022-10-07 20:57:10 · 13368 阅读 · 5 评论 -
Java AtomicInteger类的实现细节
Java AtomicInteger的基本原理以及使用场景原创 2022-07-14 20:58:51 · 451 阅读 · 0 评论 -
用Java Socket 捕捉http1.1的长连接
今天在运行一个demo的时候,遇到了一些问题,debug后发现与http的长连接有关。故改造了下代码,尝试捕捉”长连接“。demo来自于 《How Tomcat Works》原代码Requestpublic class Request { private InputStream in; private String uri; public Request(InputStream inputStream) { this.in = inpu.原创 2021-07-20 14:09:20 · 381 阅读 · 0 评论 -
Java Socket 长连接互发消息时发生的阻塞问题
想实现一个功能,客户端发送一个消息,服务器接收到消息后回复客户端。写好后发现并没有像预期的那样运作,一运行就阻塞,经过一番排查发现了问题。问题分析原来的代码如下:服务端:public class ServerProDemo { public static void main(String[] args) throws IOException { ServerSocket serverSocket = new ServerSocket(8081);原创 2021-04-17 14:32:29 · 2164 阅读 · 0 评论 -
用Java原生Socket(BIO)做一个聊天室 实现单聊和群聊(附完整源码)
目录思路源码分析目录结构消息体服务端客户端分析源码地址思路要实现单聊和群聊需要考虑哪些方面?1、需要有客户端和服务端,客户端给用户提供发送消息、接收消息的途径。服务端用于接受客户端的连接,并进行消息接收、消息处理和消息转发。2、需要统一消息的格式,我这里仅仅是定义一个Message对象,通过type字段区分消息的类型。如果做的精细点,可以考虑自己设计一个基于tcp的通讯协议,具体思路可以看我上一篇博客的方案二。3、单聊:服务器把收到的消息转发给目.原创 2021-04-19 16:05:22 · 1251 阅读 · 0 评论 -
用Java原生Socket解析HTTP的请求头
想用Java原生的Socket捕捉一下HTTP报文,下面是测试代码。public class HttpServer { public static void main(String[] args){ ServerSocket serverSocket = null; Socket accept = null; InputStream inputStream = null; try { serverSoc原创 2021-08-20 14:05:42 · 1500 阅读 · 1 评论 -
Java自带的Http Server如何设置返回值的类型(content-type)
以返回Json格式的数据为例:首先我们要自己写一个请求的处理器,需要实现HttpHandler接口,并重写handle方法。handle方法会获得一个HttpExchange,通过exchange可以设置返回值内容与长度private void response(HttpExchange exchange, String jsonBody) { try { byte[] bytes = jsonBody.getBytes(StandardChars.原创 2021-11-17 13:57:05 · 3683 阅读 · 0 评论 -
[jdk源码阅读]Java HashMap的设计思想
HashMap的作用Map是一种数据结构,用于存放Key-Value形式的数据。HashMap是一种依赖Hash来实现数据检索的Map,借助它我们能够以接近O(1)的时间复杂度快速存取数据,效率极高。HashMap工作中用到的非常多,之前也有看过源码,不过没有好好总结一下,今天以博客的方式做一个记录。HashMap的基本结构试想一下,如果让我们来设计HashMap,该怎么设计?1、首先数据的形式是Key-Value的形式,需要用一个类绑定其关系,暂定这个类为Node。Node{原创 2022-02-20 17:51:36 · 780 阅读 · 1 评论 -
Java中什么情况下需要重写hashCode()和equals()
重写hashCode()与equals()的必要性只有在使用HashMap、HashSet等数据结构时,并且存储的对象是我们自定义的对象时,才需要重写。基本类型的包装类以及String已经有了默认实现。例如Integer类 public static int hashCode(int value) { return value; }以及String类 public int hashCode() { int h = hash;原创 2021-12-31 11:19:22 · 2377 阅读 · 0 评论 -
Java中的协变与逆变、泛型上下边界(extends、super)
目录协变数组Java泛型普通泛型通配符上边界extends:协变下边界super:逆变使用场合协变与逆变是一个宽泛的概念,并不只存在于Java。以经典的Animal、Cat为例class Animal{ @Override public String toString() { return "animal"; }}class Cat extends Animal{ @Override public St.原创 2021-08-31 10:57:20 · 1294 阅读 · 8 评论 -
@SuppressWarnings注解常见用法
使用场合@SuppressWarnings注解,主要用于抑制编译器报出的warning信息。比如在idea中,如果某个方法的返回值没有被使用,idea在语法检查时,会把这个方法标记为阴影状态,鼠标悬停后会显示对应的原因。如果此时我觉得这个返回值是必要的,只是暂时还没用到,就可以加一个@SuppressWarnings注解,抑制警告信息。当然,不是每时每刻都需要解决warning。一般会在提交代码前做一个检查,例如用idea的gui提交到git仓库时,默认会对我们的修改做一个检查,如.原创 2021-08-23 14:28:47 · 3313 阅读 · 0 评论 -
Java8 内置函数式接口总结
目录函数式 (Function)断言式 (Predicate)生产式 (Supplier)消费式 (Consumer)测试类Java8在新增了Lambda表达式支持的同时,也提供了很多函数式接口。所以当某个类需要传入比较简单的策略实现时,我们可以直接使用这些内置的函数式接口。内置函数式接口分四种类型函数式 (Function) —— 有入参,也有返回值 断言式 (Predicate) —— 有入参,且返回值为布尔型 生产式 ...原创 2021-07-09 12:35:42 · 305 阅读 · 0 评论 -
Java8 list与map互转
目录取出对象的某个属性list转map(无重复key)list转map(有重复key)list转setmap的value转listmap的key转list测试数据@Data@AllArgsConstructor@NoArgsConstructorpublic class Cell { /** 仓位编号 **/ private String cellNo; /** 仓位名称 **/ private String cellName;原创 2021-07-09 11:20:56 · 1792 阅读 · 0 评论 -
【jdk源码阅读】第三篇:StringBuffer、StringBuilder源码分析
String虽然是线程安全的,但是在某些场合的表现不尽如人意,上篇文章也分析了,用final修饰的char数组具有不可变性,一旦创建便不能修改。宏观上的字符串截取、拼接等修改操作,都是通过创建新的对象实现的,涉及大量的数组拷贝,性能自然不会太好。因此,就有了StringBuffer和StringBuilder。。。继承体系StringBuilder与StringBuffer处于同一层级,就不重复贴图了。CharSequence和Serializable都是老朋友了,我们看下Appen原创 2021-05-21 09:00:21 · 348 阅读 · 1 评论 -
深入理解Java中的wait() 方法
使用场景当某个线程获取到锁后,发现当前还不满足执行的条件,就可以调用对象锁的wait方法,进入等待状态。直到某个时刻,外在条件满足了,就可以由其他线程通过调用notify()或者notifyAll()方法,来唤醒此线程。这篇文章将侧重于讨论wait()方法对于线程状态的影响,以及被唤醒后线程的状态变更。条件只有已经获取锁的线程,才可以调用锁的wait方法,否则会抛出异常IllegalMonitorStateException。比如下面的代码,A获得了锁后,主动调用wait方法释放锁和原创 2021-05-20 15:42:55 · 37232 阅读 · 18 评论 -
【jdk源码阅读】第二篇:String源码分析
继承体系public final class String implements java.io.Serializable, Comparable<String>, CharSequence {String实现了三个接口,前两个接口的作用应该比较明显了(序列化、比较)。一个接口通常代表着一种抽象。CharSequence希望能够为有序的字符序列,提供标准的访问接口。public interface CharSequence { int len原创 2021-05-18 09:45:27 · 249 阅读 · 0 评论 -
【jdk源码阅读】第一篇:Integer源码分析
包装类型存在的必要性基本类型的作用比较单一,且不具有对象的性质。在Java这门存粹的面向对象语言里,对象才是第一公民。比如基本类型不支持泛型(第二种写法报错)基本类型有各自的默认值,但不能为null,比如int的默认值为0,但是0并不是在所有场合下都能代替null的。总之,包装类型的存在具有一定的必要性。装箱与拆箱箱:包装类型就像是个箱子,包裹着基本类型,赋予其更多的含义。装箱:基本类型转化为包装类型的过程。public class Main { public原创 2021-05-11 08:55:00 · 279 阅读 · 2 评论 -
Java实现 整型转字符串,位数不足时可以自动补0
代码public class StringUtil { /** * 整型转字符串并格式化 * @param minSize 最小大小 * @param separator 分隔符 * @param intNums 需要转化的整数 * @return 字符串 */ public static String formatInt(int minSize, String separator, int...intNums) {原创 2021-04-30 10:18:13 · 475 阅读 · 0 评论 -
Netty第一篇:入门
从原生的Java NIO api过度到netty,这个过程应该还是比较平滑的。毕竟原生api出了名的难用,据说还有bug。下面是学习netty过程中的一些代码和笔记,大部分代码都来自于官方文档。官网文档地址https://netty.io/wiki/user-guide-for-4.x.htmlnetty依赖 <!-- netty --> <dependency> <groupId>io.nett原创 2021-04-29 16:39:45 · 126 阅读 · 0 评论 -
java nio Buffer基本用法
继承体系如下:Buffer虽然是基类,但并没有定义数据的容器,仅仅定义了几个用来做标志的变量。 private int mark = -1; private int position = 0; private int limit; private int capacity;先说下面几个吧capacity表示容器得大小,在ByteBuffer中对应数组的大小,一般需要人为指定,通常取值为1024或者1024的倍数。position表示当前所在的地方l原创 2021-04-28 20:13:16 · 199 阅读 · 0 评论 -
java nio 客户端断开连接后报错: ”远程主机强迫关闭了一个现有的连接。“
当客户端直接断开连接时,服务器端会报错如下:定位到出错的地方客户端在断开连接时,服务端会触发一个read事件。但是服务器不知道这个read事件是普通的read,还是代表客户端已经断开连接的read,所以在尝试读取的时候抛出了异常。为了保持服务端继续运行,我们不能直接抛出异常,而应该捕捉异常并就地处理。比如这么做: SocketChannel socketChannel = (SocketChannel) selectionKey.channel();原创 2021-04-27 09:52:24 · 1790 阅读 · 0 评论 -
java nio简单示例:实现客户端与服务器一问一答
运行效果开启多个客户端服务端效果:客户端效果:当一个客户端断开连接:代码因为代码中有注释,我就直接贴上来了服务端:package com.dayrain.server;import java.io.IOException;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.nio.ByteBuffer;import java.nio.channels.*原创 2021-04-27 09:39:13 · 576 阅读 · 0 评论 -
Java中双大括号写法的作用
如何给集合快速初始化呢?可能会用到下面这种写法。public class Main1 { public static void main(String[] args) { List<String> list = new ArrayList<String>() { { add("hello"); add("world"); } }原创 2021-04-20 18:45:40 · 2042 阅读 · 0 评论 -
基于Servlet、JSP的学生管理系统(附完整源码)
目录起因源码地址界面截图功能代码分析首页数据统计身份校验其他起因最近重温servlet,想到了大学时期用同一个“学生管理系统”水了几门课的课程设计,不免感慨万千。周末简单的写了个界面,建了几张表,做了一个小系统(试图找一找当年划水的感觉,可惜没找到)。写的比较简单,不过做个普通的课程设计应该够了,需要的自取。源码地址https://gitee.com/DayCloud/student-manage界面截图主界面管理员界面学生管理(管原创 2020-12-02 18:11:36 · 33364 阅读 · 100 评论 -
Servlet、Jsp路径问题汇总
目录环境常用变量Servlet相对路径绝对路径JSP相对路径绝对路径静态资源JSP跳转Servlet总结1、servlet跳转servlet2、servlet跳转到jsp3、jsp引用静态资源4、jsp跳转到servlet环境tomcat9servlet4.0jdk1.8新建一个Java Web项目,名称为PathTest。如果着急使用,可以直接跳过测试,看最后的总结即可。常用变量新建一个servlet, 路径配置为原创 2020-12-02 16:09:37 · 4441 阅读 · 0 评论 -
Java cglib动态代理的基本使用
之前写过一篇jdk代理的笔记:https://blog.youkuaiyun.com/qq_37855749/article/details/110195828今天补充cglib代理相关的一些笔记。问:动态代理与静态代理最大的区别是什么?答:代理类的创建时间不同。静态代理在编码时期,需要硬编码实现对应的静态代理类,随后进入编译阶段生成对应的字节码,不够灵活。动态代理是在运行的过程中,生成字节码文件,加载进内存,更加的灵活。那么jdk代理与cglib代理有什么区别呢?我们可以带着这个疑问,来写一个原创 2021-03-01 16:03:49 · 895 阅读 · 2 评论 -
Java8 Stream常用api总结(二)
接上一篇:https://blog.youkuaiyun.com/qq_37855749/article/details/113937502public class StreamLearn2 { private static List<Student> list; static { list = new ArrayList<>(); list.add(new Student(1, "小明", 18, 85L)); list.a原创 2021-02-22 15:06:30 · 85 阅读 · 0 评论 -
Java8 Stream常用api总结(一)
以学生对象为例,列举常见的一些使用场合,具体如下:public class StreamLearn { private static List<Student> list; static { list = new ArrayList<>(); list.add(new Student(1, "小明", 18, 85L)); list.add(new Student(2, "张三", 19, 81L));原创 2021-02-22 14:25:42 · 197 阅读 · 0 评论 -
Java代理的基本用法
目录什么是代理静态代理jdk动态代理入门提升为什么被代理类必须实现接口?问题什么是代理代理在生活中指的是什么?“有什么事请找我的律师谈”,这里的律师就充当着代理的作用。为了更好达表的我的观点,帮助我处理纠纷,我需要聘请更专业的律师来替我打官司。在程序原有功能的基础上,现在需要添加新的功能。在不改变原有类的情况下,我们可以创建一个代理类,来代替原有类出面,完成重要的任务。Spring框架中的AOP切面编程,正是用了代理技术。很多好用方便的框架,通..原创 2020-11-26 18:44:56 · 289 阅读 · 0 评论 -
Java反射的具体应用(实现对象属性拷贝功能)
什么是反射反射就是在程序运行的过程中,我们可以通过一个类的字节码对象(Class对象),剖析出这个类的一切细节,知道他有哪些属性、方法、构造函数,甚至还可以动态的实例化一个对象。Class对象是什么?Java在经过编译时,会生成字节码文件(.class文件)。例如,Student.java编译生成了Student.class。我们在用到这个类时,比如new一个Student(或者用到了它的静态方法),就会把Student.class加载到内存,读取他的信息,完成对象的实例化。在加载的字节原创 2020-11-25 20:39:29 · 1007 阅读 · 0 评论