随笔分类 -  Java Core

摘要:getClass()返回子类Class对象 public class Test { static abstract class A{ int a; } static class B extends A{ int b; } public static void main(String[] args){ 阅读全文
posted @ 2020-07-17 14:46 水木竹水 阅读(599) 评论(0) 推荐(0)
摘要:1.类型转换问题 public static void main(String args[]) { int num = 2147483647 ; num += 1L;//根据num的类型,先将1L转为int,然后再相加,故结果为-2147483648 //long b = num + 1L; // 阅读全文
posted @ 2020-05-12 15:19 水木竹水 阅读(167) 评论(0) 推荐(0)
摘要:在看Collections工具类代码时,发现翻转数组的逻辑,感觉很有趣。思想:折半交换 public static void main(String[] args) { // TODO Auto-generated method stub int[] n = new int[] {1,2,3,4,5 阅读全文
posted @ 2020-05-12 15:14 水木竹水 阅读(293) 评论(0) 推荐(0)
摘要:Java中的char占用2个字节,即16bit,最小值为Unicode 0,最大值为Unicode 2^16-1. 为什么char占用2个字节呢? (1)Unicode编码把所有语言都统一到一套编码里,以解决英文需要一个字节,中文需要2个字节等跨语言问题。 (2)Unicode通常用两个字节表示一个 阅读全文
posted @ 2020-05-12 15:11 水木竹水 阅读(597) 评论(0) 推荐(0)
摘要:sleep与wait区别: 1.sleep方法是线程静态方法,wait方法是Object对象方法; 2.sleep使线程休眠,不会释放锁;wait方法是在获取锁情况下进行等待的,等待时会释放锁; 3.都可以响应中断。 public class Test { static Object lock = 阅读全文
posted @ 2020-05-12 15:09 水木竹水 阅读(1613) 评论(0) 推荐(0)
摘要:LinkedHashMap,底层实现是在HashMap的基础上,添加了双向链表,可以根据访问顺序进行遍历,从最少访问到最频繁访问的升序访问。DOC描述如下: LinkedHashMap(int,float,boolean) create a linked hash map whose order o 阅读全文
posted @ 2020-05-12 15:07 水木竹水 阅读(792) 评论(0) 推荐(0)
摘要:我们知道在使用MyBatis开发时,只需要添加DAO接口和对应的映射XML文件,不需要写DAO的实现类,其实底层是通过动态代理实现。 本文将使用前几篇文章的知识点实现一个纯面向接口编程的简单框架,与MyBatis实现DAO实现类相似,主要采用注解、反射、动态代理、工厂模式等。具体功能: 接口添加自定 阅读全文
posted @ 2020-04-12 16:54 水木竹水 阅读(289) 评论(0) 推荐(0)
摘要:在前文Java反射(三)反射与代理设计模式 中描述了动态代理的使用方法,本文主要记录Java动态代理的实现原理。 大致思路:(1)用户通过Proxy.newProxyInstance方法,传入ClassLoader、接口数组、和InvocationHandler实现类(包含具体被代理对象和对其具体处 阅读全文
posted @ 2020-04-12 16:07 水木竹水 阅读(711) 评论(0) 推荐(0)
摘要:开发过程中使用注解将增加程序的灵活性和扩展性,注解可以修饰接口、类、方法、属性等。 1.反射获取注解 能够通过反射获取类上的注解,主要依赖于核心类AccessibleObject(如下图,Java10的DOC),其实现了AnnotatedElement类。另外其子类包含Field、Executabl 阅读全文
posted @ 2020-04-12 12:05 水木竹水 阅读(472) 评论(0) 推荐(0)
摘要:代理设计模式的思想,即用一个代理类实现为被代理类添加额外的工作,在实际开发中可能是日志记录、耗时计算等。 1.代理模式必不可少的元素:被代理接口、被代理类、代理类(组合被代理类); 2.一般可以使用两种方式实现代理:(1)静态代理;(2)动态代理。 3.还有一个可以直接对类进行代理,不需要被代理接口 阅读全文
posted @ 2020-04-11 20:15 水木竹水 阅读(490) 评论(0) 推荐(0)
摘要:将之前学的Java知识进行汇总和整理,本篇主要讲述Java反射和使用用例。 项目开发中,经常遇到需要给实例化对象设置属性值,并且当属性特别多时,setter属性占用很大篇幅,在此用反射实现实例化对象,并自动设置属性值。可以作为以后项目的小工具,方便开发。 大致思路:(1)对需要实例化的Class对象 阅读全文
posted @ 2020-04-11 17:15 水木竹水 阅读(1937) 评论(0) 推荐(0)
摘要:将之前学的Java反射进行一个汇总记录。 1. Class对象实例化 Java反射机制就是通过Class对象创建对应实例,并调用相关方法。首先是需要有Class对象,有三种获取Class对象的方式: (1)Object.getClass(),如Person p = new Person;对应的Cla 阅读全文
posted @ 2020-04-11 17:13 水木竹水 阅读(196) 评论(0) 推荐(0)
摘要:最近在编程时,修改方法传入对象的对象引用,并没有将修改反映到调用方法中。奇怪为什么结果没有变化,原因是遗忘了Java对象引用和内存分配机制。本文介绍3个点: ① 该问题举例说明 ② 简要阐述Java内存区域 ③ 介绍JVM中方法调用的机制 1. Java方法调用传参实例解析 Java中参数传递是值传 阅读全文
posted @ 2019-08-20 08:19 水木竹水 阅读(3909) 评论(0) 推荐(1)
摘要:锁的内存语义本质上可以说是对共享变量的更新,能及时让其他线程观察到;并且通过内存屏障,组织编译器或处理器指令重排序,导致多线程下不一致的现象。 1. volatile内存语义 见上一篇文章。 2. 锁的内存语义 (1)锁的释放和获取的内存语义 当线程释放锁时,JMM会将本地内存中的共享变量同步到主内 阅读全文
posted @ 2019-08-12 23:15 水木竹水 阅读(330) 评论(0) 推荐(0)
摘要:Java并发机制的底层原理总结如下: 1. volatile实现原理 (1)由该关键字声明的字段,Java线程内存模型确保所有线程看到这个变量的值是一致的。volatile变量的修改翻译成汇编语言为带LOCK前缀的指令,该指令会发生两件事: ① 将当前处理器缓存行的数据写回系统内存; ② 该写回内存 阅读全文
posted @ 2019-08-11 18:59 水木竹水 阅读(598) 评论(0) 推荐(0)
摘要:将之前看过的关于并发编程的东西总结记录一下,本文简单记录Java内存模型的相关知识。 1. 并发编程两个关键问题 并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步。 (1)在命令式编程(命令式编程侧重于告诉计算机先做什么后做什么,与声明式只告诉做什么,不告诉怎么做不同)中,线程间 阅读全文
posted @ 2019-08-11 17:14 水木竹水 阅读(203) 评论(0) 推荐(0)
摘要:在前边介绍Socket和ServerSocket连接交互的过程中,读写都是阻塞的。套接字写数据时,数据先写入操作系统的缓存中,形成TCP或UDP的负载,作为套接字传输到目标端,当缓存大小不足时,线程会阻塞。套接字读数据时,如果操作系统缓存没有接收到信息,则读线程阻塞。线程阻塞情况下,就不能处理其他事 阅读全文
posted @ 2019-02-01 20:24 水木竹水 阅读(2805) 评论(0) 推荐(0)
摘要:上篇文章介绍了Socket和ServerSocket简单使用和源码,服务器端会对每个客户端请求创建一个线程,为使服务器端能同时处理多个客户端请求,可以采用多线程的方式。本文仅对实例进行简单记录,如下。 服务器端 while循环获取连接,并构造ServerOneJabber,启动线程处理客户端交互。 阅读全文
posted @ 2019-02-01 16:57 水木竹水 阅读(1124) 评论(0) 推荐(0)
摘要:《Thinking in Enterprise Java》中第一章描述了用Socket和Channel的网络编程,核心即为Socket和Channel,本文简单讲述Socket的应用。 Socket可以认为是两个互联机器终端应用软件的抽象,即对于一个网络连接,两端都有一个Socket,应用可以通过套 阅读全文
posted @ 2019-01-30 18:53 水木竹水 阅读(9364) 评论(0) 推荐(1)
摘要:《Java编程思想》中对内存映射文件有详细的介绍,此处仅做简单记录和总结。内存映射文件允许创建和修改因为太大而不能放入内存的文件。 1. 内存映射文件简单实例 输出: 通过RandomAccessFile类获取FileChannel,使其具备读写功能。 通过FileChannel的map方法,获取M 阅读全文
posted @ 2019-01-30 10:20 水木竹水 阅读(4065) 评论(0) 推荐(0)