
Java 基础
文章平均质量分 81
留兰香丶
但行好事,莫问前程
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深入理解 Java 泛型擦除机制
我们都知道 Java 中的泛型可以在编译期对类型检查,避免类型强制转化带来的问题,保证代码的健壮性。不同语言对泛型的支持也不一样,Java 中的泛型类型在编译期会擦除,下面一个例子可以证明这一点: public static void main(String[] args) throws Exception { List<String> list = new ArrayList<>(); list.add("abc"); Class&原创 2020-08-28 17:01:02 · 2988 阅读 · 0 评论 -
static 关键字静态导包
我们知道 Java 中的 static 关键字表示静态,可以用于修饰字段、方法、代码块、类(静态内部类)。但是除了这些作用外,还有一个就是静态导包。静态导包是 jdk1.5 提供的一种新的机制,使用方式为 import static packageName.className.* 或 import static packageName.className.methodName,其中 * 表示导类...原创 2018-09-30 11:12:57 · 1508 阅读 · 1 评论 -
Java 并发编程系列之闭锁(CountDownLatch)
在讲闭锁之前,我们先来思考一个问题:在多线程环境下,主线程打印一句话,如何保证这句话最后(其他线程全部执行完毕)打印?博主目前可以想到的实现方式有两种。一种是通过 join() 方法实现,另一种就是用闭锁。如果大家有好的解决办法,可以在下面留言,下面进入正题。一、什么是闭锁闭锁(CountDownLatch)是 java.util.concurrent 包下的一种同步工具类。闭锁可以用...原创 2018-09-14 17:57:16 · 2659 阅读 · 0 评论 -
Java 并发编程系列之带你了解多线程
早期的计算机不包含操作系统,它们从头到尾执行一个程序,这个程序可以访问计算机中的所有资源。在这种情况下,每次都只能运行一个程序,对于昂贵的计算机资源来说是一种严重的浪费。操作系统出现后,计算机可以运行多个程序,不同的程序在单独的进程中运行。操作系统负责为各个独立的进程分配各种资源。并且不同的进程间可以通过一些通信机制来交换数据,比如:套接字、信号处理器、共享内存、信号量等。一、了解多线程1....原创 2018-09-19 14:44:15 · 349 阅读 · 0 评论 -
String 对象内存分配策略
这个问题可以说是一个高频的面试题目,以前把这个问题弄懂了,最近突然想到这个问题,一时间竟然没有太好的思路了。所以花些时间整理一下其中的知识点。一、内存分配策略我们先来看一个题目(这个问题都快看吐了~),你知道正确的运行结果并给出解释吗。不知道也没关系,我会在下面给出具体的分析。 @Test public void test() { String s1 = &amp;quot;ab...原创 2018-08-23 18:19:42 · 2732 阅读 · 2 评论 -
Chrome 访问一次 Controller,请求却执行两次
写了一个 Spring Boot 整合 MyBatis Plus 的 demo,相应的配置了 SQL 性能分析插件。当所有代码都写好,访问控制器的时候,发现每发送一个请求,控制台都会输出两次同样的 SQL 分析日志。 没有配置任何拦截器,于是换了个浏览器访问,并没有出现这个问题,上网查了一下才知道是 Chrome 的 JSONView 插件搞的鬼。只要更改一下 JSONView ...原创 2018-08-22 17:26:56 · 6248 阅读 · 3 评论 -
AJAX 跨域详解
一、什么是 Ajax 跨域问题同源策略规定,AJAX 请求(XMLHttpRequest)只能发给同源的网址,否则就会出错。所谓的同源策略是指 3 个相同:协议相同、域名相同、端口相同。比如 http://www.example.com/index.html 这个网址,协议是http ,域名是 www.example.com,端口是默认的 80。如果你在这个网站上使用 AJAX 发送 ht...原创 2018-07-29 17:28:24 · 591 阅读 · 0 评论 -
Java 注解编程
一、注解介绍注解(Annotation) 是 jdk1.5 版本以后引入的一个新特性,注解可以说是类反射的延伸,在一些需要配置文件的应用中,可以使用注解替代配置文件,从而提高应用的灵活。比如 常见的 @Autowired,@Controller 等。下面是 Java 底层内置的几个注解@Override: 只适用于方法,表示重写父类中的方法@Deprecated: 表示某各类或方法...原创 2018-06-25 21:17:12 · 5604 阅读 · 2 评论 -
Java 网络编程
一开始学 Java 网络编程的时候,因为不懂 TCP/IP 协议,被搞得一头雾水。前段时间读了《计算机网络》,对 TCP/IP 协议有了新的认识,现在再来写一下。阅读前可参考博文:运输层协议概述:https://blog.csdn.net/codejas/article/details/80105292 UDP 介绍:https://blog.csdn.net/codejas/arti...原创 2018-05-24 21:38:36 · 305 阅读 · 0 评论 -
在 Java 中使用 JSON
一、JSON概述JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,与开发语言无关。 JSON 易于阅读和编写,同时也易于机器解析和生成,因此常用来在前后端进行数据交换。JSON 的数据结构 对象(object):一个对象包含一系列非排序的键/值对,一个对象以 { 开始,并以 } 结束。每个键/值对之间使用 : 分区。多个键值对之间通过 , 分...原创 2018-05-23 17:26:48 · 9801 阅读 · 0 评论 -
Maven依赖详解
一、依赖依赖是Maven 中最关键的部分,我们之所以在工程中使用Maven,就是因为它的依赖管理功能。如果我们想要在工程中引入某个jar 包,只需要在pom.xml 中引入其jar 包的坐标即可。比如引入log4j 的依赖: &lt;dependencies&gt; &lt;dependency&gt; &lt;groupId&gt;log4j...原创 2018-03-09 08:56:37 · 22558 阅读 · 11 评论 -
Servlet 编程基础
可参考博文 超文本传输协议HTTP。Servlet 概述Servlet(Server Applet)是Java Servlet 的简称,称为小服务程序或服务连接器,用Java 编写的服务器端程序,主要功能在于交互式地浏览和修改数据,生成动态Web 内容。从原理上讲,Servlet 可以响应任何类型的请求,但绝大多数情况下Servlet 只用来扩展基于HTTP 协议的Web 服务器。HT...原创 2018-01-09 20:47:09 · 689 阅读 · 0 评论 -
Session 的钝化与活化
(一)钝化当服务器正常关闭时,还存活着的session(在设置时间内没有销毁) 会随着服务器的关闭被以文件(“SESSIONS.ser”)的形式存储在tomcat 的work 目录下,这个过程叫做Session 的钝化。(二)活化当服务器再次正常开启时,服务器会找到之前的“SESSIONS.ser” 文件,从中恢复之前保存起来的Session 对象,这个过程叫做Session的活化。原创 2018-01-12 10:16:09 · 12362 阅读 · 10 评论 -
Java8 PriorityQueue 源码阅读
一、什么是 PriorityQueue这篇文章带大家去了解一个 jdk 中不常用的数据结构 PriorityQueue(优先队列),虽然在项目里用的不多,但是它本身的设计实现还是很值得大家看一看的。PriorityQueue 底层是一个用数组实现的完全二叉树,但它并不只是一个完全二叉树,在没有自定义比较器(自然排序)的情况下,更严格的来讲它是一个基于数组实现的小顶堆(父节点的元素值小于左右孩子...原创 2018-12-20 22:26:03 · 911 阅读 · 7 评论 -
Java8 HashMap 扩容机制与线程安全分析
如果大家有仔细阅读过 HashMap 的源码就会发现 HashMap 的哈希表初始化并不是在其构造函数中进行的,而是 resize() 方法。这篇文章不对 HashMap 中的树进行介绍。一、HashMap 四个构造函数这里把 HashMap 的四个构造函数全贴出来,主要是给大家一个参照。PS:并不是所有的构造函数都初始化了 threshold,但是所有的构造函数都初始化了加载因子,另外初...原创 2018-12-17 21:19:27 · 3622 阅读 · 0 评论 -
lombok @Builder 是如何实现的
lombok 可能大家都用过,有一个 @Builder 注解可以很方便的在对象初始化的时候填充属性值,不用大量的调用 setter 方法,代码更易于阅读与编写。不知道大家有没有想过 @Builder 注解内部是怎么实现的,前些天看 《Effective Java》 的时候刚好看到有一个例子,其实很简单,这里以一个例子分享下代码实现。定义 Builder 接口,用于 build 对象:publi...原创 2019-09-14 17:36:59 · 3897 阅读 · 0 评论 -
Java8 EnumSet 源码简单分析
一、EnumSet 概述EnumSet 是一个用于存储枚举类型的 set 集合,一般的 set 集合底层都是使用对应的 map 实现的,但 EnumSet 是个特例,它底层使用一个 long 类型的整数或者数组实现。下面我们先来看下它的使用方式:public class EnumSetTest { public static void main(String[] args) {...原创 2019-07-04 17:35:07 · 532 阅读 · 0 评论 -
jdk1.8 源码分析导图
以下总结全部基于 jdk1.8。非并发源码幕布地址:https://mubu.com/doc95LpcV0Umt原创 2019-05-20 15:32:02 · 908 阅读 · 0 评论 -
Java 为什么不支持创建泛型化数组
没事的时候在书中翻了下泛型相关的知识,注意到一个比较有意思的问题:Java 不能创建泛型化数组。比如像下面这样就是不允许的:// 创建一个泛型类public class Generic<T> {}// 测试类public class Test { public static void main(String[] args) { // 创建一个泛型化数...原创 2019-04-30 10:56:22 · 930 阅读 · 0 评论 -
Java8 EnumMap 源码分析
一、EnumMap 概述EnumMap 是一个用于存储 key 为枚举类型的 map,底层使用数组实现(K,V 双数组)。下面是其继承结构:public class EnumMap<K extends Enum<K>, V> extends AbstractMap<K, V> implements java.io.Serializable, Clon...原创 2019-05-02 17:26:13 · 913 阅读 · 0 评论 -
Java8 ThreadLocal 源码分析
一、ThreadLocal 简介在学习源码之前,有一个概念我们需要先明白:ThreadLocal 可以使多线程间数据读写隔离,因此 ThreadLocal 解决的是线程局部变量安全性问题,并不是多线程间共享变量安全性问题。ThreadLocal 在使用时必须先初始化 value,否则会报空指针异常,你可以通过 set 方法与重写 initialValue 方法两种方式初始化 value。下面...原创 2019-05-01 17:35:03 · 509 阅读 · 0 评论 -
Java8 PriorityBlockingQueue源码分析
在看这篇总结之前,建议大家先熟悉一下 PriorityQueue,这里主要介绍 PriorityBlockingQueue 一些特殊的性质,关于优先级队列的知识不作着重介绍,因为过程与 PriorityQueue 都是一致的。关于 PriorityQueue 的文章,你可以参考这里->点击前往~PriorityBlockingQueue 相关源码分析add 方法 public ...原创 2019-04-10 18:36:55 · 558 阅读 · 0 评论 -
Java8 IdentityHashMap 源码分析
在讲这个数据结构之前,我们先来看一段代码: public static void main(String[] args) { IdentityHashMap<String, Integer> map = new IdentityHashMap<>(); map.put("Hello " + "World", 1); m...原创 2019-03-20 20:20:01 · 859 阅读 · 0 评论 -
Java8 CountDownLatch 源码分析
一、CountDownLatch 概述1.1 什么是 CountDLatch闭锁(CountDownLatch)是 java.util.concurrent 包下的一种同步工具类。闭锁可以用来确保某些活动直到其他活动都完成后才执行。闭锁相当于一扇门:在闭锁到达结束状态之前,这扇门一直是关闭的,并且没有任何线程能通过,当达到结束状态时,这扇门会打开,并允许所有的线程通过。1.2 CountD...原创 2019-03-11 20:14:15 · 868 阅读 · 0 评论 -
Java8 ReentrantLock 源码分析
一、ReentrantLock 概述1.1 ReentrantLock 简介故名思义,ReentrantLock 意为可重入锁,那么什么是可重入锁呢?可重入意为一个持有锁的线程可以对资源重复加锁而不会阻塞。比如下面这样: public synchronized void f1() { f2(); } private synchronized void ...原创 2019-03-07 20:05:07 · 701 阅读 · 0 评论 -
Java8 CopyOnWriteArrayList 源码分析
一、CopyOnWriteArrayList 概述1.1 概念概述CopyOnWriteArrayList 是 juc 包下一个线程安全的并发容器,底层使用数组实现。CopyOnWrite 顾名思义是写时复制的意思,其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,会把内容 Copy 出去形成一个新的内容然后再进行修改,这是一种延时懒惰策略。假设往一个容器添加元素...原创 2019-02-15 19:47:26 · 599 阅读 · 0 评论 -
Java8 ArrayBlockingQueue 源码阅读
一、什么是 ArrayBlockingQueueArrayBlockingQueue 是 GUC(java.util.concurrent) 包下的一个线程安全的阻塞队列,底层使用数组实现。除了线程安全这个特性,ArrayBlockingQueue 还有其他的特点:当队列已满时,会阻塞后面添加元素 [put(E e)] 的线程,直到调用了移除元素的方法队列不满的情况下会唤醒前面添加元素的线...原创 2019-01-21 15:47:01 · 633 阅读 · 0 评论 -
Java8 Hashtable 源码阅读
一、Hashtable 概述Hashtable 底层基于数组与链表实现,通过 synchronized 关键字保证在多线程的环境下仍然可以正常使用。虽然在多线程环境下有了更好的替代者 ConcurrentHashMap,但是作为一个面试中高频的知识点,我们还是有必要了解一下其内部实现细节的。1.1 内部属性 // 内部数组 private transient Entry&amp;amp;amp;amp;amp;amp;lt...原创 2019-01-24 15:02:08 · 856 阅读 · 0 评论 -
Java8 LinkedHashMap 源码阅读
如果你对 HashMap 的源码有了解的话,只需要一图就能知道 LinkedHashMap 的原理了,但是具体的实现细节还是需要去读一下源码。一、LinkedHashMap 简介1.1 继承结构从继承结构上来讲 LinkedHashMap 继承自 HashMap,LinkedHashMap 中没有提供任何增删改查的方法,而是直接复用了父类 HashMap 中的方法。1.2 内部数据结构...原创 2018-12-31 16:30:43 · 772 阅读 · 0 评论 -
Servlet 监听器
可参考博文:Session 的钝化与活化(一)Servlet 中的作用域总结 趁着这个知识点顺便把Servlet 中的四大作用域也在这篇博文中总结一下。application域(ServletContext)作用范围:在整个Web 应用范围内共享数据 (所有用户)生命周期:当服务器启动,Web 应用被加载后创建ServletContext 对象,域产生,当被移出W原创 2018-01-12 17:07:15 · 731 阅读 · 0 评论 -
Servlet 过滤器
一、Filter 概述Filter 也称之为过滤器,它是Servlet 技术中很实用的一个知识点,Web 开发人员通过Filter 技术,对Web 服务器管理的所有Web 资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL 级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。Servlet API中提供...原创 2018-01-13 13:37:30 · 483 阅读 · 0 评论 -
Web service 介绍与简单应用
一、Web service 介绍1.1什么是Web service到目前为止对Web service 没有统一的定义,这里以一种更容易理解的方式解释。Web service 是一个平台独立的,低耦合的,自包含的、基于可编程的web 的应用程序,即是一种跨编程语言和操作系统平台的远程调用技术。Web service 技术, 能使得运行在不同机器上的不同应用无须借助附加的、专门的第三方软件...原创 2020-03-16 19:28:04 · 4144 阅读 · 0 评论 -
线程之间的协作
当我们使用线程来同时运行多个任务时,可以通过使用锁(互斥)来同步两个任务的行为,从而使得一个任务不会干涉另一个任务的资源。也就是说如果两个任务交替着进入某项共享资源,你可以使用互斥来使得此时此刻只有一个任务访问这项资源。有的时候我们并不是要使线程之间互斥,而是希望它们之间能够彼此协作,使得多个任务之间可以一起工作去解决问题。 当任务协作时,关键的问题就是这些任务之间的握手。为了实现这种握手,必须要原创 2017-12-13 10:39:00 · 434 阅读 · 0 评论 -
原子类
在了解原子类之前先来了解一下什么是可见性与原子操作。可见性在多核处理器中,如果多个线程对一个变量(假设)进行操作,但是这多个线程有可能被分配到多个处理器中运行,那么编译器会对代码进行优化,当线程要处理该变量时,多个处理器会将变量从主存复制一份分别存储在自己的片上存储器中,等到进行完操作后,再赋值回主存。也就是说多个线程在共享资源的时候操作的都是主存中的资源。 原子操作原子操作是不能被...原创 2017-12-12 11:12:00 · 1009 阅读 · 0 评论 -
Java 线程状态
线程状态: 一个线程可处于以下四种状态之一: 1. 新建(new):当线程被创建时,它只会短暂的处于这种状态。此时它已经分配了必需的系统资源,并执行了初始化。此刻线程已经有资格获得CPU 时间了,之后调度器会把这个线程转变为运行状态或阻塞状态。 2. 就绪(Runnable):在这种状态下,只要调度器把时间片分配给线程,线程就可以执行。也就是说,在任意时刻,线程可以运行也可以不运行。原创 2017-12-12 15:55:48 · 357 阅读 · 0 评论 -
Thread 中的run() 与start() 方法
将类声明为 Thread 的子类是创建线程的方式之一,如果我们想要在线程内定义任务那么就要重写Thread 中的run() 方法。start() 方法使我们定义的线程执行,我们已经将线程的任务定义在了run() 方法中为什么run() 方法不是执行线程的方法而是start() 方法呢?当时学线程的时候并没有多考虑这个问题,由于以前有一些误解,现在就写出来供自己与大家参考。 我定义了一个Th原创 2017-12-10 15:22:18 · 713 阅读 · 0 评论 -
Java 多态之“绑定”
写在前面: 在刚开始学习JavaSE 时,在学习多态这个章节时对下面几段程序输出的结果感觉到很诧异:public class Sub extends Super{ public int num = 1; public int getNum(){ return num; } public static void main(String[] arg原创 2017-11-26 09:37:10 · 455 阅读 · 0 评论 -
枚举(enum)类型
关键字enum 可以将一组具名的值的有限集合创建一种新的类型,而这些具名的值可以作为常规的程序使用。创建enum 时,编译器会为你生成一个相关的类,这个类继承自java.lang.Enum 。下面是一个例子演示了一些Enum 提供的一些功能。package com.jas.enumtest;enum Animal{CAT,DOG,SHEEP}public class EnumClass {原创 2017-12-03 15:46:17 · 632 阅读 · 0 评论 -
Java 并发时的 "互斥锁"机制
Java 提供了两种互斥锁用来解决在共享资源时存在的并发问题。一种方式是提供synchronized 关键字,当任务要执行被synchronized 关键字保护的代码片段的时候,它会检查所可用,然后获取锁,执行代码,释放锁;另一种方式是显式的使用Lock 对象,在Java SE5 中的java.util.concurrent.locks 类库中定义了这个对象,Lock 对象必须被显式的创建,锁定和原创 2017-12-11 16:48:48 · 3792 阅读 · 0 评论 -
比较String、StringBuffer和StringBuilder
String在Java 中一共提供了String、StringBuffer、StringBuilder 用来表示和操作字符串,对于字符串的处理我们经常在项目中可以使用的到。了解它们底层的实现可以帮我们正确的使用这三个类,当然作为面试的高频题目,如果面试的时候如果面到了这个题目我们也就不怕了(~ . ~。首先来讲String 类,可能很多人知道String 对象是内容不可变的,至于为什么是不...原创 2017-12-09 22:14:47 · 308 阅读 · 0 评论