
Java
文章平均质量分 78
makersy
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【JVM】垃圾回收
一些名词: Minor GC (新生代GC) Major GC (老年代GC) Full GC(总体GC) Mixed GC(G1垃圾收集器特有gc) 常见问题 如何判断对象是否死亡(两种方法)。 引用计数 可达性分析 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。 强引用是最传统的“引用”的定义,是指在程序代码之中普遍存在的引用赋值,即类似“Object obj=new Object()”这种引用关系。无论任何情况下,只要强引用关系还存在,垃圾原创 2022-02-25 12:59:35 · 465 阅读 · 0 评论 -
【JVM】类的加载
类的生命周期 主要有七步: 类加载过程 系统加载 Class 类型文件主要分3步:加载->连接->初始化。连接过程又可分为:验证->准备->解析。总体共5步。 加载 加载需要完成的操作 在加载类时,Java 虚拟机必须完成以下3件事情: 通过类的全名,获取类的二进制字节流 将二进制字节流所代表的静态存储结构转化为方法区内的运行时数据结构(Java 类模型) 创建 java.lang.Class 类的实例,表示该类型。作为方法区这个类的各种数据的访问入口 二进制流的获取 虚拟机规原创 2022-02-25 12:52:43 · 890 阅读 · 0 评论 -
dubbo布尔值序列化后没有is问题
dubbo布尔值序列化问题 今天遇到一个问题,dubbo接口里的某个response的bool字段,字段名里含有is,序列化后的值里is居然自动消失了。 这里随便举个例子: public class User implements Serializable{ private boolean isPayed; } 调用该dubbo接口之后,序列化出来的User中,本来的isPayed 变成了 payed。 因为dubbo用的是Gson解析,所以尝试加上注解 @SerializedName("isPa原创 2020-12-03 20:46:25 · 752 阅读 · 0 评论 -
Java数组转ArrayList的注意事项
今天做一道题目时,遇到了一个问题——将一个int[]数组转化成List<Integer>类型,好像是一个挺常见的场景。于是立刻写下: ArrayList<Integer> list = new ArrayList<>(Arrays.asList(array)); 结果就报错了: Line 22: error: incompatible types: Integer[] cannot be converted to int[] int[] temp原创 2020-07-28 21:15:58 · 1687 阅读 · 0 评论 -
idea下Gradle下载速度慢问题
将项目中build.gradle文件中 repositories { mavenCentral() } 修改为阿里源: allprojects { repositories { google() jcenter() maven{ url 'http://maven.aliyun.com/nexus/content/groups/pu...原创 2019-11-12 23:02:51 · 12580 阅读 · 1 评论 -
【Java】集合-LinkedList详解
前言 本篇主要记录Java集合类中LinkedList的用法、结构以及部分实现。 LinkedList简介 LinkedList是一个实现了List接口和Deque接口的双端链表。 它实现了的其他接口还有Cloneable, java.io.Serializable,另外他也继承了AbstractSequentialList抽象类。 LinkedList底层的链表结构使它支持高效的插入和删除操作...原创 2019-07-14 22:30:11 · 928 阅读 · 0 评论 -
【dp】构造回文
构造回文 题目 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串。如何删除才能使得回文串最长呢? 输出需要删除的字符个数。 输入描述: 输入数据有多组,每组包含一个字符串s,且保证:1<=s.length<=1000. 输出描述: 对于每组数据,输出一个整数,代表最少需要删除的字符个数。 输入例子1: abcda google 输出例子1: 2 2 题...原创 2019-06-08 10:17:54 · 243 阅读 · 0 评论 -
ThreadLocal的使用+源码分析
ThreadLocal介绍 ThreadLocal,意为线程的局部变量,是在线程本地存了一个变量的副本。只有当前线程可以访问。它的目的是为了在线程之间共享某个变量,而不会发生冲突。就好比有100个人需要填一张表,按照同步机制的做法就是保证这支笔同一时间只有一个人使用,而ThreadLocal则是采用另一种方式:每个人都发了一支笔。相比同步机制,这是一种“空间换时间”的做法。 在同步机制中,使用了s...原创 2019-05-17 16:59:49 · 476 阅读 · 0 评论 -
【Java】使用socket实现控制台多线程聊天室
刚学习了socket编程和多线程相关知识,为了巩固下知识,动手实现了一个基于BIO的socket+多线程的控制台聊天室。 github代码地址:传送门 功能介绍 首先启动server端,然后启动client端。任意一个client发送给server的消息都将会被转发给所有在线的client,实现了一个聊天室功能。 client发送exit指令可以下线,所有的client端,以及server端都会收...原创 2019-05-16 16:27:55 · 1278 阅读 · 0 评论 -
【Java】对象的序列化和克隆详解
前言 在学习源码的过程中,常常看到很多类都实现了Cloneable接口或是Serializable接口,如集合类。虽然知道他们的作用是对象序列化,但是具体的功能却还是一知半解,所以花了些时间去系统地了解了一下他们。 正文 克隆也经常被称为拷贝(copy),比如很多面试官都会问深拷贝和浅拷贝,就是深克隆和浅克隆。 序列化和克隆 序列化 - Serializable 定义:将实现了Serializab...原创 2019-05-20 23:20:48 · 3221 阅读 · 0 评论 -
【Java】synchronized及其实现原理
synchronized简介 并行程序开发的一大关注重点就是线程安全,而synchronized是实现线程安全最简单的一种方法。 关键字synchronized的作用是实现线程间的同步。他的工作是对同步的代码加锁,使得每一次只能有一个线程进入同步块,从而保证线程间的安全性。 除了用于线程同步、确保线程安全外,synchronized还可以保证线程间的可见性和有序性。从可见性的角度上讲,synchr...原创 2019-05-15 14:20:48 · 1807 阅读 · 0 评论 -
手写简易版Spring框架-1
前言 为了巩固学习Spring框架,我尝试通过手写spring,实现SpringMVC基本功能来学习Spring源码。 实现功能 这次先写了一个简易的框架,实现了最基本的IoC功能,以及springmvc中常用的注解,具体如下: @Controller @RequestMapping @RequestParam @Autowired @Bean 代码 内嵌服务器 采用了apache的embe...原创 2019-07-09 22:56:32 · 545 阅读 · 2 评论 -
手写简易版Spring框架-2
前言 Spring框架作为当前最流行的JavaEE框架之一,简化了代码,提升了性能。而在这其中最主要的技术就是依赖注入了。所谓依赖注入,就是创建被调用者的工作由spring来完成,然后将其注入调用者。 本篇主要介绍了依赖注入和控制反转,并分析了上一篇中,依赖注入的代码实现原理。 关于Bean Bean的特点: 生命周期较长 在整个虚拟机内可见 维护成本高,单例存在 Bean优势 运行期效率...原创 2019-07-09 22:58:19 · 377 阅读 · 0 评论 -
【Java】IO、NIO
前言 Java IO,即Java中的输入输出,可以用来数据的写入和读出。在整个Java.io包中最重要的就是5个类和一个接口。5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable。本文主要总结IO流、NIO相关知识。 IO流的分类 按照流的流向分,可以分为输入流和输出流 输入流: 只能从中读取数据,而不能向...原创 2019-07-13 23:14:44 · 256 阅读 · 0 评论 -
【Java】基于NIO的多人聊天室
前言 学习了NIO的基本原理及使用方法之后,开始尝试写一个NIO实现的聊天室,练习一下代码流程。 服务器端 服务器端主要负责接受各客户端的连接,接收客户端发来的信息,并且将其广播给所有已连接客户端。 /** * Created by makersy on 2019 */ /** * NIO服务器端 */ public class NioServer { /** * 启...原创 2019-07-14 00:11:47 · 429 阅读 · 1 评论 -
【Java】注解
介绍 注解(Annotation ),有标记、注释的意思,也被称为元数据,他为我们在代码中添加信息提供了一种形式化的方法,使我们可以在稍后某个时刻非常方便地使用这些数据。在 Java 中注解是一个很重要的知识点。 Java 注解是从 Java SE5 引入的。他可以提供用来完整描述程序所需的信息,为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且是供...原创 2019-07-06 21:15:05 · 161 阅读 · 0 评论 -
【Java】集合-ArrayList详解
ArrayList简介 ArrayList 的底层是数组队列,相当于动态数组。与 Java 中的数组相比,它的容量能动态增长。在添加大量元素前,应用程序可以使用ensureCapacity操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。 它继承于 AbstractList,实现了 List, RandomAccess, Cloneable, java.io.Seriali...原创 2019-07-11 22:36:54 · 595 阅读 · 0 评论 -
【Java】集合-HashMap详解
HashMap 简介 HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间。 底层数...原创 2019-07-18 22:31:10 · 275 阅读 · 0 评论 -
Java8新特性-Stream
前言 Stream API 旨在让编码更高效率、干净、简洁。 从迭代器到Stream 当使用 Stream 时,我们一般会通过三个阶段建立一个流水线: 创建一个 Stream; 进行一个或多个中间操作; 使用终止操作产生一个结果,Stream 就不会再被使用了。 案例1:统计 List 中的单词长度大于6的个数 /** * 案例1:统计 List 中的单词长度大于6的个数 */ ArrayL...原创 2019-07-17 22:57:20 · 210 阅读 · 0 评论 -
LRU算法的Java实现
LRU原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”。 实现方式 要实现LRU算法,有 2 种实现方式。 第一种,是使用Java中现成的API —— LinkedHashMap。它在HashMap的基础增加了按照访问顺序排序的功能,非常适合LRU的实现。 代码如下: /...原创 2019-08-14 21:31:19 · 464 阅读 · 0 评论 -
Java内存模型浅析
前言 作为一个初级Java程序员,常常会将JVM内存模型和Java内存模型(JMM)弄混。实际上,这两者是完全不同的。今天我来介绍一下Java内存模型。 正文 Java内存模型基础 线程间通信的方式 通信是指线程之间是以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。 在共享内存的并发模型中,线程之间共享程序的公共状态,通过写 - 读内存中的公共状态进行隐式通信...原创 2019-05-19 22:48:53 · 422 阅读 · 0 评论 -
【Java】Java8新特性 - Lambda表达式
介绍 Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。 Lambda表达式还增强了集合库。 Java SE 8添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util...原创 2019-05-06 23:24:23 · 243 阅读 · 0 评论 -
【Java】使用BlockingQueue实现生产者-消费者模式
简介 生产者-消费者模式是一个经典的多线程设计模式。在生产者-消费者模式中。通常有多个生产者线程和多个消费者模式,生产者线程负责提交用户请求,消费者线程负责具体处理生产者提交的任务。两者之间通过共享内存缓冲区进行通信。 生产者-消费者模式的核心组件是共享内存缓冲区,它的作用是生产者与消费者之间的通信桥梁,避免二者之间的直接通信,有效地降低了二者耦合性。生产者不需要知道消费者的存在,消费者也不需要知...原创 2019-05-14 13:22:25 · 2840 阅读 · 0 评论 -
LeetCode 0050 Pow(x,n)
题目 实现 pow(x, n) ,即计算 x 的 n 次幂函数。 示例 1: 输入: 2.00000, 10 输出: 1024.00000 示例 2: 输入: 2.10000, 3 输出: 9.26100 示例 3: 输入: 2.00000, -2 输出: 0.25000 解释: 2-2 = 1/22 = 1/4 = 0.25 说明: -100.0 < x < 100.0...原创 2018-12-23 22:51:24 · 117 阅读 · 0 评论 -
JSP FileUpload实现文件上传
文件上传的条件 表单必须是post提交方式 表单中必须有文件上传项,文件上传项必须有name属性和值 表单的enctype属性必须设置为multipart/form-data 文件上传基本操作 数据接收:通过使用fileupload jar包的Commo-FileUpload组件完成文件上传 基本步骤: 创建一个 磁盘文件项工厂 的对象 DiskFileItemFactory diskFil...原创 2018-12-17 21:08:01 · 992 阅读 · 0 评论 -
LeetCode 0109 有序链表转换二叉搜索树
题目 给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。 示例: 给定的有序链表: [-10, -3, 0, 5, 9], 一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / ...原创 2018-12-15 22:03:18 · 223 阅读 · 0 评论 -
Java Web之Servlet&JSP
请求转发和响应重定向 请求转发: 是服务器跳转,只产生一次请求 request.getRequestDispatcher(url).forward(request,response) 响应重定向: 是浏览器端跳转,会产生两次请求 地址栏会变成最后的url (处理完成第一个请求之后返回一个特殊的响应给浏览器由浏览器重新发起另一个请求到新的资源) response.sendRedirect(url...原创 2018-12-09 23:04:23 · 593 阅读 · 0 评论 -
Java并发之类型修饰符volatile
今天看Java并发时,看到了一个新的关键字volatile,觉得有必要记一下。 基础概念 先补充一下概念:Java 内存模型中的可见性、原子性和有序性。 可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉。通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须使用同步机制。 可见...原创 2018-12-07 15:49:33 · 456 阅读 · 0 评论 -
XML文档编写及XPath表达式
XML简介 XML是可扩展标记语言(Extensible Markup Language,XML)缩写,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。可以用于Java程序配置描述文件、保存产生的数据、网络间数据传输等。 XML语法&amp;结构 XML文档结构 第一行需是XML文档声明 有且只有一个根节点 书写规则与HT...原创 2018-12-06 22:40:40 · 1184 阅读 · 0 评论 -
eclipse建立web项目时忘了生成xml文件的解决办法
刚学web没多久,建立项目时忘了去勾选建立web.xml文件的选项。当我写了好多代码,接下来需要修改这个文件的时候才发现,我没有生成它…接下来在摸索中找到了解决办法。 <-- more --> 首先在创建的项目上右键,找到Java EE Tools,然后点击Generate Deployment Descriptor Stub,如下图(我的已经生成了所以是灰色)。完了之后会发现,web...原创 2018-12-13 22:14:49 · 945 阅读 · 1 评论 -
Java EL表达式和JSTL标签库
关于EL表达式 EL表达式全名为Expression Language,是一种为了在JSP中计算和输出Java对象的简单语言。 基本语法: ${expression} 以上语句中,expression为有效的表达式。该表达式可以和静态文本混合,还可以与其他表达式结合成为更大的表达式。 EL四个作用域对象 如果我们在jsp页面调用Servlet的数据信息时,不写这个范围,那么EL就会从在小到大的范...原创 2018-12-13 21:29:05 · 320 阅读 · 0 评论 -
LeetCode951 翻转二叉树
题目 我们可以为二叉树 T 定义一个翻转操作,如下所示:选择任意节点,然后交换它的左子树和右子树。 只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转等价于二叉树 Y。 编写一个判断两个二叉树是否是翻转等价的函数。这些树由根节点 root1 和 root2 给出。 示例: 输入:root1 = [1,2,3,4,5,6,null,null,null,7,8], root2...原创 2018-12-08 19:00:27 · 340 阅读 · 0 评论 -
七大排序的Java实现(插入+希尔+冒泡+快速+选择+堆+归并)
之前学习C语言时学过各类基础排序,现在用Java来再回顾一遍。这一篇主要是写一下规范的代码。 一、排序相关的基本概念 排序其实是一个相当大的概念,主要分为两类:内部排序和外部排序。而我们通常所说的各种排序算法其实指的是内部排序算法。内部排序是基于内存的,整个排序过程都是在内存中完成的,而外部排序指的是由于数据量太大,内存不能完全容纳,排序的时候需要借助外存才能完成(常常是某一部分已经计算过的数据...原创 2019-03-14 23:06:09 · 472 阅读 · 0 评论 -
Java设计模式梳理(持续更新)
概览 Java的设计模式大体上分为三大类,共23种: 创建型模式(5种):工厂方法模式,抽象工厂模式,单例模式,建造者模式,原型模式。 结构型模式(7种):适配器模式,装饰器模式,代理模式,外观模式,桥接模式,组合模式,享元模式。 行为型模式(11种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 设计模式遵循...原创 2019-03-24 22:34:49 · 162 阅读 · 0 评论 -
开发神器-Lombok插件
记录一个简化开发的插件 — Lombok。 使用这个插件,可以极大降低pojo开发的代码量。不用在代码中显示getter、setter、toString等方法。 具体使用流程是: 在idea或eclipse中安装lombok插件,没有这个插件就无法识别lombok注解 在依赖中添加lombok,我用的是maven就直接从官网copy了一份代码到dependencies里面。 愉快地使用lombo...原创 2019-04-15 21:27:47 · 398 阅读 · 0 评论 -
【Java】遍历目录下的所有文件
用Java遍历目录下的所有文件 递归调用 //递归调用 public static void getFilesList(String path){ List<File> fileList = new ArrayList<>(); File file = new File(path); if( file.exists() ){ File...原创 2019-04-05 12:52:57 · 749 阅读 · 0 评论 -
Java多线程知识点
进程和线程的区别 进程是资源分配的最小单元,线程是CPU调度的最小单元。 所有与进程相关的资源,都被记录在PCB(进程控制块)中 进程是抢占处理机的调度单位;线程属于某个进程,共享其资源 线程只由堆栈寄存器、程序计数器和TCB(线程控制块)组成 总结: 线程不能看做独立应用,而进程可以 进程有独立的地址空间,相互不影响,线程只是进程的不同执行路径 线程没有独立的地址空间,多进程的程序比多线程的程...原创 2019-03-24 11:13:11 · 1277 阅读 · 0 评论 -
剑指offer-数组中的逆序对
题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 输入描述 题目保证输入的数组中没有的相同的数字 数据范围: 对于%50的数据,size<=10^4 对于%75的数据,size<=10^5 对于%100的数据,size&l...原创 2019-04-04 15:48:28 · 199 阅读 · 0 评论 -
JVM整理
JVM问题 JVM三大性能调优参数 -Xms -Xmx -Xss 的含义 java -Xms128m -Xmx128m -Xss256k -jar -xxxx.jar -Xss:规定了每个线程虚拟机栈(堆栈)的大小 -Xms:堆的初始值 -Xmx:堆能达到的最大值 内存分配策略 静态存储:编译时确定每个数据目标在运行时的存储空间需求 栈式存储:数据区需求在编译期未知,运行时模块入口确定 ...原创 2019-03-23 12:01:53 · 115 阅读 · 0 评论 -
HashMap源码理解与分析
HashMap属于是Java的热门考点。综合我看过的这么多博客来看,80%的面试都会问到,所以就写一篇自己对HashMap的理解分析吧。自己总结过一遍,记忆才会更深刻。 概览 HashMap在Java8之前是数组+链表的形式,之后是数组+链表+红黑树的形式。Java8之前,如果有多个节点发生hash冲突,存放在同一个桶里,那么hashmap的性能会退化到O(n),而用了红黑树之后,会提高到O(lo...原创 2019-03-25 23:23:10 · 167 阅读 · 0 评论