1、java里的锁总结(synchronized隐式锁、Lock显式锁、volatile、CAS)
2、Java中的锁分类 - byhieg
3、Java内部类不能引用本地变量
- 原因:局部变量的生命周期与局部内部类的对象的生命周期的不一致性!
设方法f被调用, 在它的调用栈中生成了变量i,此时产生了一个局部内部类对象inner_object,它访问了该局部变量i .当方法f()运行结束后,局部变量i就已死亡了,不存在了.但局部内部类对象inner_object还可能一直存在(只能没有人再引用该对象时,它才会死亡),它不会随着方法f()运行结束死亡.这时出现了一个结果:局部内部类对象inner_object要访问一个已不存在的局部变量i就会报错。 - 解决方法二:
当变量是final时,通过将final局部变量”复制”一份,复制品直接作为局部内部中的数据成员.这样:当局部内部类访问局部变量时,其实真正访问的是这个局部变量的”复制品”(即:这个复制品就代表了那个局部变量).因此:当运行栈中的真正的局部变量死亡时,局部内部类对象仍可以访问局部变量(其实访问的是”复制品”) - 方法一:1、在外部方法之前声明该变量就行了
4、安卓OnTouchListener,onTouchEvent,onClickListener执行顺序
- 执行OnTouchListener,之后为onTouchEvent,最后才执行onClickListener内的方法
- 至于为什么OnTouchListener和onTouchEvent执行了两次,是因为在DOWN和UP时两个方法都被调用,至于onClickListener则只在UP的时候调用
5、并发volatile关键字如何保证可见性和有序性及底层实现原理
- 1.Lock前缀指令会引起处理器缓存会写到内存
2.一个处理器的缓存回写到内存会导致其他处理器的缓存失效
6、HashMap源码解析、jdk7和8之后的区别、相关问题分析
7、String a = "a" + "b" + "c"; 创建了 5个对象
hashmap:
- Node结构中有key字段、有value字段、还有next字段、还有hash字段
- hash值是key是hashcode二次加工得到的 : key的hashcode高16位^低16位得到的一个新值
- 寻址算法:hash & (table.length - 1)
- 任何(数)与高位全部为0、低位都是一串1的数按位与之后,它得到的这个数值定是>=0且<=这个二进制数的,然后带上数组的下标为0的slot ,加起来正好..为2的次方数.
套接字:
- 套接字的用途
Socket被用于客户端/服务端应用框架中。服务端是一个针对客户端的请求执行某些特定操作的进程。大多数应用层协议如FTP、SMTP和POP3使用Socket来建立客户端与服务端之间的连接,从而进行数据的交换。
- 套接字的类型
- 常见的套接字类型有三种。前两种被广泛地使用,而后一种使用较少。
一般情况下假定进程间使用同种类型的socket进行通讯,但事实上不同类型的socket之间并没有通讯上的限制。- 流套接字:提供面向连接、可靠的数据传输服务。该服务将保证数据能够实现无差错、无重复发送,并按顺序接收。如果你通过流套接字发送三个字符”A, B, C”,它们将会以同样的顺序到达——”A, B, C”,原因在于流套接字使用TCP(传输控制协议)进行数据传输。如果传输失败,发送方将会收到错误提示符。
- 数据包套接字:提供无连接服务。你无需像使用流套接字那样建立一个连接,而只需将目的地址信息一同打包后发送出去。该服务使用UDP(用户数据报协议)进行传输,延迟小且效率高,缺点是不能保证数据传输的可靠性。
- 原始套接字:允许用户对底层通讯协议进行访问。能够对底层的传输机制进行控制,因此可以用原始套接字来操纵网络层和传输层应用。原始套接字并不是给普通用户使用的,它们主要被用于开发新的通讯协议,或是用来获取已有通讯协议的一些隐蔽功能的访问权限。
- java接口:
- 在需要使用接口传递数据的一方定义一个接口的实例,用以保存外界传入的接口监听对象;使用这个接口实例调用接口方法:传递数据。
- 在需要监听数据数据的一方实现接口方法(在这里得到数据);设置接口的监听对象为当前对象。
- 接口和传递数据的一方可以先定义好,在需要监听数据时,再实现监听数据的一方(区别与普通的方法,普通的方法只能是在知道监听数据的一方后,才能编写发送数据的一方)
// 接口
interface IRentHouseService{
fun rentDidFinished(data:String)
}
class Agent{
var listener:IRentHouseService? = null
fun rentHouse(){
listener?.rentDidFinished("传递的数据")
}
}
class Person:IRentHouseService{
var a:String? = null
fun needHouse(){
val xw = Agent()
xw.listener = this
xw.rentHouse()
}
override fun rentDidFinished(data: String) {
println("接收到的数据 $data")
a = data
}
}
- kotlin高阶函数回调数据:
高阶函数使用:
- 定义
- 实现(谁用谁实现)
- 调用(一般是定义方调用)
// 定义 : 高阶函数 (在自定义类)
var callBack:((Int) -> Unit)? = null
// 实现 (在MainActivity中接收传递过来的值)
animator_View.callBack = {
Log.v("yk","我被点击了 + $it")
}
// 调用 ( 在自定义类中传递数组出去)
override fun onTouchEvent(event: MotionEvent?): Boolean {
when (event?.action){
MotionEvent.ACTION_DOWN ->{
callBack?.let {
it(20)
}
}
}
return true
}
网友评论