java基础回顾
我就想起个通过的名字
这个作者很懒,什么都没留下…
展开
-
分析ThreadLocal
ThreadLocal是什么? ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关。ThreadLocal虽然提供了一种解决多线程环境下成员变量的问题,但是它并不是解决多线程共享变量的问题。那么ThreadLocal到底是什么呢? API是这样介绍它的:This class provides thread-...转载 2019-02-14 15:01:09 · 167 阅读 · 0 评论 -
BigDecimal 的那些坑事儿
最近查看rebate数据时,发现一个bug,主要现象是,当扣款支付宝的账号款项时,返回的是数字的金额为元,而数据库把金额存储为分,这中间要做元与分的转化,这个转化规则很简单,就是*100的,所以一开始代码很简单,如下。 Float f = Float.valueOf(s); f =f*100; Long result = f.longValue(); ...转载 2018-07-26 17:00:33 · 1136 阅读 · 0 评论 -
HashMap 和 HashTable 到底哪不同 ?
HashMap和HashTable有什么不同?在面试和被面试的过程中,我问过也被问过这个问题,也见过了不少回答,今天决定写一写自己心目中的理想答案。代码版本JDK每一版本都在改进。本文讨论的HashMap和HashTable基于JDK 1.7.0_67。源码见这里1. 时间HashTable产生于JDK 1.1,而HashMap产生于JDK 1.2。从时间的维度上来看,HashMap要比HashT...转载 2018-03-16 16:30:32 · 117 阅读 · 0 评论 -
透彻的掌握 Spring 中@transactional 的使用
事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。Spring 事务管理分为编码式和声明式的两种方式。编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。声明式事务有两种方式,一种是在配置文件(xml)中做相关的事务规则声明,另一种是基于@Tr原创 2018-01-19 09:42:51 · 202 阅读 · 0 评论 -
Spring @Transactional原理及使用
本文主要讨论Spring声明式事务中使用注解@Transactional的方式、原理及注意事项,主要包括以下内容:Spring @Transactional的配置使用;Spring @Transactional的传播行为和隔离级别;Spring @Transactional的工作原理;Spring @Transactional的注意事项;Spring @Transactional自我调用中的问题。原创 2018-01-19 09:41:55 · 428 阅读 · 0 评论 -
为什么JDK源码中,无限循环大多使用for(;;)而不是while(true)?
首先是先问是不是再问为什么系列。在JDK8u的jdk项目下做个很粗略的搜索: mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "for \\(\\s?;\\s?;" . | wc -l 369 mymbp:/Users/me/workspace/jdk8u/jdk/src $ egrep -nr "while \\(true"原创 2018-01-24 10:28:00 · 717 阅读 · 0 评论 -
谈谈java中的构造函数
谈谈java中的构造函数 本篇博文主要是为新手、对java语言感兴趣的人和那些没有系统学习过java基础知识的人进行一个总结,在文章中对构造函数进行了较为详细的说明和讨论,也包含了我个人对于java面向对象中构造函数的一些看法。希望走在java学习道路上的同行者可以有一个较为清晰的认知和理解。当然仅为个人观点,水平有限,不足之处,还请大家多多指出,互相交流学习。原创 2018-01-04 14:35:56 · 156 阅读 · 0 评论 -
源码解析:init-method、@PostConstruct、afterPropertiesSet孰先孰后
Spring 容器中的 Bean 是有生命周期的,Spring 允许在 Bean 在初始化完成后以及 Bean 销毁前执行特定的操作,常用的设定方式有以下三种: 通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;通过 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;在原创 2018-01-04 11:52:34 · 5415 阅读 · 1 评论 -
Java transient关键字使用小记
Java transient关键字使用小记 哎,虽然自己最熟的是Java,但很多Java基础知识都不知道,比如transient关键字以前都没用到过,所以不知道它的作用是什么,今天做笔试题时发现有一题是关于这个的,于是花个时间整理下transient关键字的使用,涨下姿势~~~好了,废话不多说,下面开始: 1. transient的作用及使用方法转载 2018-01-03 16:34:51 · 230 阅读 · 0 评论 -
Intellij IDEA自动生成serialVersionUID配置
完整操作流程:Setting->Editor->Inspections->Java->Serialization issues->Serializable class without ‘serialVersionUID’(选择勾上) 配置完成后,如果你的Class实现了Serializable接口,那么将光标停留在类名上,然后按Alt+Enter就会提示自动创...转载 2018-09-05 11:11:45 · 218 阅读 · 0 评论 -
Struts中private static final long serialVersionUID的作用
今天在看项目源码的时候发现struts的action里面有 private static final long serialVersionUID = -1672970955045193907L; 这样的一条语句。 中文搜索之后,全部都是 如果你修改了此类, 要修改此值。否则以前用老版本的类序列化的类恢复时会出错。为了在反序列化时,确保类版本的兼容性,最好在每个要序列化的类中加入...转载 2018-09-05 11:12:45 · 150 阅读 · 0 评论 -
【Java入门提高篇】Day25 史上最详细的HashMap红黑树解析
当当当当当当当,好久不见,最近又是换工作,又是换房子,忙的不可开交,断更了一小段时间,最重要的一篇迟迟出不来,每次都犹抱琵琶半遮面,想要把它用通俗易懂的方式进行说明,确实有一定的难度,可愁煞我也,但自己挖的坑,哭着也要把它补上。请允许我当一回标题党。 好了,言归正传,本篇主要内容便是介绍HashMap的男二号——TreeNode(男一号还是给Node吧,毕竟是TreeNode的爷爷,而且普通...转载 2018-12-01 13:34:26 · 185 阅读 · 0 评论 -
Java内存模型之总结
JMM规定了线程的工作内存和主内存的交互关系,以及线程之间的可见性和程序的执行顺序。一方面,要为程序员提供足够强的内存可见性保证;另一方面,对编译器和处理器的限制要尽可能地放松。JMM对程序员屏蔽了CPU以及OS内存的使用问题,能够使程序在不同的CPU和OS内存上都能够达到预期的效果。 Java采用内存共享的模式来实现线程之间的通信。编译器和处理器可以对程序进行重排序优化处理,但是需要遵守一些规...转载 2019-02-14 14:36:46 · 137 阅读 · 0 评论 -
Java内存模型之分析volatile
深入分析volatile的实现原理 中已经阐述了volatile的特性了: volatile可见性;对一个volatile的读,总可以看到对这个变量最终的写; volatile原子性;volatile对单个读/写具有原子性(32位Long、Double),但是复合操作除外,例如i++; JVM底层采用“内存屏障”来实现volatile语义 下面LZ就通过happens...转载 2019-02-14 14:18:59 · 129 阅读 · 0 评论 -
Java内存模型之从JMM角度分析DCL
DCL,即Double Check Lock,中卫双重检查锁定。其实DCL很多人在单例模式中用过,LZ面试人的时候也要他们写过,但是有很多人都会写错。他们为什么会写错呢?其错误根源在哪里?有什么解决方案?下面就随LZ一起来分析 问题分析 我们先看单例模式里面的懒汉式: public class Singleton { private static Singleton singlet...转载 2019-02-14 11:28:21 · 151 阅读 · 0 评论 -
Java内存模型之重排序
在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 在单线程环境下不能改变程序运行的结果; 存在数据依赖关系的不允许重排序 如果看过LZ上篇博客的就会知道,其实这两点可以归结于一点:无法通过happens-before原则推导出来的,JMM允许任意的排序。 as-if-serial语义 ...转载 2019-02-14 11:20:48 · 115 阅读 · 0 评论 -
Java内存模型之happens-before
在上篇博客 LZ提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题。那么我们正确使用同步、锁的情况下,线程A修改了变量a何时对线程B可见? 我们无法就所有场景来规定某个线程修改的变量何时对其他线程可见,但是我们可以指定某些规则,这规则就是happens-before,从JDK 5 开始,JMM就使用happens-before的概念来阐述多线程之间的内存...转载 2019-02-14 11:18:10 · 125 阅读 · 0 评论 -
volatile的实现原理
通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized。如果一个变量使用volatile,则它比使用synchronized的成本更加低,因为它不会引起线程上下文的切换和调度。Java语言规范对volatile的定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地...转载 2019-02-14 11:03:04 · 150 阅读 · 0 评论 -
synchronized的实现原理
下面跟随LZ一起来探索synchronized的实现机制、Java是如何对它进行了优化、锁优化机制、锁的存储结构和升级过程; 实现原理 synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性 Java中每一个对象都可以作为锁,这是synchronized实现同步的基础: 普通同步方法,锁是当前实例对象 ...转载 2019-02-14 10:49:05 · 115 阅读 · 0 评论 -
J.U.C之AQS:AQS简介
Java的内置锁一直都是备受争议的,在JDK 1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略(分析synchronized的实现原理),但是与Lock相比synchronized还是存在一些缺陷的:虽然synchronized提供了便捷性的隐式获取锁释放锁机制(基于JVM机制),但是它却缺少了获取锁与释放锁的可操作性,可中断、超时获取锁...转载 2019-02-15 14:58:05 · 153 阅读 · 0 评论 -
枚举
enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中。 下面是我在使用 enum 过程中的一些经验和总结,主要包括如下内容: 1. 原始的接口定义常量 2. 语法(定义) 3. 遍历、switch 等常用操作 4. enum 对象的常用方法介绍 5. 给 enum 自定义属性和方法 6原创 2018-01-03 09:46:11 · 245 阅读 · 0 评论 -
java java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp区别和联系
在web开发中,避免不了对日期的操作,就几种常见的日期操作做个总结(部分参考网络,在此表示感谢): java.util.Date、java.sql.Date、java.sql.Time、java.sql.Timestamp java.lang.Object ….|__java.util.Date ……….|__java.sql.Date/java.sql.Timestamp /转载 2017-12-27 10:39:57 · 263 阅读 · 0 评论 -
JAVA 对象序列化——Serializable
JAVA 对象序列化——Serializable Java的对象序列化是指将那些实现了Serializable接口的对象转换成一个字符序列,并能够在以后将这个字节序列完全恢复为原来的对象。这一过程甚至可通过网络进行,这意味着序列化机制能自动弥补不同操作系统之间的差异。 只要对象实现了Serializable接口(记住,这个接口只是一个标记接口,不包含任何的方法原创 2017-12-11 13:59:54 · 149 阅读 · 0 评论 -
java的异常(Exception)信息的详细记录
下面的三个方法都是获取异常的详细信息,或许的异常详细信息以字符串的形式返回,保持栈堆载的风格 方法一: public static String getExceptionAllinformation(Exception ex){ String sOut = ""; StackTraceElement[] trace = ex.getStac原创 2017-09-27 15:05:23 · 9918 阅读 · 3 评论 -
Java 循环结构 - for, while 及 do...while
Java 循环结构 - for, while 及 do...while 顺序结构的程序语句只能被执行一次。如果您想要同样的操作执行多次,,就需要使用循环结构。 Java中有三种主要的循环结构: while 循环 do…while 循环 for 循环 在Java5中引入了一种主要用于数组的增强型for循环。 while 循环 while是最基本的循环,原创 2017-09-28 11:33:55 · 158 阅读 · 0 评论 -
将java源码打成jar包
方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ... 选项包括: -c 创建新的归档文件 -t 列出归档目录 -x 解压缩已归档的指定(或所有原创 2017-09-28 15:11:49 · 254 阅读 · 0 评论 -
java生成文件的默认保存路径与System.getProperty("user.dir")
前言 new File("test.file").createNewFile(); 保存到哪里去了?开发中,会经常遇到这个问题。生成的文件,默认保存到user.dir路径下了。 解释 user.dir是jvm的系统属性,我们知道System.property可以获取jvm系统属性值,所以System.property("user.dir")路径就是文件的默认保存路径。转载 2017-09-13 15:42:45 · 7320 阅读 · 0 评论 -
java基础之---- newInstance()和new()
在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了转载 2017-07-24 09:38:10 · 348 阅读 · 0 评论 -
java中的sleep()和wait()的区别
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。 sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。 在调用sleep()方法的过程中,线程不会释放对象锁。 而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等转载 2017-07-13 10:32:18 · 167 阅读 · 0 评论 -
break和continue的区别
//break是结束整个循环体,continue是结束单次循环 比方说: while(x++ < 10) { if(x == 3) { break; } printf("%d\r\n", x); } 结果是输出 1 2 就退出了整个while循环 但是如果使用continue while(x++ < 10) { if(x == 3)转载 2017-06-21 11:49:48 · 665 阅读 · 0 评论 -
System.currentTimeMillis() vs. new Date() vs. Calendar.getInstance().getTime()
在Java中,使用的性能和资源含义是什么 System.currentTimeMillis() 与 new Date() 与 Calendar.getInstance().getTime() System.currentTimeMillis()显然是效率最高的,因为它甚至不创建一个对象,但new Date()实际上只是一个很长的包装器,所以它并不遥远。原创 2017-12-11 16:03:37 · 5444 阅读 · 0 评论 -
jdk动态代理
动态代理,这个词在Java的世界里面经常被提起,尤其是对于部分(这里强调“部分”二字,因为有做了一两年就成大神的,实力强的令人发指,这类人无疑是非常懂动态代理这点小伎俩的)做了一两年新人来说,总是摸不清楚来龙去脉,一两年是个坎,为什么是一两年,才入门的新人可能对这东西没什么感觉,没到这一步,做了很久开发的人显然是明白这其中原理的,而做了一两年的,知其然而不知其所以然,所以一两年工作经验的人很多是很转载 2017-11-23 11:45:36 · 149 阅读 · 0 评论 -
java判断字符串是否为空的方法总结
方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: 比较字符串长度, 效率高, 是我知道的最好一个方法: if(s == null || s.length() 方法三: Jav原创 2017-12-11 17:04:42 · 300 阅读 · 0 评论 -
浅析Java中的final关键字
浅析Java中的final关键字 浅析Java中的final关键字 谈到final关键字,想必很多人都不陌生,在使用匿名内部类的时候可能会经常用到final关键字。另外,Java中的String类就是一个final类,那么今天我们就来了解final这个关键字的用法。下面是本文的目录大纲: 一.final关键字的基本用法 二.深入理解final关键字 若转载 2017-12-18 13:38:01 · 163 阅读 · 0 评论 -
深入理解Java的接口和抽象类
深入理解Java的接口和抽象类 深入理解Java的接口和抽象类 对于面向对象编程来说,抽象是它的一大特征之一。在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。这两者有太多相似的地方,又有太多不同的地方。很多人在初学的时候会以为它们可以随意互换使用,但是实际则不然。今天我们就一起来学习一下Java中的接口和抽象类。下面是本文的目录大纲: 一.抽象类转载 2017-12-18 13:32:32 · 151 阅读 · 0 评论 -
Java:类与继承
Java:类与继承 Java:类与继承 对于面向对象的程序设计语言来说,类毫无疑问是其最重要的基础。抽象、封装、继承、多态这四大特性都离不开类,只有存在类,才能体现面向对象编程的特点,今天我们就来了解一些类与继承的相关知识。首先,我们讲述一下与类的初始化相关的东西,然后再从几个方面阐述继承这一大特性。以下是本文的目录大纲: 一.你了解类吗? 二.你了解继承吗转载 2017-12-18 11:17:45 · 143 阅读 · 0 评论 -
Java中的static关键字解析
Java中的static关键字解析 Java中的static关键字解析 static关键字是很多朋友在编写代码和阅读代码时碰到的比较难以理解的一个关键字,也是各大公司的面试官喜欢在面试时问到的知识点之一。下面就先讲述一下static关键字的用法和平常容易误解的地方,最后列举了一些面试笔试中常见的关于static的考题。以下是本文的目录大纲: 一.static关键字转载 2017-12-18 11:09:13 · 157 阅读 · 0 评论 -
JVM的内存区域划分
JVM的内存区域划分 JVM的内存区域划分 学过C语言的朋友都知道C编译器在划分内存区域的时候经常将管理的区域划分为数据段和代码段,数据段包括堆、栈以及静态数据区。那么在Java语言当中,内存又是如何划分的呢? 由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。在转载 2017-12-18 11:06:43 · 118 阅读 · 0 评论 -
浅谈Java中的hashcode方法
浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率。在Java的Object类中有一个方法: 1 public native int hashCode(); 根据这个方法的声明可知,该方法返回一个int类型的数值,并且是本地方法转载 2017-12-18 10:59:37 · 142 阅读 · 0 评论 -
JAVA中Long与Integer比较容易犯的错误(比较数据equals)
今天使用findbugs扫描项目后发现很多高危漏洞,其中非常常见的一个是比较两个Long或Integer时直接使用的==来比较。 其实这样是错误的。 因为Long与Ineger都是包装类型,是对象。 而不是普通类型long与int , 所以它们在比较时必须都应该用equals,或者先使用longValue()或intValue()方法来得到他们的基本类型的值然后使用==比较也是原创 2017-12-12 09:26:36 · 9958 阅读 · 0 评论