2020暑期实习笔面试review(三)

在牛客刷题时遇到的几个知识盲点

1. Java相关

1.1 四种引用总结(强、软、弱、虚)

强引用:一个对象只要有强引用存在,Java GC就不会回收它,无论内存有多紧张,这也是可能发生内存泄漏的一个点

软引用:如果一个对象只有软引用存在,那么内存空间足够的时候,GC不会回收它。只有当内存空间不足的时候,GC才会去回收软引用对象。适合做缓存。

弱引用:一个只具有弱引用的对象,只要垃圾回收的线程发现它,就会回收它,无论内存空间是否足够。

虚引用:一个只具有虚引用的对象,它就跟没有引用一样,随时可能被GC回收。虚引用必须和引用队列(ReferenceQueue)联合使用。

1.2 Java基本数据类型

在这里插入图片描述

1.3 Java并发线程

1.3.1 ThreadLocal

ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。

1.3.2 Synchronized

在Java中synchronized可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。

1.3.3 Volatile

volatile让变量每次在使用的时候,都从主存中取。而不是从各个线程的“工作内存”。
volatile具有synchronized关键字的“可见性”,但是没有synchronized关键字的“并发正确性”,也就是说不保证线程执行的有序性。
也就是说,volatile变量对于每次使用,线程都能得到当前volatile变量的最新值。但是volatile变量并不保证并发的正确性。

1.4 final关键字

final修饰类:(这个类不能被继承,俗称太监类,不能有孩子)可提高安全性,提高程序的可读性
final修饰方法:不能够被子类进行重写,如果写了也会报错
final修饰属性:此属性就是一个常量,一旦初始后,不可再被赋值。习惯上,用大写字符表示。
final修饰引用:引用不可改变,引用对象的属性可以改变。

2. Android相关

2.1 handler

handler的作用有两个,发送消息和处理消息。而handler发送的消息被送到指定MessageQueue(消息队列)中

MessageQueue(消息队列):用来储存各个子线程的消息。由Looper来关系。所以也可以说想让handler正常工作,必须在当前线程中有一个Looper对象。(每个线程只有一个消息队列)

Looper:每个线程只有一个Looper,相当于是利用消息队列的方式 ,他负责管理MessageQueue,loop()方法会不断的从MessageQueue取出消息,分发给对象的handler。

Message(消息)类是通信内容的载体。线程间的通信包含哪些数据等等信息,都是由Message来保存。通常对Message对象不是直接new出来的,只要调用handler中的obtainMessage方法来直接获得Message对象。
属性字段:arg1、arg2、what、obj、其中arg1和arg2是用来存放整型数据的;what是用来保存消息标示的;obj是Object类型的任意对象;

如何使用handler?
(1)在UI线程中创建Handler匿名内部类对象;
(2)在匿名内部类中重写HandleMessage方法;
(3)在UI线程中启动子线程;
(4)在线程中获得Message对象;
(5)将需要传递的message赋值到message中;
(6)通过Handler对象的sendMessage方法发送消息到消息队列中;
(7)在handleMessage方法中接受消息。

2.2 AsyncTask

什么是AsyncTask
1.AsyncTask是Android提供的轻量级( 实现代码量少) 的异步类。
2.为了降低异步通信的开发难度,提供了AsyncTask。
3.AsyncTask直接继承于0bject类,位于android.os包中。
4.使用AsyncTask可以忽略Looper、MessageQueue、Handler
等复杂对象,更便捷的完成异步耗时操作。

详情可见此链接链接: 本文为CSDN博主「YiXingLing」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。.

原创文章 31 获赞 3 访问量 1395

猜你喜欢

转载自blog.csdn.net/qq_45254908/article/details/105175523