基于DB4O的Java Map

基于DB4O的Java MapJava的Map是大家最常用的一个容器接口,它通过灵活的key/value结构存储数据。因为Map的简单易用很多工程师喜欢大量使用Map存放数据。但是Map的数据是存放在内存中,大量的数据存在内存中,不只是造成Java系统内存遍历慢的隐忧,更加可能系统内存溢出。针对这个问题,我们重新利用DB4O实现Map的接口,利用DB4O的对象高效的物理存储特性来减轻Java的内存压力。

大家好,又见面了,我是你们的朋友全栈君。



Java的Map是大家最常用的一个容器接口,它通过灵活的key/value结构存储数据。因为Map的简单易用很多工程师喜欢大量使用Map存放数据。但是Map的数据是存放在内存中,大量的数据存在内存中,不只是
造成Java系统内存遍历慢的隐忧,更加可能
系统内存溢出。
针对这个问题,我们重新利用DB4O实现Map的接口,利用DB4O的对象高效的物理存储特性来减轻Java的内存压力。
        大概逻辑图如下:
基于DB4O的Java Map


操作例子

package com.shine.framework.DB4o.example;

import java.util.HashMap;
import java.util.Map;

import com.shine.framework.DB4o.util.DB4oMap;

public class DB4oMapExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		/**=========== 简单对象存储 ============*/
		DB4oMap<String, Object> map = new DB4oMap<String, Object>(true);
		// 添加数据
		System.out.println(map.put("key1", "value1"));
		System.out.println(map.put("key1", "value2"));
		System.out.println(map.put("key1", "value3"));
		System.out.println(map.put("key1", "value4"));
		System.out.println(map.put("key2", "value2"));
		System.out.println(map.put("key3", "value3"));
		System.out.println(map.put("key4", "value4"));
		// 检查数据
		System.out.println(map.containsKey("key1"));
		System.out.println(map.containsValue("value1"));
		System.out.println(map.isEmpty());
		// 获取单条数据
		System.out.println(map.get("key2"));
		// 删除单条数据
		System.out.println(map.remove("key1"));
		System.out.println(map.remove("key4", "value4"));
		// 删除所有数据
		map.removeAll("key2");
		// 查询所有数据
		for (Object obj : map.getAll()) {
			System.out.println(obj);
		}
		// 遍历所有键
		for (String key : map.keySet()) {
			System.out.println(key);
		}
		// 遍历所有值
		for (Object value : map.values()) {
			System.out.println(value);
		}
		// 遍历所有的键值对
		for (Map.Entry<String, Object> entry : map.entrySet()) {
			System.out.println(entry.getKey() + " : " + entry.getValue());
		}
		// 清空所有数据
		map.clear();
		// 查询总数
		System.out.println(map.size());
		// 释放资源
		map.destroy();
		
		/**=========== 高级对象存储 ============*/
		DB4oMap<String, Map<String, String>> map2 = new DB4oMap<String, Map<String, String>>();
		// 添加数据
		Map<String, String> data1 = new HashMap<String, String>();
		data1.put("data1.key1", "data1.value1");
		data1.put("data1.key2", "data1.value2");
		Map<String, String> data2 = new HashMap<String, String>();
		data2.put("data2.key1", "data2.value1");
		data2.put("data2.key2", "data2.value2");
		Map<String, String> data3 = new HashMap<String, String>();
		data3.put("data3.key1", "data3.value1");
		Map<String, String> data4 = new HashMap<String, String>();
		data4.put("data4.key1", "data4.value1");
		data4.put("data4.key2", "data4.value1");
		data4.put("data4.key3", "data4.value1");
		map2.put("map1", data1);
		map2.put("map2", data2);
		map2.put("map3", data3);
		map2.put("map3", data4);
		// 检查数据
		System.out.println(map2.containsKey("map1"));
		System.out.println(map2.containsValue(data1));
		// 获取单条数据
		System.out.println(map2.get("map1"));
		// 移除单条数据
		System.out.println(map2.remove("map2"));
		// 移除指定键值对
		System.out.println(map2.remove("map1", data1));
		// 遍历所有键
		for (String key : map2.keySet()) {
			System.out.println(key);
		}
		// 遍历所有的键值对
		for (Map.Entry<String, Map<String, String>> entry : map2.entrySet()) {
			System.out.println(entry.getKey() + " : " + entry.getValue());
		}
		// 遍历所有的数据
		for (Map<String, String> datas : map2.getAll()) {
			for (Map.Entry<String, String> entry : datas.entrySet()) {
				System.out.println(entry.getKey() + ":" + entry.getValue());
			}
		}
		// 清空所有数据
		map2.clear();
		// 查询总数
		System.out.println(map2.size());
		map2.destroy();
	}

}



该例子实现感谢我的同事qun1988@gmail.com,如果大家有遇到什么问题,可以和他交流。


      svn地址:
      有兴趣可以把JavaFramework2.5这个svn下载下来
      


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162614.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python漫画阅读器 漫画网站只能左右翻页,没法上下滚动连续下拉式观看且广告多体验差?因涉及“版权不明”, 审核未通过

    python漫画阅读器 漫画网站只能左右翻页,没法上下滚动连续下拉式观看且广告多体验差?因涉及“版权不明”, 审核未通过没钱看正版漫画,盗版漫画网站只能左右翻页,没法上下滚动观看且广告多体验差?于是我写了个python爬虫。手机上无论是收费还是免费盗版的漫画都有各种各样的app可供选择,正版的像是腾讯动漫,哔哩哔哩漫画,菠萝包等等,免费的比如动漫之家,免费搜书大全阅读器等等。(说是搜书其实也能看漫画,本质就是一个爬虫);而且阅读的体验也都很不错,且大部分时候也都是在手机上阅读。但当我心血来潮在笔记本上看盗版漫画(穷学生一个)的时候发现很多的盗版漫画网站只有左右翻页观看,翻页很累,而且图片老大一张,网站又没有漫画图片大小调整

  • OHEM(Online Hard Example Mining)在线难例挖掘(在线困难样例挖掘) & HNM

    OHEM(Online Hard Example Mining)在线难例挖掘(在线困难样例挖掘) & HNMHardNegatieMining与OnlineHardExampleMining(OHEM)都属于难例挖掘,它是解决目标检测老大难问题的常用办法,运用于R-CNN,fastR-CNN,fasterrcnn等two-stage模型与SSD等(有anchor的)one-stage模型训练时的训练方法。OHEM和难负例挖掘名字上的不同。HardNegativeMining只注意难负例 OHEM则注意所有难例,不论正负(Loss大的例子)难例挖掘的思想…

  • 放一篇置顶博文随时说点什么

    放一篇置顶博文随时说点什么

  • SourceTree Gitflow 使用一 (Git项目转Gitflow)

    SourceTree Gitflow 使用一 (Git项目转Gitflow)1.克隆项目到本地2.SourceTree打开克隆的项目3点击master点击右上角git工作流

  • @ResponseBody注解的作用

    @ResponseBody注解的作用 1、  @ResponseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区(响应体中),通常用来返回JSON数据或者是XML。  数据,需要注意的呢,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,它的效果等同于通过response对象输出指定格式的数据。    这里…

  • LaTeX技巧218:LaTeX如何正确输入引号:双引号“”单引号‘’

    LaTeX技巧218:LaTeX如何正确输入引号:双引号“”单引号‘’最近看一些latex用户的文章,输入的双引号和单引号都是用输入法中的中文模式键入,并不是LaTeX的正确输入方式。正确的输入方法如下:使用键盘的Tab键上侧的连续键入两个“然后输入键盘的两个单引号”。单引号输入类似。示例如下:演示代码:   \documentclass{article}   \setlength\textwidth{150pt}   \be

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号