Java Map操作
同步方法:Map m = Collections.synchronizedMap(new TreeMap(...));
Hashtable:基于散列表的实现 允许空键空值 线程安全
HashMap:基于散列表的实现 允许空键空值 线程不安全 (与Hashtable基本一致)
TreeMap: 基于红黑树数据结构的实现 不允许空键空值 线程不安全
WeakHashMap:改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
在除需要排序时使用TreeSet,TreeMap外,都应使用HashSet,HashMap,因为他们的效率更高。
HashTable:
import java.util.Hashtable; public class Main { public static void main(String[] args) {
Hashtable ht = new Hashtable();
ht.put(new A(60000) , "11");
ht.put(new A(87563) , "22");
ht.put(new A(1232) , new B());
System.out.println(ht); //只要两个对象通过equals比较返回true,
//Hashtable就认为它们是相等的value。
//由于Hashtable中有一个B对象,
//它与任何对象通过equals比较都相等,所以下面输出true。
System.out.println(ht.containsValue("测试字符串")); //① //只要两个A对象的count相等,它们通过equals比较返回true,且hashCode相等
//Hashtable即认为它们是相同的key,所以下面输出true。
System.out.println(ht.containsKey(new A(87563))); //② //下面语句可以删除最后一个key-value对
ht.remove(new A(1232)); //③ //通过返回Hashtable的所有key组成的Set集合,
//从而遍历Hashtable每个key-value对
for (Object key : ht.keySet())
{
System.out.print(key + "---->");
System.out.print(ht.get(key) + "\n");
}
}
}
class A
{
int count;
public A(int count)
{
this.count = count;
}
//根据count的值来判断两个对象是否相等。
public boolean equals(Object obj)
{
if (obj == this)
return true;
if (obj!=null &&
obj.getClass()==A.class)
{
A a = (A)obj;
return this.count == a.count;
}
return false;
}
//根据count来计算hashCode值。
public int hashCode()
{
return this.count;
}
}
class B
{
//重写equals()方法,B对象与任何对象通过equals()方法比较都相等
public boolean equals(Object obj)
{
return true;
}
}
{com.company.A@ea60=11, com.company.A@1560b=22, com.company.A@4d0=com.company.B@5451c3a8}
true
true
com.company.A@ea60---->11
com.company.A@1560b---->22
LinkedHashMap:
import java.util.LinkedHashMap;
public class Main { public static void main(String[] args) {
LinkedHashMap scores = new LinkedHashMap();
scores.put("语文" , 80);
scores.put("英文" , 82);
scores.put("数学" , 76);
//遍历scores里的所有的key-value对
for (Object key : scores.keySet())
{
System.out.println(key + "------>" + scores.get(key));
}
}
}
语文------>80
英文------>82
数学------>76
Properties:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties; public class Main {
public static void main(String[] args) {
try {
Properties props = new Properties();
//向Properties中增加属性
props.setProperty("username", "yeeku");
props.setProperty("password", "123456"); //将Properties中的key-value对保存到a.ini文件中
props.store(new FileOutputStream("a.ini"), "comment line"); //① //新建一个Properties对象
Properties props2 = new Properties();
//向Properties中增加属性
props2.setProperty("gender", "male"); //将a.ini文件中的key-value对追加到props2中
props2.load(new FileInputStream("a.ini")); //②
}
catch(Exception e){
e.printStackTrace();
}
}
}
#comment line
#Thu Nov 10 13:45:53 CST 2016
password=123456
username=yeeku
会在项目根目录生成一个a.ini文件
import java.io.File;
import java.io.IOException;
import java.io.PrintStream;
import java.util.Properties; public class Main {
public static void main(String[] args) {
Properties p = new Properties();
p.setProperty("id","dean");
p.setProperty("password","123456");
System.out.println(p);
try{
PrintStream fW = new PrintStream(new File("d:\\test1.properties"));
p.list(fW );
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Properties; public class Main {
public static void main(String[] args) {
try {
Properties prop = new Properties();// 属性集合对象
FileInputStream fis = new FileInputStream("prop.properties");// 属性文件输入流
prop.load(fis);// 将属性文件流装载到Properties对象中
fis.close();// 关闭流 // 获取属性值,sitename已在文件中定义
System.out.println("获取属性值:sitename=" + prop.getProperty("sitename"));
// 获取属性值,country未在文件中定义,将在此程序中返回一个默认值,但并不修改属性文件
System.out.println("获取属性值:country=" + prop.getProperty("country", "中国")); // 修改sitename的属性值
prop.setProperty("sitename", "Boxcode");
// 添加一个新的属性studio
prop.setProperty("studio", "Boxcode Studio");
// 文件输出流
FileOutputStream fos = new FileOutputStream("prop.properties");
// 将Properties集合保存到流中
prop.store(fos, "Copyright (c) Boxcode Studio");
fos.close();// 关闭流
}
catch(Exception e){
e.printStackTrace();
}
}
}
TreeMap:
import java.util.TreeMap; public class Main { public static void main(String[] args) {
TreeMap tm = new TreeMap();
tm.put(new R(3) , "11");
tm.put(new R(-5) , "22");
tm.put(new R(9) , "33"); System.out.println(tm); //返回该TreeMap的第一个Entry对象
System.out.println(tm.firstEntry()); //返回该TreeMap的最后一个key值
System.out.println(tm.lastKey()); //返回该TreeMap的比new R(2)大的最小key值。
System.out.println(tm.higherKey(new R(2))); //返回该TreeMap的比new R(2)小的最大的key-value对。
System.out.println(tm.lowerEntry(new R(2))); //返回该TreeMap的子TreeMap
System.out.println(tm.subMap(new R(-1) , new R(4)));
}
}
class R implements Comparable
{
int count;
public R(int count)
{
this.count = count;
}
public String toString()
{
return "R[count:" + count + "]";
}
//根据count来判断两个对象是否相等。
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj!=null && obj.getClass()==R.class)
{
R r = (R)obj;
return r.count == this.count;
}
return false;
}
//根据count属性值来判断两个对象的大小。
public int compareTo(Object obj)
{
R r = (R)obj;
return count > r.count ? 1 : count < r.count ? -1 : 0;
}
}
{R[count:-5]=22, R[count:3]=11, R[count:9]=33}
R[count:-5]=22
R[count:9]
R[count:3]
R[count:-5]=22
{R[count:3]=11}
Set和Map的关系十分密切,java源码就是先实现了HashMap、TreeMap等集合,然后通过包装一个所有的value都为null的Map集合实现了Set集合类 WeakHashMap:
import java.util.WeakHashMap; public class Main { public static void main(String[] args) {
WeakHashMap whm = new WeakHashMap();
//将WeakHashMap中添加三个key-value对,
//三个key都是匿名字符串对象(没有其他引用)
whm.put(new String("语文") , new String("良好"));
whm.put(new String("数学") , new String("及格"));
whm.put(new String("英文") , new String("中等")); //将WeakHashMap中添加一个key-value对,
//该key是一个系统缓存的字符串对象。"java"是一个常量字符串强引用
whm.put("java" , new String("中等"));
//输出whm对象,将看到4个key-value对。
System.out.println(whm);
//通知系统立即进行垃圾回收
System.gc();
System.runFinalization();
//通常情况下,将只看到一个key-value对。
System.out.println(whm);
}
}
{英文=中等, java=中等, 数学=及格, 语文=良好}
{java=中等}
如果需要使用WeakHashMap的key来保留对象的弱引用,则不要让key所引用的对象具有任何强引用,否则将失去使用WeakHashMap的意义
IdentityHashMap:
import java.util.IdentityHashMap;
public class Main { public static void main(String[] args) {
IdentityHashMap ihm = new IdentityHashMap();
//下面两行代码将会向IdentityHashMap对象中添加两个key-value对
ihm.put(new String("语文") , 89);
ihm.put(new String("语文") , 78);
System.out.println(ihm);
//下面两行代码只会向IdentityHashMap对象中添加一个key-value对
ihm.put("java" , 93);
ihm.put("java" , 98);
System.out.println(ihm);
}
}
{语文=89, 语文=78}
{语文=89, java=98, 语文=78}
EnumMap:
import java.util.EnumMap;
public class Main { public static void main(String[] args) {
//创建一个EnumMap对象,该EnumMap的所有key
//必须是Season枚举类的枚举值
EnumMap enumMap = new EnumMap(Season.class);
enumMap.put(Season.SUMMER , "夏日炎炎");
enumMap.put(Season.SPRING , "春暖花开");
System.out.println(enumMap);
}
}
enum Season
{
SPRING,SUMMER,FALL,WINTER
}
{SPRING=春暖花开, SUMMER=夏日炎炎}
与创建普通Map有所区别的是,创建EnumMap是必须指定一个枚举类,从而将该EnumMap和指定枚举类关联起来
Map集合类的编程应用场景:
1) HashMap和Hashtable的效率大致相同,因为它们的实现机制几乎完全一样。但HashMap通常比Hashtable要快一点,因为Hashtable需要额外的线程同步控制
2) TreeMap通常比HashMap、Hashtable要慢(尤其是在插入、删除key-value对时更慢),因为TreeMap底层采用红黑树来管理key-value对
3) 使用TreeMap的一个好处就是: TreeMap中的key-value对总是处于有序状态,无须专门进行排序操作
http://www.cnblogs.com/LittleHann/p/3690187.html
http://blog.csdn.net/speedme/article/details/22398395
Java Map操作的更多相关文章
- JAVA 链表操作:循环链表
主要分析示例: 一.循环链表简述 二.单链表循环链表 三.双链表循环链表 一.循环链表简述 循环链表即链表形成了一个循环的结构,尾节点不再指向NULL,而是指向头节点HEAD,此时判定链表的结束是尾节 ...
- Java文件操作源码大全
Java文件操作源码大全 1.创建文件夹 52.创建文件 53.删除文件 54.删除文件夹 65.删除一个文件下夹所有的文件夹 76.清空文件夹 87.读取文件 88.写入文件 99.写入随机文件 9 ...
- Java curator操作zookeeper获取kafka
Java curator操作zookeeper获取kafka Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更 ...
- java poi 操作ppt
java poi 操作ppt 可以参考: https://www.w3cschool.cn/apache_poi_ppt/apache_poi_ppt_installation.html http:/ ...
- python中的zip、lambda、map操作
python 中有几个比较酷炫的操作,比如:zip.lambda.map 一.zip操作 zip字面意思:拉链.这么来记,把几个东西扔到一个包里,拉上拉链,就算打包好了.通俗点讲,就是把第1个参数.与 ...
- java:Map借口及其子类
java:Map借口及其子类 Conllection是保存单值最大得父接口(即没有key的数据),那么Map是保存的内容是一对键值的数据,即KEY->VALUE的形式保存,如电话簿等. Map常 ...
- Redis入门教程(三)— Java中操作Redis
在Redis的官网上,我们可以看到Redis的Java客户端众多 其中,Jedis是Redis官方推荐,也是使用用户最多的Java客户端. 开始前的准备 使用jedis使用到的jedis-2.1.0. ...
- Elasticsearch入门系列~通过Java一系列操作Elasticsearch
Elasticsearch索引的创建.数据的增删该查操作 上一章节已经在Linux系统上安装Elasticsearch并且可以外网访问,这节主要通过Java代码操作Elasticsearch 1.创建 ...
- java map遍历方式及效率
本文转载自Java Map遍历方式的选择. 只给出遍历方式及结论.测试数据可以去原文看. 如果你使用HashMap 同时遍历key和value时,keySet与entrySet方法的性能差异取决于ke ...
随机推荐
- Trie
字典树 class Trie { public: Trie() { root = new Node(); } ~Trie() { destroy(root); } void insert(string ...
- Servlet编程-步步为营
[环境]eclipse j2ee;Tomcat 7.0; [模型1] package com.zhiqi; import ...; public class TestServlet extends H ...
- Json工具类,实现了反射将整个Object转换为Json对象的功能,支持Hibernate的延迟加
package com.aherp.framework.util; import java.lang.reflect.Array;import java.lang.reflect.Method;imp ...
- 提取安卓手机的recovery
一直都是从网上下载的recovery文件安装到手机.至于这个小小的recovery到底是什么全然不知.能不能自己做一个recovery呢?因为功能比较多的clockworkmod(简称cmw)的官网上 ...
- FZU 1018 枚举dp
题意 给出一个数字组成的立方体 在其中选取一个体 使这个体中的数字之和最小 不可以不选 fzu的题目分类动态规划里面不是按难度排得 是按照题号..记得以前做题碰到过算 矩阵里面求子矩阵的最大和的 不会 ...
- AC之路开始了~
已经进行了半年ACM的学习啦~虽然实力很弱但是仍然快快乐乐的慢慢学习... 新建了我的博客~ 记录A题经验 感悟学习点滴~ 加油~
- maven常用插件总结
maven本质上是一个插件框架,几乎所有的功能都是通过各种各样的插件来实现的.maven默认会依据项目类型自动把构建时的各阶段(Lifecycle和phase)自动绑定(Lifecycle Mappi ...
- 为Ubuntu Server安装gnome图形桌面环境
Ubuntu Server版默认都没有图形桌面(GUI),但是可以安装,以下共有两种安装方法. 一.安装全部Gnome桌面环境 Ubuntu系列桌面实际上有几种桌面应用程序,包括Ubuntu-desk ...
- ecshop 完美解决动态ip登录超时和购物车清空问题
ecshop 完美解决动态ip登录超时和购物车清空问题 ECSHOP模板/ecshop开发中心(www.68ecshop.com) / 2014-05-06 前一段时间,ECSHOP开发中心的一个客户 ...
- 达内培训:php在线端口扫描器
达内培训:php在线端口扫描器 [来源] 达内 [编辑] 达内 [时间]2012-12-21 这个扫描器很简单.就是用了一个数组来定义端口的相关信息,原理就是用fsockopen函数连接,如 ...