什么是java类加载的三级缓存
时间: 2023-12-24 07:04:16 浏览: 33
Java类加载的三级缓存指的是Java虚拟机在加载类时使用的缓存机制,分为三个级别:
1. Bootstrap ClassLoader缓存:缓存JVM核心类库,由C++实现,无法被Java代码访问。
2. Extension ClassLoader缓存:缓存Java扩展库中的类,通常为$JAVA_HOME/jre/lib/ext目录下的jar包。
3. Application ClassLoader缓存:缓存应用程序自己的类,由Java代码实现。
当一个类被加载时,JVM首先从Bootstrap ClassLoader缓存中查找,如果找到了则直接返回,否则继续查找Extension ClassLoader缓存,如果还是找不到,则从Application ClassLoader缓存中查找,如果最终还是找不到,则会抛出ClassNotFoundException异常。
三级缓存的设计可以提高类的加载效率,并且避免同一个类被重复加载。同时,三级缓存也可以被用户自定义,以满足不同的需求。
相关问题
给我一个安卓图片三级缓存的工具类,包括一级缓存网络缓存,二级缓存内存缓存,三级缓存磁盘缓存,并且支持视频序缩略图的查看,异步加载,该程序由java语言编写。
以下是一个简单的安卓图片三级缓存的工具类:
```java
public class ImageLoader {
private static final int MAX_MEMORY_CACHE_SIZE = (int) (Runtime.getRuntime().maxMemory() / 8);
private static final int MAX_DISK_CACHE_SIZE = 50 * 1024 * 1024;
private static final int IO_BUFFER_SIZE = 8 * 1024;
private static final String IMAGE_CACHE_DIR = "image_cache";
private static ImageLoader instance;
private LruCache<String, Bitmap> memoryCache;
private DiskLruCache diskCache;
private ImageLoader(Context context) {
initMemoryCache();
initDiskCache(context);
}
public static synchronized ImageLoader getInstance(Context context) {
if (instance == null) {
instance = new ImageLoader(context);
}
return instance;
}
private void initMemoryCache() {
memoryCache = new LruCache<String, Bitmap>(MAX_MEMORY_CACHE_SIZE) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getByteCount();
}
};
}
private void initDiskCache(Context context) {
try {
File cacheDir = getDiskCacheDir(context, IMAGE_CACHE_DIR);
diskCache = DiskLruCache.open(cacheDir, BuildConfig.VERSION_CODE, 1, MAX_DISK_CACHE_SIZE);
} catch (IOException e) {
e.printStackTrace();
}
}
private File getDiskCacheDir(Context context, String uniqueName) {
final String cachePath = context.getCacheDir().getPath();
return new File(cachePath + File.separator + uniqueName);
}
public void displayImage(final ImageView imageView, final String url) {
imageView.setTag(url);
Bitmap bitmap = getBitmapFromMemoryCache(url);
if (bitmap != null) {
imageView.setImageBitmap(bitmap);
return;
}
AsyncTask.execute(new Runnable() {
@Override
public void run() {
Bitmap bitmap = getBitmapFromDiskCache(url);
if (bitmap != null) {
addBitmapToMemoryCache(url, bitmap);
if (imageView.getTag().equals(url)) {
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
}
return;
}
try {
bitmap = getBitmapFromUrl(url);
addBitmapToMemoryCache(url, bitmap);
addBitmapToDiskCache(url, bitmap);
if (imageView.getTag().equals(url)) {
imageView.post(new Runnable() {
@Override
public void run() {
imageView.setImageBitmap(bitmap);
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
}
private Bitmap getBitmapFromMemoryCache(String key) {
return memoryCache.get(key);
}
private void addBitmapToMemoryCache(String key, Bitmap bitmap) {
if (getBitmapFromMemoryCache(key) == null) {
memoryCache.put(key, bitmap);
}
}
private Bitmap getBitmapFromDiskCache(String key) {
try {
DiskLruCache.Snapshot snapshot = diskCache.get(key);
if (snapshot != null) {
InputStream inputStream = snapshot.getInputStream(0);
return BitmapFactory.decodeStream(inputStream);
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private void addBitmapToDiskCache(String key, Bitmap bitmap) {
try {
DiskLruCache.Editor editor = diskCache.edit(key);
if (editor != null) {
OutputStream outputStream = editor.newOutputStream(0);
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream);
editor.commit();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private Bitmap getBitmapFromUrl(String urlString) throws IOException {
InputStream inputStream = null;
try {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
inputStream = new BufferedInputStream(urlConnection.getInputStream(), IO_BUFFER_SIZE);
return BitmapFactory.decodeStream(inputStream);
} finally {
if (inputStream != null) {
inputStream.close();
}
}
}
}
```
使用该类加载图片只需调用 `displayImage()` 方法,该方法会先从内存缓存中查找图片,如果找到则直接显示在 ImageView 上,否则会异步去磁盘缓存中查找图片,如果找到则添加到内存缓存,并显示在 ImageView 上,否则会异步去网络上下载图片,下载完成后添加到内存缓存和磁盘缓存,并显示在 ImageView 上。该方法支持传入任何类型的 ImageView,包括 VideoView。
java三级联动下拉列表怎么实现
Java三级联动下拉列表的实现可以通过以下步骤完成:
1. 首先,需要准备好数据源,可以使用数据库中的表格或者是事先准备好的数组等数据结构。这些数据源中应包含三级联动下拉列表所需的数据,例如省、市、区等信息。
2. 在Java代码中定义三个下拉列表的对象,分别用于显示省、市、区的选项。可以使用Java Swing或者是其他前端框架进行界面的设计,并将这三个下拉列表添加到对应的位置上。
3. 为省下拉列表添加监听事件,当选择了某个省份时,触发该监听器,根据选择的省份,动态加载对应的市级数据到市下拉列表中。可以使用数据库查询或者是代码中的条件判断来获取对应省份的市级数据。
4. 同样地,为市下拉列表添加监听事件,当选择了某个市级时,触发监听器,根据选择的市级,动态加载对应的区级数据到区下拉列表中。同样可以使用数据库查询或者是代码中的条件判断来获取对应市级的区级数据。
5. 最后,当选择了区级数据后,根据用户的选择进行相应的操作。可以将选择的结果显示在界面上,或者是通过Java代码进行相关的处理。
通过以上步骤,就可以实现Java中的三级联动下拉列表。可以根据实际需求进行相应的优化和扩展,例如添加默认选项、使用缓存等。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)