Java核心技术分析
层层深入分析java语言高级特性,包括:
1、从原理上分析java语言知识点。
2、分析java常用但是容易让人忽略原理的知识点。
3、分析java容易误使用的知识点。
4、分析java实用但很少被使用的知识点。
程序员面试
生命不息 学习不止
展开
-
每个程序员都会遇到的面试问题:谈谈进程和线程的区别
当你刚入职场时,无论你是用C++还是Java甚至只是应聘运维岗位,相信你都会遇到这个问题。这是一个很基础的问题,但又是一个很考验人水平的问题。说基础是因为每个学计算机的人都应该懂,进程线程是计算机的基础概念,是每个程序员时时刻刻都要接触的东西。但这又是一个充满陷阱可以无限扩展和深入的一个问题。比如可以从操作系统知识扩展到计算机组成原理,可以从单线程扩展到并发编程,可以从并发编程深入到线...原创 2018-10-10 15:30:10 · 525 阅读 · 0 评论 -
面试问题:你了解Java内存模型么(Java7、8、9内存模型的区别)
Java内存模型是每个java程序员必须掌握理解的,这是Java的核心基础,对我们编写代码特别是并发编程时有很大帮助。由于Java程序是交由JVM执行的,所以我们在谈Java内存区域划分的时候事实上是指JVM内存区域划分。首先,我们回顾一下Java程序执行流程:如上图所示,首先Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(.class后缀),然后由JVM中的类...原创 2018-10-09 19:29:07 · 516 阅读 · 0 评论 -
java抓包工具及配置
1、所需工具 jpcap.jar和jpcap.dll java抓包程序,使用jpcpa.jar包 下载地址:http://download.csdn.net/detail/moshenglv/8315223 java的JPCAP.jar,不过一直调用的都是winpcap(jpcap.dll)实现的许多接口。 用winpcap 底层采用的是c写的一些可以直接控...原创 2014-12-30 19:38:56 · 6413 阅读 · 0 评论 -
java与opencv结合,进行人脸检测
示例工程JavaOpenCvjava使用opencv需要调用opencv的dll库,并且相应的jar包和dll版本要相同。 项目 下载路径http://download.csdn.net/detail/moshenglv/8328365注意事项:1、项目中引入jar包 javacpp.jar javacv.jar opencv-246.jar,在上面链接中下载的项目...原创 2015-01-05 13:20:12 · 2137 阅读 · 0 评论 -
【并发】死磕Java并发:深入分析synchronized的实现原理
原文出处: cmsblogs记得刚刚开始学习Java的时候,一遇到多线程情况就是synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着我们学习的进行我们知道synchronized是一个重量级锁,相对于Lock,它会显得那么笨重,以至于我们认为它不是那么的高效而慢慢摒...转载 2017-02-19 18:46:28 · 415 阅读 · 0 评论 -
【并发】死磕Java并发:深入分析volatile的实现原理
原文出处: chenssy通过前面一章我们了解了synchronized是一个重量级的锁,虽然JVM对它做了很多优化,而下面介绍的volatile则是轻量级的synchronized。如果一个变量使用volatile,则它比使用synchronized的成本更加低,因为它不会引起线程上下文的切换和调度。Java语言规范对volatile的定义如下:Java编程语言允许线程访问共享变量,为...转载 2017-02-19 18:47:20 · 395 阅读 · 0 评论 -
【并发】死磕Java并发:Java内存模型之happens-before
原文出处: chenssy在上篇博客(死磕Java并发:深入分析volatile的实现原理)LZ提到过由于存在线程本地内存和主内存的原因,再加上重排序,会导致多线程环境下存在可见性的问题。那么我们正确使用同步、锁的情况下,线程A修改了变量a何时对线程B可见?我们无法就所有场景来规定某个线程修改的变量何时对其他线程可见,但是我们可以指定某些规则,这规则就是happens-before,从JD...转载 2017-02-19 18:48:08 · 333 阅读 · 0 评论 -
【单元测试】单元测试概念
单元测试是编写测试代码,用来检测特定的、明确的、细颗粒的功能。单元测试并不一定保证程序功能是正确的,更不保证整体业务是准备的。单元测试不仅仅用来保证当前代码的正确性,更重要的是用来保证代码修复、改进或重构之后的正确性。一般来说,单元测试任务包括接口功能测试:用来保证接口功能的正确性。 局部数据结构测试(不常用):用来保证接口中的数据结构是正确的 比如变量有无初始值 变量是否溢出...原创 2017-07-25 15:06:25 · 965 阅读 · 0 评论 -
【Junit】Junit使用教程(一)
几乎所有程序员都听说过Junit的大名,但不知真正懂得运用它的人有多少,我便是其中的一个小白。知道Junit是用来测试的,但却把“宝刀”当成了“菜刀”用。为了从此不再菜鸟,特此总结整理了下Junit的知识点。一、建立Junit测试类1. 右击test测试包,选择New-->Oher... 2. 在窗口中找到Junit,选择Junit Test Case转载 2017-09-06 16:11:49 · 1509 阅读 · 0 评论 -
【Junit】Junit使用教程(二)
二、核心——断言断言是编写测试用例的核心实现方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过。1. 断言核心方法assertArrayEquals(expecteds, actuals)查看两个数组是否相等。assertEquals(expected, actual)查看两个对象是否相等。类似于字符串比较使用的equals()方法转载 2017-09-06 16:12:52 · 617 阅读 · 0 评论 -
【Junit】Junit使用教程(三)
四、实例总结1. 参数化测试有时一个测试方法,不同的参数值会产生不同的结果,那么我们为了测试全面,会把多个参数值都写出来并一一断言测试,这样有时难免费时费力,这是我们便可以采用参数化测试来解决这个问题。参数化测试就好比把一个“输入值,期望值”的集合传入给测试方法,达到一次性测试的目的。[java] view plain copypackage test; import...转载 2017-09-06 16:15:11 · 620 阅读 · 0 评论 -
【Junit】Junit使用教程(四)
一、会用Spring测试套件的好处在开发基于Spring的应用时,如果你还直接使用Junit进行单元测试,那你就错过了Spring为我们所提供的饕餮大餐了。使用Junit直接进行单元测试有以下四大不足:1)导致多次Spring容器初始化问题根据JUnit测试方法的调用流程,每执行一个测试方法都会创建一个测试用例的实例并调用setUp()方法。由于一般情况下,我们在setUp转载 2017-09-06 16:16:00 · 523 阅读 · 0 评论 -
【java基础】Hashcode与equals
======================================================================================================1.如果两个对象相等,则hashcode()必须相等。2.如果两个对象相等,a.equals(b)==b.equals(a)==true3.如果两个对象有相同的hashcode值...原创 2015-10-20 09:02:53 · 500 阅读 · 0 评论 -
【多线程】 java线程实例(测试阻塞队列&&线程池)
<span style="font-size:14px;">//测试阻塞队列package com.moshenglv.dms.Demo;import java.util.concurrent.BlockingQueue;import java.util.concurrent.LinkedBlockingQueue;import java.util.concurrent.Ti...原创 2016-07-22 08:00:03 · 889 阅读 · 0 评论 -
【java日志】java.util.logging.Logger使用详解
java.util.logging.Logger不是什么新鲜东西了,1.4就有了,可是因为log4j的存在,这个logger一直沉默着,其实在一些测试性的代码中,jdk自带的logger比log4j更方便。 一、创建Logger对象 static Logger getLogger(String name) 为指定子系统查找或创建一个 logg原创 2016-07-22 08:05:01 · 1237 阅读 · 0 评论 -
【java基础】JAVA常用正则表达式
匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1) 匹配空白行的正则表达式:ns*r 评注:可以用来删除空白行 匹配HTML标记的正则表达式:< (S*?)[^...原创 2016-07-24 20:43:02 · 299 阅读 · 0 评论 -
【Java基础】Java:按值传递还是按引用传递详细解说
前天在做系统的时候被Java中参数传递问题卡了一下,回头查阅了相关的资料,对参数传递问题有了新的了解和掌握,但是有个问题感觉还是很模糊,就是Java中到底是否只存在值传递,因为在查阅资料时,经常看到有人说Java只有值传递,但有人说既有值传递,也有引用传递,对于两个观点个人觉得应该是站的角度不同而得出两个不同的说法,其实两个说法其中的原理是一样的,只要咱们懂得其中的原理,那么至于叫什么也就无所谓了原创 2016-07-30 22:13:14 · 533 阅读 · 1 评论 -
【并发】java并发之可见性与原子性
一、定义1.可见性在多核处理器中,如果多个线程对一个变量(假设)进行操作,但是这多个线程有可能被分配到多个处理器中运行,那么编译器会对代码进行优化,当线程要处理该变量时,多个处理器会将变量从主存复制一份分别存储在自己的片上存储器中,等到进行完操作后,再赋值回主存。(这样做的好处是提高了运行的速度,因为在处理过程中多个处理器减少了同主存通信的次数);同样在单核处理器中这样由于“备份”造...原创 2017-03-03 18:11:16 · 437 阅读 · 0 评论 -
【并发】java线程内存模型,线程、工作内存、主内存
java线程内存模型线程、工作内存、主内存三者之间的交互关系图: key edeas所有线程共享主内存每个线程有自己的工作内存refreshing local memory to/from main memory must comply to JMM rules 产生线程安全的原因线程的working memory是cpu的寄存器和高速缓存的抽象描述:现在...原创 2017-03-04 11:13:36 · 507 阅读 · 0 评论 -
【并发】java使用volatile的场景
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。锁提供了两种主要特性:互斥...转载 2017-03-04 11:33:57 · 493 阅读 · 0 评论 -
【并发】volatile详解
一、不得不提的volatilevolatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它;我们在JDK及开源框架中随处可见这个关键字,但并发专家又往往建议我们远离它。比如Thread这个很基础的类,其中很重要的线程状态字段,就是用volatile来修饰,见代码 /* Java thread status for tools,/* J...转载 2017-03-16 01:45:19 · 340 阅读 · 0 评论 -
【并发】volatile是否能保证数组中元素的可见性?
问题 一个线程向volatile的数组中设置值,而另一个线程向volatile的数组中读取。比如seg.setValue(2),随后另一个线程调用seg.getValue(2),前一个线程设置的值对读取的线程是可见的吗?我看书上说volatile的数组只针对数组的引用具有volatile的语义,而不是它的元素。 对一个共享变量使用Volatile关键字保证了线程间对该数...原创 2017-03-16 14:53:53 · 5993 阅读 · 3 评论 -
【并发】并发-不可变对象
一个对象如果在创建后不能被修改,那么就称为不可变对象。在并发编程中,一种被普遍认可的原则就是:尽可能的使用不可变对象来创建简单、可靠的代码。 在并发编程中,不可变对象特别有用。由于创建后不能被修改,所以不会出现由于线程干扰产生的错误或是内存一致性错误。 但是程序员们通常并不热衷于使用不可变对象,因为他们担心每次创建新对象的开销。实际上这种开销常常被过分高估,而且使用不可变对象所原创 2017-03-17 17:23:29 · 323 阅读 · 0 评论 -
【并发】ThreadLocal可能引起的内存泄露
threadlocal里面使用了一个存在弱引用的map,当释放掉threadlocal的强引用以后,map里面的value却没有被回收.而这块value永远不会被访问到了. 所以存在着内存泄露. 最好的做法是将调用threadlocal的remove方法. 在threadlocal的生命周期中,都存在这些引用. 看下图: 实线代表强引用,虚线代表弱引用. 每个thread中都存...原创 2017-03-23 16:44:12 · 535 阅读 · 0 评论 -
【并发】ConcurrentHashMap原理分析
集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并发集合类型(concurrent,copyonright,queue)中的ConcurrentHashMap,让我们从原理上细致的了解它们,能够让我们在深度项目开发中获...转载 2017-03-24 17:26:18 · 404 阅读 · 0 评论 -
【容器】深入理解HashMap原理
HashMap的工作原理是近年来常见的Java面试题。几乎每个Java程序员都知道HashMap,都知道哪里要用HashMap,知道HashTable和HashMap之间的区别,那么为何这道面试题如此特殊呢?是因为这道题考察的深度很深。这题经常出现在高级或中高级面试中。投资银行更喜欢问这个问题,甚至会要求你实现HashMap来考察你的编程能力。ConcurrentHashMap和其它同步集合的引入...原创 2017-03-25 11:11:24 · 431 阅读 · 0 评论 -
【容器】并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue用法在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出)。Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQueue,非阻塞队列的典型例子是ConcurrentLinkedQueue,在实际应用中要原创 2017-03-29 11:26:13 · 431 阅读 · 0 评论 -
【Java修饰符】(1)static修饰符详解
static 表示静态,它可以修饰属性,方法和代码块。 1.static修饰属性(类变量),那么这个属性就可以用类名.属性名来访问,也就是使这个属性成为本类的类变量,为本类对象所共有。这个属性就是全类公有。(共有的类变量与对象无关,只和类有关)。类加载的过程,类本身也是保存在文件中(字节码文件保存着类的信息)的,java会通过I/O流把类的文件(字节码文件)读入JVM(java虚...原创 2017-01-10 19:31:29 · 527 阅读 · 0 评论 -
【Java修饰符】(2)abstract修饰符详解
abstract(抽象)修饰符,可以修饰类和方法1.abstract修饰类,会使这个类成为一个抽象类,这个类将不能生成对象实例,但可以做为对象变量声明的类型,也就是编译时类型,抽象类就像当于一类的半成品,需要子类继承并覆盖其中的抽象方法。 2.abstract修饰方法,会使这个方法变成抽象方法,也就是只有声明(定义)而没有实现,实现部分以";"代替。需要子类继承实现(覆盖)。...原创 2017-01-10 20:22:43 · 762 阅读 · 0 评论 -
【Java修饰符】(3)final修饰符详解
final修饰符,可以修饰变量,方法,类 1.final修饰变量被fianl修饰的变量就会变成常量(常量应当大写),一旦赋值不能改变,(可以在初始化时直接赋值,也可以在构造方法里也可以赋值,只能在这两种方法里二选一,不能不为常量赋值),fianl的常量不会有默认初始值,对于直接在初始化是赋值时final修饰符常和static修饰符一起使用。 2.final修饰方法,被f...原创 2017-01-10 20:31:27 · 555 阅读 · 0 评论 -
【JVM实用参数】(一)JVM类型以及编译器模式
现在的JVM运行Java程序(和其它的兼容性语言)时在高效性和稳定性方面做的非常出色。自适应内存管理、垃圾收集、及时编译、动态类加载、锁优化——这里仅仅列举了某些场景下会发生的神奇的事情,但他们几乎不会直接与普通的程序员相关。在运行时,JVM会不断的计算并优化应用或者应用的某些部分。虽然有了这种程度的自动化(或者说有这么多自动化),但是JVM仍然提供了足够多的外部监控和手动调优工具。在有错误或...原创 2017-01-07 21:17:27 · 820 阅读 · 0 评论 -
【JVM实用参数】(二)参数分类和即时(JIT)编译器诊断
在这个系列的第二部分,我来介绍一下HotSpot JVM提供的不同类别的参数。我同样会讨论一些关于JIT编译器诊断的有趣参数。JVM 参数分类HotSpot JVM 提供了三类参数。第一类包括了标准参数。顾名思义,标准参数中包括功能和输出的参数都是很稳定的,很可能在将来的JVM版本中不会改变。你可以用java命令(或者是用 java -help)检索出所有标准参数。我们在第一部分中原创 2017-01-07 21:18:40 · 581 阅读 · 0 评论 -
【JVM实用参数】(三)打印所有XX参数及值
本篇文章基于Java 6(update 21oder 21之后)版本, HotSpot JVM 提供给了两个新的参数,在JVM启动后,在命令行中可以输出所有XX参数和值。-XX:+PrintFlagsFinal and -XX:+PrintFlagsInitial让我们现在就了解一下新参数的输出。以 -client 作为参数的 -XX:+PrintFlagsFinal 的结果是一个按...原创 2017-01-07 21:19:24 · 599 阅读 · 0 评论 -
【JVM实用参数】(四)内存调优
理想的情况下,一个Java程序使用JVM的默认设置也可以运行得很好,所以一般来说,没有必要设置任何JVM参数。然而,由于一些性能问题(很不幸的是,这些问题经常出现),一些相关的JVM参数知识会是我们工作中得好伙伴。在这篇文章中,我们将介绍一些关于JVM内存管理的参数。知道并理解这些参数,将对开发者和运维人员很有帮助。所有已制定的HotSpot内存管理和垃圾回收算法都基于一个相同的堆内存划分原创 2017-01-07 21:20:00 · 621 阅读 · 0 评论 -
【JVM实用参数】(五)新生代垃圾回收
本部分,我们将关注堆(heap) 中一个主要区域,新生代(young generation)。首先我们会讨论为什么调整新生代的参数会对应用的性能如此重要,接着我们将学习新生代相关的JVM参数。单纯从JVM的功能考虑,并不需要新生代,完全可以针对整个堆进行操作。新生代存在的唯一理由是优化垃圾回收(GC)的性能。更具体说,把堆划分为新生代和老年代有2个好处:简化了新对象的分配(只在新生代分配内存)...原创 2017-01-07 21:20:41 · 670 阅读 · 0 评论 -
【JVM实用参数】(六) 吞吐量收集器
在实践中我们发现对于大多数的应用领域,评估一个垃圾收集(GC)算法如何根据如下两个标准:吞吐量越高算法越好 暂停时间越短算法越好首先让我们来明确垃圾收集(GC)中的两个术语:吞吐量(throughput)和暂停时间(pause times)。 JVM在专门的线程(GC threads)中执行GC。 只要GC线程是活动的,它们将与应用程序线程(application threads)争用当前...原创 2017-01-07 21:21:30 · 1325 阅读 · 0 评论 -
【JVM实用参数】(七)CMS收集器
HotSpot JVM的并发标记清理收集器(CMS收集器)的主要目标就是:低应用停顿时间。该目标对于大多数交互式应用很重要,比如web应用。在我们看一下有关JVM的参数之前,让我们简要回顾CMS收集器的操作和使用它时可能出现的主要挑战。就像吞吐量收集器(参见本系列的第6部分),CMS收集器处理老年代的对象,然而其操作要复杂得多。吞吐量收集器总是暂停应用程序线程,并且可能是相当长的一段时间,原创 2017-01-07 21:22:07 · 586 阅读 · 0 评论 -
【JVM实用参数】(八)GC日志
本系列的最后一部分是有关垃圾收集(GC)日志的JVM参数。GC日志是一个很重要的工具,它准确记录了每一次的GC的执行时间和执行结果,通过分析GC日志可以优化堆设置和GC设置,或者改进应用程序的对象分配模式。-XX:+PrintGC参数-XX:+PrintGC(或者-verbose:gc)开启了简单GC日志模式,为每一次新生代(young generation)的GC和每一次的F原创 2017-01-07 21:23:10 · 580 阅读 · 0 评论 -
【理解JVM】JVM内存管理(1)
1.1 内存结构 1、两个子系统:Class loader子系统和Execution engine(执行引擎)子系统(1)Class loader子系统根据给定的全限定名类名(如java.lang.Object)来装载class文件的内容到Runtime data area中的method area(方法区域)(2)Execution engine子系统执行classes中...原创 2016-07-01 21:13:41 · 391 阅读 · 0 评论 -
【理解JVM】JVM内存管理(2)
1 JVM运行时数据区域详解Java虚拟机会将内存分为几个不同的管理区,这些区域各自有各自的用途,根据不同的特点,承担不同的任务以及在垃圾回收时运用不同的算法。总体分为下面几个部分:程序计数器(Program Counter Register)、JVM虚拟机栈(JVM Stacks)、本地方法栈(Native Method Stacks)、堆(Heap)、方法区(Method原创 2016-07-01 21:39:27 · 337 阅读 · 0 评论