java高级编程
文章平均质量分 53
libinbin147256369
这个作者很懒,什么都没留下…
展开
-
ClassLoader基础
ClassLoder类型BootClassLoader主要加载Android SDK中的class文件,如Activity.classPathClassLoader主要加载应用的class文件,如:MainActivity.classDexClassLoader主要是加载用户自定义的class文件,如插件化加载data/data目录下的apk文件PathClassLoader和DexClassLoader的区别 DexCla...原创 2021-07-28 16:41:36 · 172 阅读 · 0 评论 -
Dalvik和ART
什么是DalvikDalvik是适用于Android平台的java虚拟机,支持.dex格式的java应用程序运行。什么是ART Android Runtime,Android4.4提供的一种与Dalvik完全不同的运行时环境,在5.0以及以上的版本默认是ART环境。在应用安装的时候,预编译字节码到机器码,这种机制叫做AOT(Ahead Of Time),应用安装会变慢,但是运行效率会更高。Dalvik和ART的区别1.Dalvik在运行时,需要解释执行,常...原创 2021-07-28 10:05:19 · 279 阅读 · 0 评论 -
JVM垃圾回收
GC如何判断对象的存活引用计数法 对象之间有引用,那么引用计数+1,引用消失,引用计数减一,引用计数为0的时候,对象可以释放。 如果是相互引用的对象,无法释放,例如:A引用B,B引用A,他们的引用计数都是2,把A指向null,B指向null,引用计数都只能减一。可达性分析 从GC Roots出发,判断对象是否可达。如果创建A:Object a = new Object(),B:Object b = new Object(),a=b,此时是把...原创 2021-07-27 22:47:24 · 147 阅读 · 0 评论 -
运行时数据区
程序计数器 线程私有的,随着线程创建和销毁。指当前线程正在执行的字节码地址(行号)。Java是多线程的,意味着有线程切换,确保多线程下程序能够正常执行。虚拟机栈 线程私有的,随着线程创建和销毁。 为什么使用栈结构,因为符合方法间的调用,例如:A方法调用B,B调用C,最后是C结束,B结束,A结束,先进后出的顺序。 每个方法执行的时候,会创建一个帧栈,帧栈可以分为:局部变量表,操作数栈,动态链接,返回地址。...原创 2021-07-27 15:06:49 · 71 阅读 · 0 评论 -
线程池和阻塞队列
阻塞队列add/remove如果队列满了,add(T)会抛出异常如果队列为空,remove()会抛出异常offer/poll如果队列满了,offer(T)会返回false如果队列为空,poll()会返回nullput/take如果队列满了,put(T)会阻塞如果队列为空,take()会阻塞常用的阻塞队列LinkedBlockingQueue...原创 2021-07-26 22:24:49 · 468 阅读 · 0 评论 -
线程间的共享和协作
synchronizedsynchronized是内置锁,分为对象锁和类锁。可以用于方法,代码块中。如果是方法,锁的是this对象,如果是代码块,锁的是指定的那个对象。类锁其实是一个不太准确的说法,应用于静态方法,本质上锁的是该Class对象等待和通知的标准范式等待方获取对象锁 检查条件,条件不满足,调用对象wait 执行业务代码synchronized(对象){ while(不满足条件){ 对象.wait();}...原创 2021-07-26 10:35:24 · 63 阅读 · 0 评论 -
线程中断的方式
stop()强制中断线程,可能导致线程中的资源没有释放,比如在try-catch-finally中释放资源,直接中断,不会调用finally块。new Thread().interrupte() 协作式的中断线程,不会强制中断线程,会发一个interrupt的信号,线程run方法中,如果有Thread.sleep()或者wait,捕获了InterruptedException,会命中该catch, 重置interrupt标记位,如果需要处理该标记位,需要显示调用interrupt...原创 2021-07-25 13:06:36 · 183 阅读 · 0 评论 -
多线程基础知识
进程和线程的区别进程是操作系统资源分配的最小单位,包括CPU,磁盘io。一个app是一个进程,四大组件可以在清单文件中通过process指定所在进程。Android中启动一个进程,会创建一个主线程,即ui线程。线程是CPU调度的最小单位,会共享进程中的所有资源,java多线程是通过CPU时间轮转机制实现的。并行和并发 并行是同时执行,比如4核8线程,并行数为8 并发是跟时间有关,指单位时间内,执行的数量。java中是通过CP...原创 2021-07-25 11:14:37 · 149 阅读 · 2 评论 -
java静态代理和动态代理
代理模式三大角色抽象接口:声明了真实对象和代理对象的公共接口代理对象:包含真实对象,用户访问的是代理对象,代理对象再访问真实对象真实对象:提供真正的能力静态代理的问题静态代理一般是一对一的形式,如果要新增真实对象类型,那么需要修改代理对象,违反了设计模式中的开闭原则动态代理在运行时创建代理对象,新增真实对象,只需要设置真实对象,然后动态创建代理对象即可。例子public interface IFactory { void sale();}...原创 2021-07-24 22:49:56 · 69 阅读 · 0 评论 -
java反射
获取Class对象的方式Test test = new Test();Class class1 = Test.class;Class class2 = test.getClass();try { Class class3 = Class.forName("com.example.myapplication.test.Test");} catch (ClassNotFoundException e) { e.printStackTrace();}//方式4try { Cl原创 2021-07-24 19:00:10 · 92 阅读 · 0 评论 -
java泛型
好处规定集合的类型,只能传入改泛型限定的类型,避免强转 多个类型,执行相同逻辑的代码,避免多次重载。泛型接口子类实现泛型接口,可以指定它也是泛型 class B<T> implement A<T> 子类实现泛型接口,直接implement A<String>泛型方法指定泛型方法接受的参数和返回值,public <T> T genericMethod(T t){} 泛型方法在调用的时候,可以省略<T>, a.<String原创 2021-07-24 17:19:08 · 98 阅读 · 0 评论 -
别名现象
别名现象别名现象,是java操作对象的一种基本方式解释原本t1包含的对对象的引用,是指向一个值为9的对象,在对t1赋值为t2的时候,这个引用被覆盖了,t1和t2同时指向了值为47的对象,也就是t1,t2包含的是相同的引用,指向同一个对象....原创 2019-09-23 21:44:09 · 220 阅读 · 0 评论 -
理解:加号的唯一作用就是将较小数据类型的操作数提升为int
一个图看懂,一元加号的作用仅仅是将较小数据类型的操作数提升为int原创 2019-09-23 10:08:45 · 321 阅读 · 0 评论 -
两个线程一个打印1,一个打印2,要求循环打印1212121212
两个线程一个打印1,一个打印2,要求循环打印121212方法1:分析问题两个线程,可以想到的是多线程编程,共享变量,数据等,设想先让一个线程打印1,然后处于等待(wait)状态,接着另一个线程打印2,然后唤醒(notify)线程1,线程2再进入等待(wait)状态,线程1被唤醒后接着打印1,依次循环输出即可代码public class Test { static final Object ...原创 2018-04-12 11:13:58 · 2690 阅读 · 2 评论