Java 语言
文章平均质量分 54
_吹雪_
这个作者很懒,什么都没留下…
展开
-
Java中字符串switch的实现细节
Java 7中的字符串的switch是如何实现的。验证它其实非常简单,你只需用字符串写一段switch的代码,然后反编译一下,看看编译器是如何翻译它们的就可以了。 public class StringInSwitchCase { public static void main(String[] args) { String mode = args...原创 2016-08-14 16:40:43 · 4603 阅读 · 0 评论 -
Java基础之实现类似spring的可配置的AOP
#xxx=java.util.ArrayListxxx=javaplay.day3.aopframework.ProxyFactoryBeanxxx.advice=javaplay.day3.MyAdvicexxx.target=java.util.ArrayList package javaplay.day3.aopframework;import java.lang.re...原创 2016-11-16 21:02:38 · 481 阅读 · 0 评论 -
Java基础之AOP原理
这篇博文如果不能在五分钟内写出来,说明没有掌握aop的原理终于知道为什么不能invoke方法里调用proxy.toString()方法,因为要转发 package javaplay.day3;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.r...原创 2016-11-07 22:09:46 · 684 阅读 · 0 评论 -
Java基础之动态代理
代理的原理与作用及AOP的概念代理1.要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理、日志、计算方法的运行时间、事务管理、等等,你准备如何做? 2.编写一个与目标类具有相同接口的代理类,代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码。 3.如果采用工厂模式和配置文件的方式进行管理,则不需要修改客户端程序,在代码中引用代理类跟目标类都...原创 2016-11-01 22:08:59 · 380 阅读 · 0 评论 -
Java基础之类加载器
1. 什么是类加载器? 加载类的工具.2. Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类: BootStrap,ExtClassLoader,AppClassLoader3. 类加载器也是Java类,因为其是java类的类加载器本身也要被类加载器加载,显然必须有第一个类加载器不是java类,这正是BootStrap,它是嵌套在虚拟机内核里面...原创 2016-10-25 22:04:48 · 508 阅读 · 0 评论 -
Java基础之泛型
1.使用泛型,集合中元素限定为一个特定类型,集合中只能存储同一个类型对象,这样更安全,获取元素时,不需要对对象进行强制类型转换,更方便。2.泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序的非法输入,编译器编译带类型说明的集合时会去掉类型信息,使用程序运行效率不受影响,对于参数化的泛型类型,getClass()方法的返回值和原始类型完全一样。由于编译器生成的字节码...原创 2016-10-23 17:20:35 · 412 阅读 · 0 评论 -
Java基础之注解
编码习惯:类名/属性名是名词或者形容词加名词,方法名是动词或者是动词加名词了解注解,覆盖equals方法时类型参数不能是除Object之外的类型,否则equals不起作用,因为被调用的还是Object的equals方法,加上注解@Override即可解决;注解相当于一种标记,开发工具或者其它工具可以用反射来了解类及各种元素上有无何种标记,然后做相应的处理;注解可以加在包、类、字段、方法、方...原创 2016-10-23 14:51:48 · 287 阅读 · 0 评论 -
Java基础之内省
内省是与反射密切相关的javabean是一种特殊的java类,它的全部或者部分方法的名称是按约定的规则(要么是set打头要么是get打头)确定的,javabean属性的名称是根据set和get方法的名称来确定的,不是根据私有成员变量,并且set方法没有返回值,get方法没有参数。gettime->timesetTime->TimegetCPU->CPU属性名是把set/...原创 2016-10-22 11:46:35 · 319 阅读 · 0 评论 -
Java基础之反射
框架都要用到反射技术,反射都要用到一个类Class.java程序中的各个java类属于同一类事物,描述这类事物的java类名就是Class.得到字节码的方式有三种:Date.class;new Date().getClass();Class.forName("java.lang.String");最后一种是有直接返回,没有则从硬盘加载。有9个预定义的Class实例对象,8种基本数据...原创 2016-10-12 00:27:45 · 403 阅读 · 0 评论 -
Java对象的深复制与浅复制
深复制与浅复制:浅复制(shallow clone):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。深复制(deep clone): 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那...原创 2016-09-05 15:53:49 · 448 阅读 · 0 评论 -
Java 正则表达式:Pattern类与Matcher类详解
java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编...转载 2016-08-28 21:47:01 · 505 阅读 · 0 评论 -
Java线程sleep和wait的区别
sleep():sleep()使当前线程进入停滞状态(阻塞当前线程),让出CUP的使用、目的是不让当前线程独自霸占该进程所获的CPU资源,以留一定时间给其他线程执行的机会;sleep()是Thread类的Static(静态)的方法;因此他不能改变对象的机锁,所以当在一个Synchronized块中调用Sleep()方法是,线程虽然休眠了,但是对象的机锁并木有被释放,其他线程无法访问这个对象(即...原创 2017-04-06 23:08:59 · 668 阅读 · 0 评论 -
Java 6中的synchronized
0. 前言在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁, 但是随着Java SE1.6对Synchronized进行了 各种优化 之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中 为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁, 以及锁的存储结构和升级过程。1. 术语定义 术语 英文 说明...转载 2018-07-15 17:44:22 · 192 阅读 · 0 评论 -
从一个故障说说Java的三个BlockingQueue
1. 简介最近出了个故障,排查的时候耗费了很长的时间,回顾整个排查过程,经验主义在这里起了不好的作用,直接导致了整个故障排查的时间非常长,这个故障的根本原因在于BlockingQueue用的有问题,顺带展开说说Java中常用的几个BlockingQueue:ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue、PriorityBlock...转载 2018-06-25 23:38:48 · 362 阅读 · 0 评论 -
ClassNotFoundException和NoClassDefFoundError区别
ClassNotFoundException:它是Exception,不是Error在Throwable体系中只是一个Exception,说明它是可恢复的发生的时机当应用试图通过给定的name加载对应的class时可能抛出此异常,找不到对应的class文件时抛出。常见的场景就是:调用class的forName方法时,找不到指定的类ClassLoader 中的 findSystemCl...原创 2018-10-09 22:08:30 · 232 阅读 · 0 评论 -
NIO与IO区别
流与块的比较原来的 I/O 库(在 java.io.*中) 与 NIO 最重要的区别是数据打包和传输的方式。正如前面提到的,原来的 I/O 以流的方式处理数据,而 NIO 以块的方式处理数据。面向流的I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据,一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器,以便每个过滤器只负责单个复杂处理机制的一部分,这样也是相...原创 2018-10-09 22:09:11 · 197 阅读 · 0 评论 -
传统tcp网络编程入门示例
1.demo public class Server { public static void main(String[] args) throws IOException { // 创建一个ServerSocket,用于监听客户端Socket的连接请求 ServerSocket ss = new ServerSocket(30000); // 采用循环不断接受来自客户端的...原创 2017-04-05 22:25:52 · 433 阅读 · 0 评论 -
NIO实现非阻塞Socket通信
注:1.服务端的sk.isAcceptable()只能是注册的惟一一个ServerSocketChannel,所以有sk.interestOps(SelectionKey.OP_ACCEPT);产生sk.isReadable()只能是ServerSocketChannel产生的并且已经注册过的SocketChannel,所以有sk.interestOps(SelectionKey.OP_RE...原创 2017-04-05 22:35:38 · 582 阅读 · 0 评论 -
NIO入门
传统的输入流、输出流(面向流的输入/输出系统)一次只能处理一个字节(即使我们不直接去处理字节流,但底层的实现还是依赖于字节处理),因此面向流的输入/输出系统通常效率不高。新IO使用了不同的方式来处理输入/输出,新IO采用内存映射的方式的来处理输入/输出(即将文件或文件的一段区域映射到内存中,这样就可以像访问内存一样来访问文件了,模拟了操作系统上的虚拟内存的概念),这种方式效率要高。Channe...原创 2017-04-05 23:03:51 · 314 阅读 · 0 评论 -
Java 编解码与字符集
一、起初java提供两种方式来对字符串进行编码和解码,一个是String类,一个是Charset类,用法如下:使用String类时:编码:字符串变成字节数组;String -->byte[]; (String类的方法):str.getBytes(charsetName);;将该字符串按照指定编码表编码。解码:字节数组变成字符串;byte[] -->String; (...原创 2016-09-03 21:00:41 · 2392 阅读 · 0 评论 -
Java基础之枚举
可变参数的特点:只能出现在参数列表的最后;...位于变量类型和变量名之间,前后有无空格都可以;调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。增强for循环:迭代的集体变量可以是数组或者是实现了Iterable接口的集合类,还可以在类型声明前加修饰符如final写书的人在哪里看到的呢,知识的源头在java语言规范里。基本类型的自...原创 2016-09-20 22:00:36 · 458 阅读 · 0 评论 -
volatile关键字解析(转摘)
Java并发编程:volatile关键字解析 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内存模型相关的概念和知识,然后分析了volatile关键字的实现原理. 1.内存模型的相关概念大家都知道,计算机在执行程序时,每条指令都是在C...原创 2016-09-03 23:38:53 · 408 阅读 · 0 评论 -
Java 8 排序小结
1、概述 首先,让我们先定义一个简单的实体类:@Datapublic class Human { private String name; private int age; public Human() { super(); } public Human(final String name, final int age) {...原创 2018-06-16 09:57:44 · 1434 阅读 · 0 评论 -
Java 8 实现各种List操作
利用java8新特性,可以用简洁高效的代码来实现一些数据处理。 定义1个Apple对象:public class Apple { private Integer id; private String name; private BigDecimal money; private Integer num; public Apple(Integer i...原创 2018-06-16 09:59:49 · 3065 阅读 · 0 评论 -
Java 偏向锁
Java偏向锁(Biased Locking)是Java6引入的一项多线程优化。它通过消除资源无竞争情况下的同步原语,进一步提高了程序的运行性能。 偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要触发同步。 如果在运行过程中,遇到了其他线程抢占锁,则持有偏向锁的线程会被挂起,JVM会尝试消除它身上的偏向锁,将锁恢...原创 2018-07-15 17:43:14 · 1053 阅读 · 0 评论 -
检查异常和未检查异常不同之处
public class ExceptionTypeTest { public void doSomething()throws ArithmeticException{ System.out.println(); } public static void main(){ ExceptionTypeTe...原创 2018-07-15 17:45:41 · 405 阅读 · 0 评论 -
Java之synchronized的实现原理
0. 前言目前在Java中存在两种锁机制:synchronized和Lock, Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CP...转载 2018-07-15 17:46:52 · 957 阅读 · 0 评论 -
Java 8 之lambda表达式语法
1. 简介lambda表达式可以这样定义(不精确,自己的理解):一段带有输入参数的可执行语句块。//这里省略list的构造List<String> names = ...;Collections.sort(names, (o1, o2) -> o1.compareTo(o2));//这里省略list的构造List<String> names =...转载 2016-08-21 16:14:19 · 407 阅读 · 0 评论 -
Java 8之Stream语法详解
1. Stream初体验我们先来看看Java里面是怎么定义Stream的:A sequence of elements supporting sequential and parallel aggregate operations.我们来解读一下上面的那句话:Stream是元素的集合,这点让Stream看起来用些类似Iterator;可以支持顺序和并行的对原Stream进...转载 2016-08-28 21:49:08 · 698 阅读 · 0 评论 -
深入理解Java内存模型——final
对于final域,编译器和处理器要遵守两个重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。下面,我们通过一些示例性的代码来分别说明这两个规则:public class FinalExample { int...转载 2017-04-09 08:42:35 · 430 阅读 · 0 评论 -
Java锁的种类
1. 可重入锁当一个线程重新获取锁,读写锁或其他不可重入的同步器时,就可能发生重入锁死。可重入的意思是线程可以重复获得它已经持有的锁。Java的synchronized块是可重入的。因此下面的代码是没问题的:(这里提到的锁都是指的不可重入的锁实现,并不是Java类库中的Lock与ReadWriteLock类) public class Reentrant{ public syn...原创 2017-04-09 08:34:52 · 3201 阅读 · 0 评论 -
AIO实现非阻塞Socket通信
1.demo public class SimpleAIOServer { static final int PORT = 30000; public static void main(String[] args) throws Exception { // ①创建AsynchronousServerSocketChannel对象。 AsynchronousServerS...原创 2017-04-06 22:23:59 · 446 阅读 · 0 评论