![](https://img-blog.csdnimg.cn/20200209102045267.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
java
文章平均质量分 78
java知识
爱炒饭
每天进步一点点
展开
-
面向切面编程:aspectJ在Android中的使用
一、 简介和使用场景aspectJ(https://www.eclipse.org/aspectj/)是eclipse社区中的一个开源工具,可以对java编程语言面向切面进行无缝拓展、完全兼容java语言,它可以对关注切点进行优雅处理,比如错误检查与处理、性能优化、监视与日志记录等场景。说到面向切面编程,大家可能会联想到著名的Spring AOP,Spring AOP是基于动态代理模式实现的。代理模式分为静态代理和动态代理,静态代理在编译期修改代码将指定对象注入到代码中,拓展性差、耦合性强;动态代理在运原创 2021-06-19 17:38:04 · 1137 阅读 · 5 评论 -
ThreadLocal和InheritableThreadLocal
一、引子最近在研究fps帧率时候了解到可以通过Choreographer刷新帧率的方法来统计界面刷新帧率,在当前应用确实可以,但是却不能监测其他app(比如QQ、微信、酷我音乐),为什么呢?难道说Choreographer不是全局变量。...原创 2021-06-12 18:28:49 · 1228 阅读 · 4 评论 -
手动实现bindview
以前android开发中用到过xUtils3和butterknife框架来动态注册控件id,节省繁琐的findViewById操作,今天就来试着自己写一个findViewById操作包装库。首先需要知道xUtils3和butterknife使用注解在编译时自动生成模板代码来实现的,那么就需要注解,注解之前在《注解》一文中有介绍; 同时为了方便生成java文件可以使用javapoet,javapoet是由squareup公司开源的java代码生成器,可以去github上查看详细文档。1、总览总的工原创 2021-05-21 20:04:13 · 697 阅读 · 2 评论 -
Synchronized锁升级
jdk1.5以及以前的版本Synchronized锁的堵塞和唤醒需要用户态和内核态的切换,比较消耗CPU资源,属于重量级锁以及悲观锁的范畴。从jdk1.6开始,Synchronized锁有了一定的优化,偏向锁和轻量级锁是乐观锁,重量级锁才是悲观锁。偏向锁对象锁会偏向于第一个获得它的线程,考虑到大部分情况是无锁状态,一个线程获取到了某个对象的访问,那么下次大概率还是可以获取到这个对象的访问的,那么此时就不需要加锁,不需要进行同步操作。一个线程获取到只需要在对象的Mark Word上加个01(偏向模原创 2021-03-15 10:34:04 · 161 阅读 · 0 评论 -
jdk Thread状态与生产者消费者模型
public enum State { /** * Thread state for a thread which has not yet started. */ NEW, /** * Thread state for a runnable thread. A thread in the runnable * state is executing in the Java virtual machine but it may ...原创 2021-03-01 17:43:06 · 167 阅读 · 0 评论 -
java多线程之wait,join,yield
java多线程同步一般用的是synchronized关键字,对其他几个函数wait,join,yield用的不多,尤其是join,yield总是很模糊,现在理一理加深印象。1、waitwait用于进入对象锁相关的等待池中,执行wait后会释放对象锁,此时其他线程可以访问获取对象锁了。wait()经常与notify()(唤醒等待池中的任意一个wait对象),notifyAll(唤醒等待池...原创 2020-01-31 20:31:38 · 462 阅读 · 0 评论 -
mysql踩坑以及jdk不同版本切换
1、mysql配置电脑右键->属性->高级系统设置->高级->环境变量->系统变量,编辑path变量添加mysql bin文件目录,比如本人的是D:\Program Files (x86)\MySQL\MySQL Server 5.0\bin2、cmd命令net start mysql启动3、mysql -u root -p 登陆报错ERROR 1045 (28000): Access denied for user 'ODBC'@'localhost'开始按钮原创 2020-10-01 10:50:02 · 405 阅读 · 0 评论 -
java动态代理
静态代理是通过实现类去继承接口并实现接口方法来实现;而动态代理并没有这个实现类,动态代理在运行时通过Proxy.newProxyInstance()去动态创建接口对象,然后去调用接口方法。通过Proxy.newProxyInstance()创建接口实例,该方法的主要源码如下(有删减),其实就是通过接口类和类加载器获得代理类,通过反射得到代理类的构造函数,进而创建一个对象出来。 /*...原创 2020-01-27 21:17:49 · 163 阅读 · 0 评论 -
java同步方式
1、voliatevoliate赋予变量在多线程中的可见性,只能作用于变量,非堵塞。java内存模型(如下图)描述了多线程之间信息交换和同步的方式:每个线程都从主内存load一份数据到自己的工作内存,线程对变量的读写操作都是在工作内存中进行的,然后在save到主内存。如果多线程同时操作主内存同意拷贝变量a,那么就可能导致变量的值乱掉,voliate保证了voliate变...原创 2019-05-26 18:55:17 · 1626 阅读 · 0 评论 -
jdk1.8中HashMap内部实现
jdk1.8之前HashMap的底层实现是数组+链表,从jdk1.8开始,HashMap的底层实现是数组+链表+红黑树。Node(int hash, K key, V value, Node<K,V> next) { this.hash = hash; this.key = key; this.value...原创 2018-10-21 16:41:16 · 195 阅读 · 0 评论 -
java反射
RTTI用于编译期查看程序信息,反射则是在运行期查看以及修改class信息,很多框架都会用到反射。一、访问对于类对象1、通过类的全路径名Class clz = Class.forName("reflect.Person"); //类的全路径访问类对象2、通过类名Class clz=Person.class; //类名访问类对象3、通过实例对象访问类对象Person...原创 2018-12-08 15:05:48 · 136 阅读 · 0 评论 -
注解
注解(也称为“元数据”)可以为代码添加信息,它可以让元数据与源代码文件结合在一起,而不是保存在外部文档中。注解可以用来深沉描述符文件,甚至新类的定义,并且有助于减轻编写“模板”代码的负担。@interface 用来声明一个注解,注解和接口很像,注解也会被编译成class文件,比如下面这样,只是比接口多了一个@符号 @Target(ElementType.METHOD) @R...原创 2018-12-02 15:50:39 · 170 阅读 · 0 评论 -
遇到多个构造器参数时考虑用构建器
静态工厂方法和构造器有个共同的局限性:它们都不能很好地扩展到大量的可选参数。在android开发中有时需要自定义Dialog类,这些Dialog有两个域是必需的:context,message,还有一些域是可选的:title,positiveButton,negativeButton,imageView,positiveClickListener,negativeClickListener等。 对原创 2017-06-24 13:57:33 · 341 阅读 · 0 评论 -
Java中容器类之Collection和Map浅谈
一、Collection一个独立元素的队列,这些元素都服从一条或多条规则。List必须按照插入顺序保存元素;Set不允许有重复元素;Queue按照队列规则来确定对象产生顺序,只能从一端插入对象,并从另一端移除对象。1、ListArrayList和LinkedList都是List类型,他们都是按照插入的顺序保存元素,两者的不同是执行某些操作的性能。ArrayList内部实现可变数组,...原创 2018-08-18 11:43:44 · 202 阅读 · 0 评论 -
UML
UML(统一建模语言)shi面向对象软件的标准化建模语言,主要包含事物、关系和图三个构造块。一、事物1、结构事物模型的静态部分,描述概念或物理属性。结构性事物包括类(class)、接口(interface)、写作(collaboration)、用例(use case)、构件(component)、制品(artifact)和节点(node)。2、行为事物模型的动态部分,描述了跨越...原创 2018-09-24 23:11:01 · 326 阅读 · 0 评论 -
Java浅拷贝和深拷贝
java拷贝默认是浅拷贝,比如System.arraycopy()和clone()。java中将一个对象复制到另外一个对象上主要由直接赋值、深拷贝和浅拷贝三种方式。一、基本类型赋值1、先看下基本类型int和String对象拷贝的例子 String s1 = "aaaa"; String s2 = s1; int a=3; ...原创 2018-10-02 11:39:11 · 315 阅读 · 0 评论 -
java运行时数据区
1、程序计数器线程私有,用于记录线程内字节码的行号,字节码解释器通过程序计数器来获取下一个需要执行的字节码指令。如果执行的是本地方法,则计数器为空。程序计数器不会发生OutOfmemoryError。2、虚拟机栈(Java Virtual Machine Stacks)线程私有,描述Java方法执行的内存模型:每个方法执行时都会创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法...原创 2018-09-20 20:29:39 · 138 阅读 · 0 评论 -
hashCode() 、 equals()、==
一、三者关系java的Object类对hashCode() 方法注解有这么一句解释hashCode和equals的关系* <li>If two objects are equal according to the {@code equals(Object)}* method, then calling the {@code hashCode} method on e...原创 2018-10-31 20:05:10 · 101 阅读 · 0 评论 -
HashMap,HashTable,ConcurrentHashMap
一、HashMap和HashTable1、HashTable是一个从jdk1.0就有了;HashMap从jdk1.2才加入,现在HashTable已废弃。2、HashTable底层实现是数组+链表;HashMap底层实现是数组+链表+红黑树(jdk1.8加入红黑树)。3、HashTable是线程安全的,每个方法都是同步的,所以效率低;HashMap不是线程安全的,未加锁,效率高。4...原创 2018-11-03 19:32:45 · 134 阅读 · 0 评论 -
方法锁、对象锁、类锁
一、java内存模型java内存模型规定了所有变量都存储在主内存(Main Memory)中,每个线程还有自己的工作线程(Working Memory),线程的工作内存保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有读写操作都必须在工作线程中进行,而不能直接读写主内存中的变量(这里的变量指的是实例字段、静态字段和构成数组对象的元素以及堆上的数据)。不同线程之间也无法直接访问其它线程工...原创 2018-11-04 15:22:18 · 921 阅读 · 0 评论 -
用静态工厂方法代替构造器
面对更新迅速的互联网技术,非科班出身的孩子更要努力学习。最近在学习android的同时也同步学习数据结构与算法(我的简书http://www.jianshu.com/u/62f2144f08e0,欢迎观看)与Effective Java。尤其是Effective Java,看了顿时觉得书上说的好有道理,感觉进入了一个新的学习领域。 静态工厂方法相对于构造器的优势: 1、静态工厂方法有名称。 构原创 2017-05-30 20:23:49 · 598 阅读 · 0 评论