java
NJUdudu
这个作者很懒,什么都没留下…
展开
-
synchronized关键字
https://tech.meituan.com/2018/11/15/java-lock.htmlhttps://juejin.im/post/5ae6dc04f265da0ba351d3ffhttps://leejay.top/posts/Synchronized%E9%94%81%E8%AF%A6%E8%A7%A3/原创 2020-02-14 15:27:15 · 316 阅读 · 0 评论 -
happen-before原则和as-if-serial语义
一、as-if-serial as-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提供并行度),(单线程)程序的执行结果不能被改变。编译器,runtime和处理器都必须遵守as-if-serial语义。as-if-serial语义把单线程程序保护了起来,遵守as-if-serial语义的编译器,runtime和处理器共同为编写单线程程序的程序员创建了一个幻觉:单线程程序是按...原创 2020-01-21 16:09:44 · 731 阅读 · 0 评论 -
java中sleep和wait的区别
sleep()方法wait()方法 sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会; sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象...转载 2020-01-20 16:52:14 · 139 阅读 · 0 评论 -
volatile关键字
一、volatile的作用在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。我们先看具体看一下这三个概念:原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。可见性:可见性是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。有序性:即程序执行的顺序按照代码的先后顺序执行。通常情况...原创 2020-01-13 17:07:28 · 178 阅读 · 1 评论 -
单例双重锁的原因
class Singleton { private static volatile Singleton instance; private Singleton(){} public static Singleton getInstance() { if ( instance == null ) { synchronized (Sin...原创 2020-01-09 22:09:46 · 801 阅读 · 0 评论 -
PECS原则
Producer Extends Consumer Super如果参数化类型表示一个生产者,就使用<? extends T>;如果它表示一个消费者,就使用<? super T>在阅读阿里巴巴Java开发手册时看到这个原则,于是就学习了一番.个人认为这个原则重点的地方在于理解List<? extends Fruit>和List<? super Appl...原创 2019-10-29 11:39:37 · 1124 阅读 · 0 评论 -
zookeeper开启
zookeeper启动一定要使用root权限,否则无法启动原创 2019-07-22 20:24:44 · 87 阅读 · 0 评论 -
Java中各种BO、POJO类
BO(Business Object)业务对象主要作用是把业务逻辑封装为一个对象,这个对象可以包括一个或多个其他的对象。比如一份简历,有教育经历、工作经历、社会关系等。可以把教育经历对应一个 PO,工作经历对应一个 PO,社会关系对应一个 PO,然后建立一个对应建立的 BO来处理简历,每个 BO 包含这些 PO,这样就可以针对 BO 去处理业务逻辑。DAO(Data Access Object...转载 2019-08-25 11:28:10 · 7075 阅读 · 0 评论 -
Java中如何判断两个对象是否相等
原文:https://www.dutycode.com/post-140.html如何判断两个对象相等,这个问题实际上可以看做是如何对equals方法和hashcode方法的理解。从以下几个点来理解equals和hashCode方法:1、equals的作用及与==的区别。2、hashcode的作用及与equals的关系。1、equals的作用及与== 的区别。equals被用来判断两个...转载 2019-08-17 17:53:45 · 9669 阅读 · 0 评论 -
Mybaties拦截器原理
MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能。那么拦截器拦截MyBatis中的哪些内容呢?转载 2019-09-11 14:54:38 · 348 阅读 · 0 评论 -
设计模式之工厂模式
在面向对象编程中, 最通常的方法是一个new操作符产生一个对象实例,new操作符就是用来构造对象实例的。但是在一些情况下, new操作符直接生成对象会带来一些问题。举例来说, 许多类型对象的创造需要一系列的步骤: 你可能需要计算或取得对象的初始设置; 选择生成哪个子对象实例; 或在生成你需要的对象之前必须先生成一些辅助功能的对象。 在这些情况,新对象的建立就是一个 “过程”,不仅是一个操作,像一部...原创 2019-09-11 16:22:37 · 134 阅读 · 0 评论 -
ArrayList扩容原理
一、ArrayList扩容ArrayList底层使用数组实现,当达到容量上限时,数组会扩容,然后将原数组数据拷贝到扩容后的数组。ArrayList扩容测试: @org.junit.Test public void arrayListCapacityTest(){ ArrayList<String> objects = new ArrayList<&g...原创 2019-09-13 12:39:29 · 719 阅读 · 0 评论 -
Java高效代码
需要 Map 的主键和取值时,应该迭代 entrySet()当循环中只需要 Map 的主键时,迭代 keySet() 是正确的。但是,当需要主键和取值时,迭代 entrySet() 才是更高效的做法,比先迭代 keySet() 后再去 get 取值性能更佳。反例:Map<String, String> map = ...;for (String key : map.keySet...原创 2019-09-13 19:30:18 · 437 阅读 · 0 评论 -
Java源码分析:HashMap 1.8 相对于1.7区别
https://juejin.im/post/5aa5d8d26fb9a028d2079264转载 2019-09-18 17:42:38 · 170 阅读 · 0 评论 -
Java:JDK1.7和JDK1.8中HashMap扩容原理
一、扩容原理JDK1.8源码分析: final Node<K, V>[] resize() { Node<K, V>[] oldTab = table; //记住扩容前的数组长度和最大容量 int oldCap = (oldTab == null) ? 0 : oldTab.length; int ol...原创 2019-09-18 20:53:07 · 982 阅读 · 0 评论 -
GSON中JsonElement节点的toString()与getAsString()的区别
一、使用区别import com.google.gson.JsonElement;import com.google.gson.JsonObject;import com.google.gson.JsonPrimitive;public class GsonTest { public static void main(String[] args) { JsonE...原创 2019-09-29 21:31:56 · 3174 阅读 · 0 评论 -
Spring MVC自定义注解给返回值加状态信息
进行Java Web开发时,需要在controller层的返回值加上状态信息;{ "code": "200", "msg": "success", "roleInfo": { "roleId": 1, "roleCode": "ITManager", "roleName": "IT部门管理员", "enabl...原创 2019-10-10 20:34:56 · 755 阅读 · 0 评论 -
Java访问控制权限总结
一、为什么要访问控制 访问权限的控制常被称为是具体实现的隐藏。把数据和方法包装进类中,以及具体实现的隐藏,常被共同称作是封装。其结果是一种同时带有特征和行为的数据类型。 出于两个很重要的原因,访问权限控制将权限的边界划在了数据类型的内部。第一个原因是要设定客户端程序员可以使用和不可以使用的边界。可以在结构中建立自己的内部机制,而不必担心客户端程序员会偶尔地将内部机制当做是他们可使用的接口的...原创 2019-08-03 14:56:38 · 211 阅读 · 0 评论 -
Java8 Lambda表达式
一、什么是Lambda表达式Lambda表达式允许把函数作为一个方法的参数,使代码变得更加简洁紧凑。二、Lambda表达式语法表达式的语法:(parameters) -> expression//接收一个参数x,返回x的2倍值(x) -> x * 2//接收两个参数,返回它们的差值(x, y)-> x - y三、函数式接口函数式接口是仅指定一个抽象方法的...原创 2019-07-18 17:50:49 · 85 阅读 · 0 评论 -
文件夹拷贝
File类递归练习(拷贝)需求:3,从键盘接收两个文件夹路径,把其中一个文件夹中(包含内容)拷贝到另一个文件夹中public class demo2 { public static void main(String[] args) throws FileNotFoundException, IOException{ File srcFile = demo1.getDir(); Fil...原创 2018-11-19 16:04:05 · 204 阅读 · 0 评论 -
final关键字的几种用法
final关键字在java中,final的含义在不同的场景下有细微的差别,但总体上来说,它指的是“这是不可变的”。下面,我们来讲final的四种主要用法。1.修饰数据在编写程序时,我们经常需要说明一个数据是不可变的,我们成为常量。在java中,用final关键字修饰的变量,只能进行一次赋值操作,并且在生存期内不可以改变它的值。更重要的是,final会告诉编译器,这个数据是不会修改的,那么编译...转载 2018-11-25 13:55:20 · 178 阅读 · 0 评论 -
JDBC读取配置文件
代码:public class JDBCUtilsConfig { private static Connection con; private static String driverClass; private static String url; private static String userName; private static String password; ...原创 2018-11-29 15:29:14 · 861 阅读 · 0 评论 -
静态代码块、构造代码块和构造函数的执行顺序
静态代码块static{ 执行语句}在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。如果类中包含多个静态代码块,那么将按照&quot;先定义的代码先执行,后定义的代码后执行&quot;。注意:1 静态代码块不能存在于任何方法体内。2 静态代码块不能直接访问静态实例变量...原创 2018-11-27 13:25:11 · 1711 阅读 · 0 评论 -
request域中文乱码问题
一、乱码原因页面默认使用的是UTF-8的编码方式,服务器端默认使用 iso8859-1的编码方式二、解决方式1、表单是post方式提交时设置request的编码 request.setCharacterEncoding(&quot;UTF-8&quot;);2、表单是get/post方式提交时String username = request.getParameter(&quot;username&quot;);//乱...原创 2018-12-28 16:24:47 · 1771 阅读 · 1 评论 -
sql条件查询java实现
sql条件查询java实现public List&amp;lt;Product&amp;gt; searchByCondition(Condition condition) throws SQLException { QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource()); String sql = &quot;select * f...原创 2019-01-03 15:45:04 · 1400 阅读 · 0 评论 -
JAVA四大域对象总结
JAVA四大域对象总结根据有作用范围由小到大:page(当前jsp页面)------》page域指的是pageContext.request(一次请求)—》request域request HttpServletContextsession(一次会话)—》session域session HttpSessionapplication(当前web应用)—》application域指的是appl...原创 2019-01-03 20:36:04 · 4673 阅读 · 1 评论 -
JAVA监听器Listener
一、什么是监听器监听器用于监听web应用中某些对象、信息的创建、销毁、增加,修改,删除等动作的发生,然后作出相应的响应处理。当范围对象的状态发生变化的时候,服务器自动调用监听器对象中的方法。常用于统计在线人数和在线用户,系统加载时进行信息初始化,统计网站的访问量等等。监听器的相关概念:事件源:被监听的对象 ----- 三个域对象 request session servletConte...原创 2019-01-04 17:03:29 · 240 阅读 · 0 评论 -
动态代理机制
一、动态代理简介代理类在程序运行时创建的代理方式被成为动态代理。 静态代理的代理类是自己定义好的,在程序运行之前就已经编译完成。然而动态代理,代理类并不是在Java代码中定义的,而是在运行时根据我们在Java代码中的“指示”动态生成的。相比于静态代理, 动态代理的优势在于可以很方便的对代理类的函数进行统一的处理,而不用修改每个代理类中的方法。—— 字节码对象级别的代理对象二、动态代理的构成...原创 2019-01-10 16:43:34 · 325 阅读 · 0 评论 -
JAVA过滤器Filter
一、filter的简介filter是对客户端访问资源的过滤,符合条件放行,不符合条件不放行,并且可以对目标资源访问前后进行逻辑处理。二、filter快速入门编写一个过滤器的类实现Filter接口实现接口中尚未实现的方法(着重实现doFilter方法)在web.xml中进行配置(主要是配置要对哪些资源进行过滤)三、Filter的API详解1.filter生命周期及其与生命周期相关的...原创 2019-01-07 14:20:31 · 367 阅读 · 1 评论 -
策略设计模式
一、策略设计模式简介策略设计模式的主要思想就是针对一组算法,将每个算法封装到具有共同接口的独立的类中,从而使它们可以相互替换。策略模式的最大特点是使算法可以在不影响客户端的情况下发生变化,从而改变不同的功能。二、策略设计模式的组成抽象的策略略角色通常情况下是接口或者抽象类。具体策略角色继承抽象的策略角色,实现各自的具体的的算法和行为。环境角色内部持有抽象的策略角色的引用,接收客户端向环...原创 2019-01-24 17:54:00 · 176 阅读 · 0 评论 -
Java反射详解
一、反射概述1.1 什么是反射当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化。 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 要想解剖一个类,必须先要获取到该类的...原创 2019-04-18 15:58:26 · 118 阅读 · 0 评论 -
Java 8 中的 Streams API 详解
原文链接:Java 8 中的 Streams API 详解转载 2019-07-12 17:25:36 · 97 阅读 · 0 评论 -
子类重写方法不能抛出新的异常
主要是为了满足多态调用。子类和父类的关系是is-a。子类是一个父类,凡是使用父类的地方,也可以用子类代替。如果子类比父类多抛出异常,就破坏了这一原则。public class Parent { public void a() throws AException { }}public class Child extends Parent { public void a() throw...转载 2019-07-17 11:14:01 · 1280 阅读 · 0 评论 -
Java8新特性
Java8新特性主要包括以下:Lambda表达式把函数作为方法的参数;方法引用 提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。Stream API 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation...原创 2019-07-18 15:49:52 · 85 阅读 · 0 评论 -
多线程的线程间通信
一、两个线程间的通信1.什么时候需要通信多个线程并发执行时, 在默认情况下CPU是随机切换线程的如果我们希望他们有规律的执行, 就可以使用通信, 例如每个线程执行一次打印2.怎么通信如果希望线程等待, 就调用wait()如果希望唤醒等待的线程, 就调用notify();这两个方法必须在同步代码中执行, 并且使用同步锁对象来调用public class Dem...原创 2018-11-21 15:26:47 · 281 阅读 · 0 评论