JAVA 基础
介绍在java基础的知识和经验
chao09_01
working & enjoying
展开
-
Lombok使用总结
1原创 2022-02-07 22:50:52 · 276 阅读 · 0 评论 -
Alibaba Fastjson简介及使用
fastjson是阿里巴巴的开源JSON解析库,它可以解析JSON格式的字符串,支持将Java Bean序列化为JSON字符串,也可以从JSON字符串反序列化到JavaBean。其具有速度快及使用简单的优点。class UserGroup { private String name; private List<User> users = new ArrayList<User>(); public String getNa...原创 2021-07-31 13:24:43 · 4524 阅读 · 0 评论 -
Java调用shell命令涉及管道、重定向时不生效问题的解决方法
近日,因项目需求需要用java调用shell命令实现清理过时图片任务,发现代码生成出来的shell命令在linux系统后台直接执行,可以实现效果,但是,经过java代码运行,则达不到预期效果。经研究发现,因为该shell命令涉及了管道,这情况就有点不一样了,下面是针对Java调用shell命令涉及管道、重定向时不生效问题的解决方法,参考代码如下:public class Test{ ...原创 2019-11-23 12:36:07 · 1875 阅读 · 2 评论 -
equals()和hashcode()方法详解
一、简介java.lang.Object类中有非常重要的两个方法:public boolean equals(Object obj)public int hashCode()Object类是类继承结构的基础,所以是每一个类的父类。所有的对象,包括数组,都实现了在Object类中定义的方法。Object类中equals方法的定义如下:public boolean equ...原创 2019-11-10 17:07:26 · 162 阅读 · 0 评论 -
Java类的初始化顺序
对于静态变量、静态初始化块、变量、初始化块、构造器,它们的初始化顺序依次是(静态变量、静态初始化块)>(变量、初始化块)>构造器。初始化顺序图示:测试代码如下:package com.trs.oop; /** * 类的初始化顺序 * 静态变量->静态初始化块->变量->初始化块->构造器 * @author xiayunan...转载 2019-11-03 22:28:20 · 117 阅读 · 0 评论 -
Optional类(FROM JDK8)的使用
Optional类自从jdk1.8才诞生,主要用于对可能是null值的处理。案例如下: public static void main(String[] args) { // 其value值为null Optional optcar = Optional.empty(); // 取出括号里的值,null值抛出NPE异常 ...原创 2019-10-15 23:56:20 · 400 阅读 · 0 评论 -
多线程中实例变量的共享与非共享
自定义线程类中的实例变量对其他线程有共享和非共享之分,这在多线程之间进行交互时是很重要的一个技术点。1)共享变量实现线程类定义:public class Mythread extends Thread{ private int count=3; public void run(){ count--; System.out...原创 2019-05-03 12:50:09 · 1288 阅读 · 3 评论 -
详细分析JDK、JRE、JVM的关系
首先必须认识到JDK包含JRE,而JRE包含JVM,总的来说JDK是用于java程序的开发(支持编译),而jre则是只能运行class而没有编译的功能,Eclipse、IntelliJ IDEA等其他IDE有自己的编译器而不是用JDK bin目录中自带的,所以在安装时只需选中jre路径就ok了。下面从文件安装层次对上述总结进行分析:上面是jdk的安装目录,在目录下面有五个文件夹、一个s...原创 2019-02-24 11:39:44 · 167 阅读 · 0 评论 -
java设计模式--工厂模式
用途:定义一个用于创建对象的接口, 让子类决定实例化哪一个类。 Factory Method使一个类的 实例化延迟到其子类案例:假定现在有两个厨师,一个只会做中餐,另一个只会做西餐,餐品分为熟食和生食两类。顾客需要顾客需要根据自己的口味来选择对应的厨师并告知其需要熟食还是生食,厨师根据顾客的口味来进行烹制。以厨师为例,首先定义厨师和食物两个接口public interfa...原创 2019-02-17 18:12:34 · 163 阅读 · 0 评论 -
java设计模式(结构)--组合模式&装饰器模式
一、组合模式用途:将对象组合成树形结构以表示 “部分——整体” 的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。案例:在中文中,一句话是由词语组成的,而词语又由字组成;在英文中,句子由单词组成,而单词又由一个个字母组成。每个对象都可定义的它之前的或之后的内容。比如一个中文句子总是以句号结尾,一个英文单词之前通常是有空格的。这种结构可以形成了递归嵌套的结构,句子是...原创 2019-02-17 17:09:31 · 1820 阅读 · 2 评论 -
java设计模式(构建)--单例模式&抽象工厂模式
一、单例模式用途:保证一个类仅有一个实例, 并提供一个访问它的全局访问点。让类自身负责保存它的唯一实例。 这个类可以保证没有其他实例可以被创建(通过截取创建新对象的请求 ), 并且它可以提供一个访问该实例的方法。public class Singleton { private static volatile Singleton instance; private Sing...原创 2019-02-16 17:36:27 · 224 阅读 · 0 评论 -
多线程中停止线程的实现
停止多线程是在多线程开发时很重要的技术点,掌握此技术可以对线程的停止进行有效的处理。停止线程在java语言中并不像break语句那样干脆,需要些技巧性的处理。需要首先说明的是1)线程中调用interrupt()方法仅仅是在当前线程中打了个停止的标记,并不是真的停止线程。2)如何判断线程的状态是否是停止,主要包含以下两种方法:1、this.interrupted():测试当前线程是否...原创 2019-05-03 13:50:53 · 496 阅读 · 0 评论 -
volatile用法及原理
关键字volatile的主要作用是使变量在多个线程间可见。关键字volatile可以说是Java虚拟机提供的最轻量级的同步机制,当一个变量定义为volatile,它具有内存可见性以及禁止指令重排序两大特性,为了更好地了解volatile关键字,我们可以先看Java内存模型。1、java内存模型java中的堆内存用来存储对象实例,堆内存是被所有线程共享的运行时内存区域,因此它存在内存可见性的...原创 2019-05-07 22:40:02 · 279 阅读 · 0 评论 -
多线程环境下对象及变量的并发访问-synchronized关键字总结
一、线程安全与不安全非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的结果就是脏读,就是取到的数据其实是被更改过的。而线程安全就是已获得的实例变量的值是经过同步处理的,不会出现脏读现象。非线程安全问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得的结果也就是“线程安全”的。二、synchronized关键字synchroniz...原创 2019-06-14 00:09:22 · 336 阅读 · 0 评论 -
maven依赖冲突解决
情景再现:项目A依赖于项目B,项目B依赖于项目C(v1),项目A依赖于项目D,项目D依赖于项目E,项目E依赖于C(v2),1、A--->B---->C(v1) , 2、A------>D---->E----->C(v2)项目A隐形依赖了两个版本的C,那到底采用哪个版本呢?分析:依赖调解第一原则:路径优先,很明显,第一种路径深度是3,第...转载 2019-06-16 22:33:13 · 278 阅读 · 1 评论 -
深入理解Java线程池--ThreadPoolExecutor
线程池介绍在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。...转载 2019-07-13 23:22:04 · 266 阅读 · 0 评论 -
详解java自定义注解及其开发
java注解简介java中的常见注解主要包括以下两类:jdk自带注解和元注解(可实现自定义注解)jdk的自带注解@Override:告诉编译器我重写了接口方法 @Deprecated:告诉编译器这个方法过时了,不建议使用,Ide会在方法上划横线 @SuppressWarnings("deprecation"):关闭方法中出现的警告等等元注解元注解的作用就是注解其他注解,一...原创 2019-07-27 00:55:31 · 224 阅读 · 0 评论 -
java AOP使用及jdk动态代理原理
简介AOP(面向切面编程)可以说是OOP的补充和完善。它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个一个可重用模块,并将其命名为“Aspect”,及切面。所谓切面,简单说就是那些与业务无关,缺位业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性性和可维护性。AOP动态代理代码:pu...原创 2019-07-28 22:10:04 · 343 阅读 · 0 评论 -
HttpClient模拟http请求详解
一、HttpClient简介HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient最新版本是HttpClient 4.5.9。以下是官方网站上httpClient支持的功能Examples(部分)。二、HttpClient如何引入到...原创 2019-08-25 16:46:59 · 791 阅读 · 0 评论 -
java类加载与双亲委派模型
一、类的声明周期编写的Java代码需要经过编译器编译为class文件(从本地机器码转变为字节码的过程),class文件是一组以8位字节为基础的二进制流,这些二进制流分别以一定形式表示着魔数(用于标识是否是一个能被虚拟机接收的Class文件)、版本号、字段表、访问标识等内容。代码编译为class文件后,需要通过类加载器把class文件加载到虚拟机中才能运行和使用。类从被加载到内存到使用完成被卸载...转载 2018-12-06 10:29:36 · 177 阅读 · 0 评论 -
JVM垃圾回收总结
一、JVM垃圾回收GC (Garbage Collection)的基本原理:将内存中不再被使用的对象进行回收,GC中用于回收的方法称为收集器,由于GC需要消耗一些资源和时间,Java在对对象的生命周期特征进行分析后,按照新生代、旧生代的方式来对对象进行收集,以尽可能的缩短GC对应用造成的暂停(1)对新生代的对象的收集称为minor GC;(2)对旧生代的对象的收集称为Full GC(差...原创 2018-12-05 18:11:30 · 135 阅读 · 0 评论 -
浅谈AOP(面向切面编程)
面向切面编程(AOP是Aspect OrientedProgram的首字母缩写) ,我们知道,面向对象的特点是继承、多态和封装。而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配。实际上也就是说,让不同的类设计不同的方法。这样代码就分散到一个个的类中去了。这样做的好处是降低了代码的复杂程度,使类可重用。 但是人们也发现,在分散代码的同时,也增加了代码...原创 2018-06-30 17:49:43 · 165 阅读 · 0 评论 -
Java中instanceof和isInstance的具体区别
本文转载自:https://www.cnblogs.com/yueshangzuo/p/8549477.html在Think in Java泛型这一章遇到这个问题,一些博客模糊提到了isInstance是instanceof的动态实现,查阅文档参考SOF上的一些回答如下:obj.instanceof(class)表示对象obj是否是class类或其子类的对象一个对象是自身类的一个对象...转载 2018-03-29 11:03:04 · 3871 阅读 · 0 评论 -
java类初始化时机
Java类初始化时机:静态方法(构造器隐式是静态的)的首次引用非常数静态域的首次引用。从以下例子中可以看出:import java.util.*;class Initable { static final int staticFinal = 47; static final int staticFinal2 = ClassInitialization.rand...原创 2018-03-29 09:56:41 · 827 阅读 · 0 评论 -
java多态-重载与重写
一、多态 面向对象语言的三大特性之一的多态本质上是依赖于重写机制。由于final能够防止覆盖,所以可以有效地关闭动态绑定,生产更有效的代码。二、重载与重写的区别1、重载是一个编译期概念、重写是一个运行期间概念。2、重载遵循所谓“编译期绑定”,即在编译时根据参数变量的类型判断应该调用哪个方法。3、重写遵循所谓“运行期绑定”,即在运行的时候,根据引用变量所指向的实际对象...原创 2018-08-24 17:40:38 · 417 阅读 · 0 评论 -
java 加载dll文件
Dll有两类:Java所依赖的dll以及dll所依赖的dll。Java中加载dll的方式也有两种:(1)通过调用System.loadLibrary(String filename)(2)通过调用System.load(String filename)方法。其底层都是通过使用ClassLoader中的loadLibrary(Class fromClass, String name, b...原创 2018-08-23 19:54:47 · 6381 阅读 · 1 评论 -
java 泛型的使用
案例一:package org.hcm.intelligence.cms87.remote.bean;import java.util.List;import javax.ws.rs.Consumes;import javax.ws.rs.Produces;import org.codehaus.jackson.annotate.JsonIgnoreProperties;@Pro...原创 2018-07-03 17:27:16 · 114 阅读 · 0 评论 -
深入理解Java自动装箱拆箱机制(Autoboxing and unboxing)
本文转自:https://blog.csdn.net/u013309870/article/details/702299831.自动装箱与拆箱的定义装箱就是自动将基本数据类型转换为包装器类型;拆箱就是 自动将包装器类型转换为基本数据类型。Java中的数据类型分为两类:一类是基本数据类型,另一类是引用数据类型。如下图:由上可知Java中的基本数据类型有八种分别是:int(4字节) byte(1字节)...转载 2018-03-29 16:33:44 · 662 阅读 · 0 评论 -
JDK与JRE的作用与区别
JDK和JRE是Java开发和运行工具,其中JDK包含了JRE,但是JRE是可以独立安装的~它们在Java开发和运行的时候起到不同的作用~ 关于JDK和JRE,大家一定会记得,在安装JDK的时候需要分为俩个步骤:安装JDK和JRE,大家一般会一起安装,也建议大家分开装,因为这样更能帮助大家弄清它们的区别 JRE是Java Runtime Environment的缩写,是Java程序的运行环境。...转载 2018-06-30 18:45:49 · 281 阅读 · 0 评论 -
ArrayList add()方法后前面的数据被覆盖的问题
ArrayList<T> myList = new ArraList<T>(); for(.....) { T st = new T(); for(.....) { st = Math.random();; myList.add(st); } ...原创 2018-10-17 22:59:46 · 4865 阅读 · 1 评论 -
线程中断以及线程中断引发的那些问题,你值得了解(待删除)
什么是线程中断? 在我们的Java程序中其实有不止一条执行线程,只有当所有的线程都运行结束的时候,这个Java程序才算运行结束。官方的话给你描述一下:当所有的非守护线程运行结束时,或者其中一个线程调用了System.exit()方法时,这个Java程序才能运行结束。 线程中断的应用场景 我们先来举一个例子,比如我们现在在下载一个500多M的大片,我们点击...转载 2018-10-17 23:32:07 · 1124 阅读 · 0 评论 -
java list与Set、Map区别及适用场景总结
一、list与Set、Map区别及适用场景1、List,Set都是继承自Collection接口,Map则不是2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外li...转载 2018-12-05 11:24:30 · 324 阅读 · 1 评论 -
关于二叉树的22个常见问题
先上二叉树的数据结构:class TreeNode{ int val; //左孩子 TreeNode left; //右孩子 TreeNode right;}二叉树的题目普遍可以用递归和迭代的方式来解1. 求二叉树的最大深度int maxDeath(TreeNode node){ if(node==null){ ...转载 2018-11-08 16:11:49 · 929 阅读 · 0 评论 -
Synchronized用法及原理
一、Synchronized用法synchronized是Java提供的一个并发控制的关键字。主要有两种用法,分别是同步方法和同步代码块。也就是说,synchronized既可以修饰方法也可以修饰代码块。代码如下:/***@authorHollis18/08/04.*/publicclassSynchronizedDemo{//同步方法publ...原创 2018-11-13 20:57:45 · 228 阅读 · 0 评论 -
如何遍历集合或者Map
一、遍历集合import java.util.*;public class Test{ public static void main(String[] args) { List<String> list=new ArrayList<String>(); list.add("Hello"); list.add("World"); ...原创 2018-11-06 11:50:39 · 115 阅读 · 0 评论 -
关于String的内存地址与值的问题
下面是关于string的相关易错点,代码例子整理如下:1、==和equals()public class StringDemo3 { public static void main(String[] args) { String s1 = new String("hello"); String s2 = new String("hello"); ...原创 2018-11-06 11:04:39 · 4016 阅读 · 0 评论 -
深入理解java按值引用
在java中只有通过值调用,而不是通过引用调用。下面通过三个例子进行深入解析:案例一:public class CallByValue { private static int x=10; public static void updateValue(int value){ value = 3 * value; } public st...原创 2018-11-06 10:49:12 · 382 阅读 · 1 评论 -
java反射机制及用法
一、反射的定义 反射的核心是 JVM 在运行时才动态加载类或调用方法/访问属性,它不需要事先(写代码的时候或编译期)知道运行对象是谁。通过反射,我们可以在运行时获得程序或程序集中每一个类型的成员和成员的信息。程序中一般的对象的类型都是在编译期就确定下来的,而 Java 反射机制可以动态地创建对象并调用其属性,这样的对象的类型在编译期是未知的。所以我们可以通过反射机制直...原创 2018-10-08 17:07:50 · 206 阅读 · 0 评论 -
Java 泛型类型擦除
一、泛型的表示形式1)<T>或者<E,V>:尖括号 <> 中的 T、K、V 被称作是类型参数,另外,还可以使用E、S也可做类型参数、2)通配符<?>:通配符是为了指定泛型中类型范围,包含以下三种形式: 1、<?> 被称作无限定的通配符。 2、<? extends T> 被称作有上限的通配符。 3、&l...原创 2018-10-18 00:27:47 · 126 阅读 · 0 评论 -
Date、Calendar、XMLGregorianCalendar、String等类日期格式的转换
在java中,常见的表示日期的类主要有以下四种:Date、Calendar、XMLGregorianCalendar、String。现在对上述类的使用进行简单介绍:1、Date类:Date date=new Date(time);其中time参数(毫秒值)可以不传,表示获取当前时间该类的getTime()可以获取到一个long类型的毫秒值。2、Calendar类:该类是一个抽象类,不能通过new方...原创 2018-06-30 18:31:35 · 9939 阅读 · 0 评论