出处:2019年某司秋招题
问题链接:本人在笔试中遇到的,不便透露公司
参考文章:https://blog.youkuaiyun.com/wk_beicai/article/details/78523449
https://www.cnblogs.com/mzhou/p/3941008.html
------------------------------------------------------------ 我的理解 ----------------------------------------------------------------
1. SharedPreferences的内部工作原理如下:
(1)getSharedPreferences()在创建一个SharedPreferences,会先判断是否有对应的xml文件(SharedPreferences存储数据的保存格式),如果存在则会有一个预加载操作,这个操作将把xml文件的内容通过I/O操作和xmlUtil解析后保存在一个map对象中。如果不存在则会创建一个对应的xml。
(2)而在对数据进行读取时,是从内存中该map对象中进行读取;
(3)在使用SharedPreferences保存数据时,主要分为以下两步:把数据先写入内存,写到map集合中、将数据写到硬盘文件保持一致性;由此可以得出,数据在保存的时候,是以key-value的格式保存在xml文件中。
(4)写完数据后,要对写入的数据进行提交保存,主要有以下两种方式:
a. commit():线程安全,性能慢,一般在当前线程完成文件操作,会有返回值;
b. apply():线程不安全,性能高,异步处理I/O操作,一般在singleThreadExecutor中执行,没有返回值
2. SharedPreferences根据官方文档说明,是不支持多线程的,而且也不是线程安全的,但是我们可以通过实现SharedPreferences接口来支持多线程操作,主要实现代码如下:
private static final class SharedPreferencesImpl implements SharedPreferences {
...
public String getString(String key, String defValue) {
synchronized (this) {
String v = (String)mMap.get(key);
return v != null ? v : defValue;
}
}
...
public final class EditorImpl implements Editor {
public Editor putString(String key, String value) {
synchronized (this) {
mModified.put(key, value);
return this;
}
}
...
}
}
延伸:
(1)SharedPreferences只能保存Java基本数据类型(boolean、char、short、int、long、float、double),对于其他复杂数据类型,将通过base64编码成字符串进行保存。
(2)Android提供了五种数据存储方式:
a. ShardePreferences:存储目录为/data/data/<package name>/Shared_Pref
b. 文件存储数据:存储目录为/data/data/<package name>/files
c. SQLite数据库存储数据:存储目录为/data/data/<package name>/database
d. ContentProvider:统一了数据访问接口,需要用的类还有Uri、UriMatcher和ContentUris