小标
2018-11-05
来源 :
阅读 1291
评论 0
摘要:本文主要向大家介绍了JAVA语言关键字、集合、线程、进程、类加载和字符串等习题讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
本文主要向大家介绍了JAVA语言关键字、集合、线程、进程、类加载和字符串等习题讲解,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助。
关键字和字符串相关
1、Synchronized + Volatile
可以参照这边文章:Synchronized和Volatile学习
2、Serializable+Parcelable
因为暂时没有写,先参照:序列化和反序列化
3、String、StringBuffer和StringBuilder
可变性
String类用字符数组保存字符串,即private final char value[],所以String对象不可变StringBufferr类与StringBuilder类都是继承AbstractStringBuilder类,AbstractStringBuilder是用字符数组保存字符串,即char value[],所以StringBuffer与StringBuilder对象是可变的线程安全性String类对象不可变,所以理解为常量,线程安全StringBuffer类对方法加了同步锁,线程安全StringBuilder类对方法未加同步锁,线程不安全性能String类进行改变的时候,都会产生新的String对象,然后将指针指向新的String对象StringBuffer进行改变的时候,都会复用自身对象,性能比String高StringBuilder行改变的时候,都会复用自身对象,相比StringBuffer能获得10%~15%左右的性能提升,但是得承担多线程的不安全的风险
集合相关
Jvm相关
1、JVM的定义 ---Java Virtual Machine
2、内存划分
3、执行过程
4、JMM模型
Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽掉各种硬件和操作系统的访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果,注意一下,此处的变量并不包括局部变量与方法参数,因为它们是线程私有的,不会被共享,自然也不会存在竞争,此处的变量应该是实例字段、静态字段和构成数组对象的元素。
5、happen-before指令重排序优化
指令重排序的原因:对主存的一次访问一般花费硬件的数百次时钟周期。处理器通过缓存(寄存器、cpu缓存等)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操作的顺序。也就是说,程序的读写操作不一定会按照它要求处理器的顺序执行,
简单的说:就是为了尽可能减少内存操作速度远慢于CPU运行速度所带来的CPU空置的影响,虚拟机会按照自己的一些规则将程序编写顺序打乱。
这就涉及到JMM中并发编程的三大保障
原子性,对基本数据类型的变量的读取和赋值操作是原子性操作,即这些操作是不可被中断的,要么执行,要么不执行;
可见性,当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。
而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。
另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性
有序性,Java内存模型具备一些先天的“有序性”,即不需要通过任何手段就能够得到保证的有序性,这个通常也称为 happens-before 原则。如果两个操作的执行次序无法从happens-before原则推导出来,那么它们就不能保证它们的有序性,虚拟机可以随意地对它们进行重排序。
6、GC
Java内存模型和垃圾回收机制
线程相关
1、创建线程的方式
继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的线程
2、40个线程问题
sleep和wait方法区别?
这两个方法来自不同的类分别是Thread和Object
最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
进程相关
1、进程的优先级
优先级从低到高排列,优先级最高的进程,最先获取资源,最后释放
1、空进程
这是Android系统优先杀死的,因为此时该进程已经没有任何用途
2、后台进程
包含不可见的Activity,即跳转到其他Activity后,由于资源不足,系统会将原来的Activity杀死(即跳转的来源)
3、服务进程
即Service,当系统资源不足时,系统可能会杀掉正在执行任务的Service,因此在Service执行比较耗时的操作,并不能保证一定能执行完毕
4、可见进程
当前屏幕上可以看到的Activity,例如显示一个对话框的Activity,那么对话框变成了前台进程,而调用他的Activity是可见进程,但并不是前台的
5、前台进程
当前处于最前端的Activity,也就是Android最后考虑杀死的对象,一般来说,前台进程Android系统是不会杀死的,只有当前4个都杀掉资源依旧不够才可能会发生
2、IPC机制
类加载相关
1、什么是类加载器
ClassLoader是用来动态加载class文件到内存中
2、类加载器类型
参照:Android动态加载之ClassLoader详解
3、双亲委托模型(父委托加载机制)
双亲委派模型(Parernts Delegation Model),先委托父类加载器寻找目标类进行加载,如果父类不能加载,则去寻找Bootstrap加载器进行加载,Bootstrap不能加载,则会通过findClass( )去加载对应的路劲
protected Class loadClass(String name, boolean resolve)
throws ClassNotFoundException
{
// First, check if the class has already been loaded
Class c = findLoadedClass(name);
if (c == null) {
try {
if (parent != null) {
c = parent.loadClass(name, false);
} else {
c = findBootstrapClassOrNull(name);
}
} catch (ClassNotFoundException e) {
// ClassNotFoundException thrown if class not found
// from the non-null parent class loader
}
if (c == null) {
// If still not found, then invoke findClass in order
// to find the class.
c = findClass(name);
}
}
return c;
}
4、双亲委派模型在热修复领域的应用
一个ClassLoader可以有多个DEX文件,每个Dex文件是一个Element,多个Dex文件排成一个有序数组dexElements,当找类的时候,会按照排序遍历DEX文件,然后从当前遍历的DEX文件中找类,由于双亲委托模型机制,值要找到就会停止查找并返回,如果找不到就从下一个DEX文件继续查找。只要我们先加在修复好的DEX文件,那么就不会加载有bug的DEX文件了。
另外,假设app中有个了叫做A,再其内部引用了B,发布过程中发现B有编写错误,那么想要发布一个新的B类,那么你就要阻止A这个类上CLASS_ISPREVERIFIED的标志。
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注编程语言JAVA频道!
喜欢 | 1
不喜欢 | 0
您输入的评论内容中包含违禁敏感词
我知道了

请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号