java基础 & 设计模式
文章平均质量分 76
设计模式光看实例是没有用的,反而会出现滥用的情况。学习设计模式是要真正理解里面的抽象思维。
c&0xff00
纸上学来终觉浅
展开
-
构造器、静态代码块、普通代码块、静态变量初始化顺序 - 总结
问题引入一直对这个问题有了解,也会涉及到类似的问题。刚好有空便测试一把,作为记录。测试代码新建Student与Person类,Student继承Person类。public class Person { private String name; private Integer age; private Boolean sex; private static final String STATIC_FINAL_PARAM = getStaticFinalParam()原创 2021-03-09 19:44:39 · 340 阅读 · 2 评论 -
SimpleDateFormat非线程安全解析
介绍SimpleDateFormat是JDK提供的rt包下的一个时间格式转换的类,它的全类名是:java.text.SimpleDateFormat。从该类的注释中,我们可以了解到:1、可以将date转为text格式2、可以将text转为date格式3、可以针对不同的时区进行转换4、允许你采用自定义的时间patter。(可以使用applyPattern方法来修改转换格式)他自己提供了一部分字母的含义,同时保留了’A’ to 'Z’和 ‘a’ to 'z’所有没有定义的字母,已提供的如下:原创 2021-03-03 12:32:42 · 382 阅读 · 1 评论 -
JDK1.8之前,HashMap#get操作死循环问题剖析
JDK1.8之前,HashMap#get操作死循环问题剖析写在前面问题原因1、头插法:2、在并发环境下使用非线程安全的类具体成环的情况分析问题答疑写在前面1、HashMap本身是线程不安全的(不管哪个jdk版本),所以请不要在并发访问的场景下直接使用HashMap。2、如果在并发访问的场景下,建议采用concurrentHashMap。问题原因1、头插法:我们知道,在jdk1.8之前,hashMap的put操作,或扩容操作,针对hash冲突时采用的是拉链法(将冲突的对象以链表的形式串联起来),新原创 2020-12-23 15:15:43 · 3245 阅读 · 6 评论 -
@Value注解注入List、Set、Map数据结构
百因必有果我今天要讲的配置注入时基于*.properties文件的,yaml格式可能有点区别。借助@Value注解、SPEL表达式实现,请看一下示例:List @Value("#{'${list.type}'.split(',')}") private List<String> listType; list.type=1,2,3,4Set @Value("#{'${spring.redis.cluster.nodes}'.split(',')}") p原创 2020-12-17 16:20:44 · 6388 阅读 · 0 评论 -
Java自定义注解实现接口报文模拟
实现报文模拟1、报文模拟可以采用调用第三方模拟平台实现,整一个模拟集成平台。2、本地创建一个代理,如fiddler等3、本地采用自定义注解开发一个报文模拟代码定义Mock注解:import java.lang.annotation.*;@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Mock { /** * @Descr原创 2020-11-12 16:32:30 · 854 阅读 · 0 评论 -
JAVA异常体系
JAVA异常体系Error和Exception的区别:Error:程序无法处理的系统错误Exception:程序可以处理的异常,捕获后可能恢复我们主要讲Exception:Exception分类:RuntimeException:运行时异常,编译时是不可预知的。如NullPointerException、ClassCastException、IllegalArgumentException、IndexOutOfBoundsException、NumberFormatException非Runt原创 2020-09-25 13:36:15 · 178 阅读 · 0 评论 -
取模和取余详解
前言关于取模和取余的讲解,网上有很多误人的帖子,我也看了很多,感觉越看越懵,说什么的都有,最终还是得靠自己来证实!取模和取余的步骤:对A和B取模取余操作:A % BC = A / BR = A - C * B取模和取余的区别仅仅是在计算C的时候不同: 取余时:C 值向0靠近取整,比如:C = A / B = 5 / 3 = 1.666666 靠近0取整,则C取 1 ,则R = A - C * B = 2C = A / B = -7 / 2 = -3.5 ,靠近0取整,则C取-3,转载 2020-09-24 09:09:25 · 7388 阅读 · 3 评论 -
JAVA常见问题总结
JVM如何加载class文件jvm读取class文件到方法区,class文件包含常量,类定义等。JVM通过classLoader加载符合class格式的class文件到方法区,再通过执行引擎进行操作。什么是反射反射是jvm可以动态获取虚拟机类和对象,可以知道类中的成员和方法,可以调用对象的方法的技术。写一个反射的示例:public class ReflectionApplication { private static final Logger LOGGER = LoggerFactory.g原创 2020-09-17 22:29:08 · 263 阅读 · 0 评论 -
java 桥接方法
java泛型泛型是在jdk1.5时引入的,java泛型其实不能说是真正的泛型,因为它在JVM运行期是不存在泛型的。java泛型是在编译期做的,将泛型类型擦除,用到的时候又强制转换为需要的类型。看个例子,打印日志,日志内容是泛型:public class PrintLog<T> { public static final Logger log = LoggerFactory.getLogger(PrintLog.class); protected T logContent; pu原创 2020-09-10 09:41:05 · 410 阅读 · 0 评论 -
Java反射中getMethods()与getDeclaredMethod()区别
getMethods获取当前类和父类的所有公有方法(私有的不返回),数组形式返回 @CallerSensitive public Method[] getMethods() throws SecurityException { checkMemberAccess(Member.PUBLIC, Reflection.getCallerClass(), true); return copyMethods(privateGetPublicMethods());原创 2020-09-10 08:46:42 · 1254 阅读 · 0 评论 -
反射调用重载方法(由入参决定还是获取方法时决定)
反射反射可以在运行时动态获取类与类成员的定义,以及读取方法。不管类中字段方法如何变动,我们都可以以相同的规则来读取。因此,几乎所有的ORM(对象关系映射)、对象映射、MVC 框架都使用了反射。也是事件委托模式中实现的基础。当反射遇上重载定义重载方法,名字都为age,参数一个为Integer,一个为intpublic class ReflectionApplication { private static final Logger LOGGER = LoggerFactory.getLogger(R原创 2020-09-09 10:14:53 · 2466 阅读 · 0 评论 -
Logback.xml配置文件(过滤器、重复记录日志问题)
日志重复打印问题logback.xml<?xml version="1.0" encoding="UTF-8" ?><configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>[%-5p][%d{yyyy/MM/dd HH:mm:ss}][%t] %logger - %m%n<原创 2020-09-06 20:54:54 · 2589 阅读 · 1 评论 -
当线程池中线程出现异常会发生什么
线程遇到未处理的异常就结束了这个好理解,当线程出现未捕获异常的时候就执行不下去了,留给它的就是垃圾回收了。当线程池中线程频繁出现未捕获异常当线程池中线程频繁出现未捕获的异常,那线程的复用率就大大降低了,需要不断地创建新线程。做个实验:public class ThreadExecutor { private ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 60, TimeUnit.SECONDS,原创 2020-09-06 15:51:41 · 2829 阅读 · 0 评论 -
try-with-resources前世今生
try-with-resourcestry-with-resources是1.7新加入的语法糖。针对一些流资源的关闭。只要流资源实现了AutoCloseable接口,就可以通过try-with-resources模式进行自动关闭。异常屏蔽现象一个方法只能抛出一个异常,但finally语句块即使在try块出现异常时也会执行,导致finally块中异常将try块中异常覆盖。如: @Test public void test() throws Exception { Connection conn原创 2020-09-04 16:07:30 · 195 阅读 · 0 评论 -
HashSet与TreeSet的contains方法解读
Set与Map的关系1、看下HashSet的add方法: // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null; }它的put调用了map的put方法,其实Set和原创 2020-09-04 08:35:23 · 1031 阅读 · 0 评论 -
mkdir与mkdirs的区别
项目中需要在代码中读取或创建文件保存路径,用到了mkdir,查看还有个mkdirs方法,这里记录一下两者的区别。1、关于两者的说明如下:boolean mkdir() : 创建此抽象路径名指定的目录。boolean mkdirs() : 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。2、结合自己的理解及具体实践如下: mkdir():只能创建一层目录,如: 1 2 File file =newFile("e:/test"...转载 2020-08-14 17:03:15 · 878 阅读 · 0 评论 -
Java 字符串常量存放在堆内存还是JAVA方法区?
JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。JDK1.8开始,取消了Java方法区,取而代之的是位于直接内存的元空间(metaSpace)。已知:String A="abc";String B="abc";String C=new String("abc");String D=new String("abc"); 比较A==B是否相等? 比较C==D是否相等? 分析:我们知道基本数转载 2020-07-20 19:25:24 · 1700 阅读 · 2 评论 -
深入剖析Java中的装箱和拆箱
深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 若有不正之处,请谅解和批评指正,不胜感激。 请尊重作者劳动成果,转载请标明原文链接:一.什么是装箱?什么是拆箱? 在前面的文章中提到,J转载 2020-07-20 17:09:30 · 145 阅读 · 0 评论 -
集约型编程——你知道HashMap初始化大小应该怎么设置吗
集约型编程就是在考虑代码正确、保证效率的前提下,使用更少的内存,更少的cpu等资源。问题引入:我们来看下面一段代码,引入我们今天的话题: @Test public void generateParam() { HashMap<String, String> paramMap = new HashMap<>(3); paramMap.put("name...原创 2020-05-07 19:23:41 · 542 阅读 · 0 评论 -
RandomAccess接口有什么用?
RandomAccess用来当标记,是一种标记接口。用处是当要实现某些算法时,会判断当前类是否实现了RandomAccess接口,会选择不同的算法。接口RandomAccess中内容是空的,只是作为标记用。比如List下的ArrayList和LinkedList。其中ArrayList实现了RandomAccess。而LinkedList没有。我们可以利用instanceof来判断哪一个是...转载 2020-03-13 13:46:42 · 226 阅读 · 0 评论 -
java7特性 try后面括号的作用(能够自动关闭资源)
Java7新特性,支持使用try后面跟随()括号管理释放资源例如通常使用try代码块 1 try { 2 fis = new FileInputStream(source); 3 fos = new FileOutputStream(target); 4 5 byte[] buf = new byte[1024]; ...原创 2020-02-17 09:58:45 · 888 阅读 · 0 评论 -
ThreadLocal原理分析与使用场景
什么是ThreadLocal变量ThreadLoal 变量,线程局部变量,同一个 ThreadLocal 所包含的对象,在不同的 Thread 中有不同的副本。这里有几点需要注意:因为每个 Thread 内有自己的实例副本,且该副本只能由当前 Thread 使用。这是也是 ThreadLocal 命名的由来。 既然每个 Thread 有自己的实例副本,且其它 Thread 不可访问,那就...转载 2020-01-14 12:22:51 · 230 阅读 · 0 评论 -
关于getClass(),Object.class,getClassLoader的理解
1、对Class类的理解:Class类包含了类的信息,如构造方法、方法、属性,可用于反射。以下是所有方法2、获取Class类对象的几种方法:Test test = new Test();(1).test.getClass(); 在运行时确定,所以运行实例才是该类对象。super.getClass()不能获得父类的类对象,仍然是当前类对象。 获得父类类对象:te...转载 2019-12-12 16:00:47 · 337 阅读 · 0 评论 -
web.xml中的filter配置+spring filter配置中targetFilterLifecycle属性作用
我们平时写过滤器一般有一下两种,以日志过滤器为例: <!--第一种日志过滤器--> <filter> <filter-name>logFilter</filter-name> <filter-class>cn.com.common.filter.LogFilter</filter-...原创 2019-12-04 17:16:23 · 1197 阅读 · 0 评论 -
在元素的装载数量明确的时候HashMap的大小应该如何选择。
今天看到美团招聘给出了一道小题目,关于HashMap的性能问题。问题如下:java hashmap,如果确定只装载100个元素,new HashMap(?)多少是最佳的,why?要回答这个问题,首先得知道影响HashMap性能的参数有哪些。咱们翻翻JDK。在JDK6中是这么描述的:HashMap的实例有两个参数影响其性能:初始容量和加载因子。首先我们来看初始容量和加载因子的定义...转载 2019-12-03 13:33:22 · 241 阅读 · 0 评论 -
java中import作用
import与package机制相关,这里先从package入手,再讲述import以及static import的作用。packageC/C++ 的 #include会把所包含的内容在编译时添加到程序文件中,而java的import则不同。这里我们先了解一下Java 的 package 到底有何用处。package名称就像是我们的姓,而class名称就像是我们的名字 。packag...转载 2019-11-29 10:59:51 · 360 阅读 · 0 评论 -
Java中的钩子方法
钩子方法是啥钩子顾名思义就是用来挂东西的。那么要挂东西必须有个被挂的东西,要不就是铁环、要不就是墙的边沿。所以要能挂住东西必须要有个被勾住的铁环,要一个钩子。那么在java中也是同样的原理,你首先需要一个被挂在的东西,一个挂载的东西。钩子的实现方法是对于抽象方法或者接口中定义的方法的一个空实现,在实际中的应用,比如说有一个接口,这个接口里有7个方法,而你只想用其中一个方法,那么这时,你...转载 2019-11-14 09:51:42 · 1094 阅读 · 0 评论 -
Java中的clone方法-理解浅拷贝和深拷贝
结论:java的clone方法对对象中的对象是浅拷贝,要想进行深拷贝,需要重写clone方法。最近学到Java虚拟机的相关知识,更加能理解clone方法的机制了java中的我们常常需要复制的类型有三种:1:8种基本类型,如int,long,float等;2:复合数据类型(数组);3:对象变量。基本数据类型存放在栈中;而对象实例和数组都在堆上分配。对于基本数据类型我们不需...转载 2019-11-14 09:37:08 · 403 阅读 · 0 评论 -
关键字transient是干啥的
百度百科的解释:Java语言的关键字,变量修饰符,如果用transient声明一个实例变量,当对象存储时,它的值不需要维持。换句话来说就是,用transient关键字标记的成员变量不参与序列化过程。作用:Java的serialization提供了一种持久化对象实例的机制。当持久化对象时,可能有一个特殊的对象数据成员,我们不想用serialization机制...转载 2019-10-11 20:34:27 · 644 阅读 · 0 评论 -
java中的HashSet和TreeSet的区别,以及HashSet导致的内存泄漏详解
Set集合中的元素是无序的,不可重复的。这个接口下有两个常用集合的实现,HashSet和TreeSet。HashSetHashSet底层用的是哈希表,它把对象根据其哈希值存放到对应的区域里。由于这种特性,两个在不同区域的对象会被认为不相同的。所以如果对象要存放到Hash集合里面,则需要重写对象的hashCode方法,让相等的对象的hashCode的值也相等。TreeSetTree...转载 2019-09-23 21:25:17 · 201 阅读 · 0 评论 -
线程安全(上)--彻底搞懂volatile关键字
对于volatile这个关键字,相信很多朋友都听说过,甚至使用过,这个关键字虽然字面上理解起来比较简单,但是要用好起来却不是一件容易的事。这篇文章将从多个方面来讲解volatile,让你对它更加理解。计算机中为什么会出现线程不安全的问题volatile既然是与线程安全有关的问题,那我们先来了解一下计算机在处理数据的过程中为什么会出现线程不安全的问题。大家都知道,计算机在执行程序时,每条...转载 2019-09-17 23:05:31 · 95 阅读 · 0 评论 -
JAVA抽象类
抽象类的基本概念抽象方法,只声明而未实现的方法我们称为抽象方法,所有的抽象方法都需要用abstract关键字声明,包含抽象方法的类也需要使用abstract关键字声明,抽象类和普通类相比,区别在于抽象类带有抽象方法,抽象方法可以只声明,而不需要方法体。代码演示:package demo;public abstract class People{private String name;/...转载 2019-09-16 19:01:05 · 86 阅读 · 0 评论 -
为什么JAVA只有单继承
首先我们要明确一个事实,在Java语言中类只能单继承与某个类,却可以多集成接口。同时接口与接口之间可以多继承。为什么Java类只能单继承?“Java是一种简单的,面向对象的,分布式的,解释型的,健壮的,安全的,架构中立的,可移植的,高性能的,支持多线程的,动态语言。”以上这段话是James Gosling对于Java语言的定义。定义中提到Java的一个特性是简单。好,那接下来我们设...转载 2019-09-15 22:49:25 · 668 阅读 · 0 评论 -
Java中子类能继承父类的私有属性吗?
转载自:https://www.cnblogs.com/cbs-writing/p/7088450.html 前段时间去听老师讲课的时候,老师告诉我子类是可以继承父类所有的属性和方法的。当时我是极其疑惑的,因为之前学校考试时这个考点我记得很清楚:子类只能继承父类的非私有属性和方法。老师给我的解释是这样的——先看下面一段代码/** * 定义父类 * @author CBS...转载 2019-09-15 21:42:18 · 1955 阅读 · 5 评论 -
JAVA中 System.currentTimeMillis() 与 new Date().getTime() 与 Calendar.getInstance().getTimeInMillis()区别
其实System.currentTimeMillis() 与 new Date() 与 Calendar.getInstance().getTime()这三个方法得到的是同一个时间,唯一的区别就是他们被不同的包装器包装。原创 2019-07-15 17:15:38 · 5263 阅读 · 0 评论 -
break与continue的区别
总结: break为跳出当前循环,或跳出当前switch。continue是终止本次循环,开始下次以循环。例子1: @Test public void testBreak() { for (int i = 1; i < 2; i++) { for (int j = 1; j < 5; j++) { if(j==2)break; } ...原创 2019-03-29 14:09:07 · 137 阅读 · 0 评论 -
String、StringBuffer、StringBuilder的区别
使用时如何选择的问题:In a word:定义字符串常量用String,频繁修改字符串且无线程安全问题用StringBuilder,有线程安全问题就用StringBuffer。[A]在字符串内容不经常发生变化的业务场景优先使用String类。例如:常量声明、少量的字符串拼接操作等。如果有大量的字符串内容拼接,避免使用String与String之间的“+”操作,因为这样会产生大量无用的中间对...原创 2019-03-22 16:07:49 · 176 阅读 · 0 评论 -
通过@JsonProperty注解解析多级对象的解决方法
背景:接口对接时第三方接口返回的JSON报文中存在多层对象,如{\"name\":\"hello\",\"body\":{\"age\":\"12\",\"height\":\"33\"}},json中还嵌套着body对象解决方法:上示例代码package com.goods.evaluate.test;import com.fasterxml.j原创 2019-03-15 20:57:41 · 5703 阅读 · 0 评论 -
JPA基于注解的校验中无法保存不符合校验规则的对象的解决方案(基于注解的java bean分组校验)
背景:通过注解对bean进行校验比较方便,比起传统的if else判断能少些很多代码,下面进行介绍开发例子。如果您是来找解决方案的,请直接转到最后 -->导入jar包:<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-valida...原创 2019-03-11 10:40:12 · 718 阅读 · 0 评论 -
十大常见Java String问题
本文介绍Java中关于String最常见的10个问题:1. 字符串比较,使用 "==" 还是 equals() ?简单来说, "==" 判断两个引用的是不是同一个内存地址(同一个物理对象).而 equals 判断两个字符串的值是否相等.除非你想判断两个string引用是否同一个对象,否则应该总是使用 equals()方法.如果你了解 字符串的驻留 ( String Interning ) ...转载 2019-02-25 20:18:12 · 142 阅读 · 0 评论