
Java基础
CowardlyLion
The world is a fine place and worth fighting for!
展开
-
Java动态代理的简单示例
1. 需要一个接口,用于定义被代理的行为。不使用接口不行。2. InvocationHandler接口的invoke方法有3个参数,分别是被代理对象、被执行的接口方法、方法参数3. Proxy.newInstance的参数分别是被代理对象的类加载器、接口、InvocationHandler实例public class MyInvocationHandler implements Invocatio...原创 2018-03-07 19:03:09 · 151 阅读 · 0 评论 -
如何调试多线程
1. 去除主线程的干扰在断点处增加断点属性:(!(Thread.currentThread().getName().equals("main")))2. 挂起整个JVM原创 2018-03-07 20:23:21 · 2121 阅读 · 0 评论 -
CountDownLatch的简单示例
CountDownLatch有3个主要方法:1. 构造方法:定义计数器数量2. countDown():计数器减一3. await():阻塞当前线程直到计数器为0时,唤醒所有线程模拟多并发场景:定义一个CountDownLatch,每启动一个线程后让线程wait。等所有线程启动完毕后,执行每个线程的countDown直到计数器为0,此时所有线程同时执行。public class LocalVari...原创 2018-03-07 20:27:22 · 361 阅读 · 0 评论 -
for(;;)和while(1)两种死循环的区别
在JUC的源码中,经常看到for(;;),为什么不使用while(true)呢?for(;;)死循环里的两个;;代表两个空语句,编译器一般会优化掉它们,直接进入循环体。 while(true)死循环里的true被看成表达式,每循环一次都要判断表达式是否真。 即,相对来说for式死循环更加高效一点。当然以上条件成立还要看编译器的优化,一些编译器优化的两者并无区别,但是,并非所有的编译器都做了这样的优...原创 2018-03-07 20:30:02 · 14220 阅读 · 2 评论 -
怎么做对象的深拷贝?
深拷贝的实现方案:借助Apache Commons包,内部为反射的实现: org.apache.commons.beanutils.PropertyUtils.copyProperties(Object dest, Object orig) org.apache.commons.beanutils.BeanUtils.copyProperties(Object dest, Object orig)...原创 2018-03-07 20:33:26 · 536 阅读 · 0 评论 -
BO、PO、DAO、DTO、VO、POJO
BO:Business Object,业务对象。主要是承载业务数据的实体。处理业务逻辑的时候使用,数据结构也是针对业务逻辑建立的。PO:persistence Object,持久化对象。数据最终要存储,无论以何种形式存储,都必须要持久化。加入使用关系数据库存储,一个PO对应一条数据库的记录,或者是对象从数据库查询出来的结果集的一条记录。DAO:Data Access Object,数据访问对象。包...原创 2018-03-07 20:34:43 · 223 阅读 · 0 评论 -
Java基础常识(适用于面试)
八大数据类型的对应类里有常量表示类型的最大值最小值等取值范围局部变量不能被声明为 static 变量final 对象的引用不能改变,但是里面的值可以改变类中的 final 方法可以被子类继承,但是不能被子类修改final 类不能被继承如果一个类包含抽象方法,那么该类一定要声明为抽象类volatile:使两个不同的线程总是看到某个成员变量的同一个值接口可多重继承接口(extends)普通的类方法是可...原创 2018-03-07 20:40:48 · 316 阅读 · 0 评论 -
Double转BigDecimal
不能直接new BigDecimal(1.1),这样可能会有精度丢失。应该:new BigDecimal().valueOf(1.1); // 使用valueOf或new BigDecimal("1.1"); // 使用字符原创 2018-03-07 20:42:12 · 7269 阅读 · 0 评论 -
基于泛型的PECS原则
PECS(Producer Extends Consumer Super)原则: 第一、 频繁往外读取内容的,适合用<? extends T>。 第二、 经常往里插入的,适合用<? super T>。我们知道Java泛型可以有多种写法,主要是 extends 和 super 关键字。比如:HashMap<T extends String>;HashMap<...原创 2018-03-07 20:43:58 · 466 阅读 · 0 评论 -
Java中String#split的坑
String str = "a,b,c,,";String[] ary = str.split(",");// 预期是5,结果是 3System.out.println(ary.length);所以,对于String的split方法,必须做最后一个分割符后是否为空的校验。...原创 2018-03-07 20:45:15 · 358 阅读 · 0 评论 -
Java注解
注解的作用就是给代码打标签,是代码的元数据,本身没什么作用,需要结合反射进行处理。Java内置的3个注解: @Override @Deprecated @SuppressWarnings还有4种元注解,专门提供注解的创建:@Target 表示该注解可以用于什么地方.可以用的参数包括(可以指定多个,用逗号分隔.调用方法为ElementType.xxx.如果省略这个选项,那么就是可以用于所有地方):C...原创 2018-03-07 20:21:01 · 189 阅读 · 0 评论 -
Java和CGLIB的动态代理
静态代理和动态代理的区别是: 代理类和委托类的关系是在运行时还是运行前确定.动态代理分两种:Java反射机制实现的动态代理import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class MyInvocationHandler implements InvocationHandle...原创 2018-03-07 20:15:44 · 140 阅读 · 0 评论 -
Java反射的API小结
类对象的获取:1. 直接使用Person.class2. obj.getClass()3. Class.forName("xxx");获取方法:getMethods获取所有包含父类的public方法getMethod获取指定包含父类的public方法getDeclaredMethods获取所有非父类方法getDeclaredMethod获取指定非父类方法获取构造方法:getConstructors...原创 2018-03-07 19:04:48 · 168 阅读 · 0 评论 -
getResourceAsStream的简单用法
InputStream is = this.getClass().getResourceAsStream(fileName); //包路径下获取资源InputStream is = this.getClass().getResourceAsStream("/" + fileName); // classpath下获取资源,包路径的根目录就是classpath路径InputStream is = ...原创 2018-03-07 19:05:56 · 823 阅读 · 0 评论 -
Java1.7增加switch对字符串的支持
Java1.7之前switch只能局限于int 、short 、byte 、char四类做判断条件。在JVM内部实际大部分字节码指令只有int类型的版本。在使用switch的时候,如果是非int型,会先转为int型,再进行条件判断。Java1.7的switch增加了对String的支持,可String并不能直接转为int型,这是怎么做到的?//源代码 public class TestSwitc...原创 2018-03-07 19:19:44 · 1938 阅读 · 0 评论 -
如何获得Object类native方法的原生hashcode
System.identityHashCode():用于根据对象在内存中的地址算出来的一个数值。Object类原生的native方法hashCode()与System.identityHashCode()得出的值是一样的。如果我们重写了某个类的hashCode()方法,想得到原生的hashCode就可以使用identityHashCode方法得到。...原创 2018-03-07 19:24:21 · 1205 阅读 · 0 评论 -
String的hashCode算法的解读
注:出处不明public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i < value.length; i++) { h = 31...转载 2018-03-07 19:28:44 · 2100 阅读 · 0 评论 -
Object类的常见方法
hashCode:默认返回System.identityHashCode()方法的值,是对象的内存地址equals:默认比较两个对象的内存地址是否相等getClass:返回对象所指向的类wait:在synchronized同步块中使用,表示线程释放资源并进入等待notify / notifyAll:在synchronized同步块中使用,表示唤醒一个/所有等待线程toString:不解释final...原创 2018-03-07 19:43:27 · 185 阅读 · 0 评论 -
ArrayList、Vector、HashMap、HashTable、HashSet的默认初始容量、加载因子、扩容增量
Java中集合容量是有初始值的,如果容量不够用就会进行扩容,并将容器原来的数据全部复制到新的内存上。设置合理的初始容量,可以提高效率。加载因子(factor):小于等于1,当元素个数超过(容量长度*加载因子)时,进行扩容。List 元素是有序的、可重复,ArrayList、Vector默认初始容量为10。Vector:线程安全,性能差,底层数据结构是数组加载因子为1:即当元素个数超过容量长度时,才...原创 2018-03-07 20:00:20 · 3581 阅读 · 0 评论 -
Java IO的类介绍
分字符流和字节流,下图中没有包含RandomAccessFile,该类自成一派,属于IO包,但直接继承自object类。BufferedReader包装InputStreamReader,提供行读取。PipedReader和PiperWriter是用于不同线程之间通信的(传输字符),这两个必须结合使用,使用connect方法连接。FilterReader是抽象类DataInputStream和Da...原创 2018-03-07 20:09:26 · 252 阅读 · 0 评论 -
Java多线程小结
死锁:企图抢夺对方所持有的锁,谁都不先让,陷入死结。(保证统一的加锁解锁顺序可以避免)饥饿:由于优先级低等原因,一直抢不到锁而导致无法运行。活锁:譬如2个线程都发现对方有自己需要的锁,就主动释放锁给对方。结果双方都在谦让,以至于都在做让锁的无用功。线程的stop、suspend、resume等方法已废弃。线程的中断方法:1. interrupt():设置线程中断标志位,会对sleep和wait产生...原创 2018-02-16 21:11:24 · 216 阅读 · 0 评论 -
Java 中的中文编码问题(非常详细)
只要有跨应用数据交换的地方,都可能产生编码和解码。出现乱码问题唯一的原因都是在 char 到 byte 或 byte 到 char 转换中编码和解码的字符集不一致导致的。几个常用的类:String name = "I am 君山"; byte[] utf8 = name.getBytes("UTF-8");String n = new String(utf8, "UTF-8");Chars...转载 2018-03-07 20:55:23 · 40652 阅读 · 3 评论