Java set 和 map 学习记录
set (和js中的set性质一致)
hashSet (就是普通set)
需要掌握的api
Arrays.asList("a","b","c"); 将普通数组转换成 ArrayList 集合
去重
String[] arr = new String[] {"i", "think", "i", "am", "the", "best"};LinkedHashSet noDups = new LinkedHashSet(Arrays.asList(arr));System.out.println("(LinkedHashSet) distinct words: " + noDups);
treeSet
TreeSet是SortedSet接口的实现,元素不论以什么元素插入,在遍历的时候,都会以天然顺序遍历。
三种排序方法
//01
public static void main(String[] args) {
// test1();test2();
}
/*** 自然排序*/
private static void test1() {TreeSet<String> treeSet=new TreeSet<String>();treeSet.add("a");treeSet.add("d");treeSet.add("b");treeSet.add("e");treeSet.add("c");for (String string : treeSet) {System.out.println(string);}
}//02
private static void test2() {TreeSet<Info> infosSet =new TreeSet<Info>(new Comparator<Info>() { // 传入比较器,保证顺序@Overridepublic int compare(Info o1, Info o2) {int num=o1.getId()-o2.getId();num = num==0?o1.hashCode()-o2.hashCode():num;return num;}}) ;infosSet.add(new Info(0, "qqq"));infosSet.add(new Info(1, "wew"));infosSet.add(new Info(3, "ete"));infosSet.add(new Info(2, "bjk"));infosSet.add(new Info(1, "wew")); // 重复元素,compare方法返回0,不会被插入到TreeSetfor (Info info : infosSet) {System.out.println(info);}
}//03
public class Test {public static void main(String[] args) {TreeSet set = new TreeSet(new PersonComparator());set.add(new Person("lwc", 80));set.add(new Person("nxj", 70));set.add(new Person("lp", 60));set.add(new Person("fy", 75));Iterator ite = set.iterator();while (ite.hasNext()) {Person p = (Person)ite.next();System.out.println(p.name);}}
}
class Person {String name;int score;public Person(String name, int score) {this.name = name;this.score = score;}
}
class PersonComparator implements Comparator {public int compare(Object o1, Object o2) {Person p1 = (Person) o1;Person p2 = (Person) o2;return p1.score - p2.score;}
}
Map 和js差不多
在该图中1-4步骤是找到该元素在数组中位置,5-8步骤是将该元素插入数组中。在插入的过程中会遇到一点点小挫折。在众多肯能存在多个元素他们的hash值是一样的,这样就会得到相同的索引位置,也就说多个元素会映射到相同的位置,这个过程我们称之为“冲突”。解决冲突的办法就是在索引位置处插入一个链接列表,并简单地将元素添加到此链接列表。当然也不是简单的插入,在HashMap中的处理过程如下:获取索引位置的链表,如果该链表为null,则将该元素直接插入,否则通过比较是否存在与该key相同的key,若存在则覆盖原来key的value并返回旧值,否则将该元素保存在链头(最先保存的元素放在链尾)。
1. Map 是一个键值对(key-value)映射接口。Map映射中不能包含重复的键;每个键最多只能映射到一个值。
2. Map 接口提供三种collection 视图,允许以键集、值集或键-值映射关系集的形式查看某个映射的内容。
3. Map 映射顺序。有些实现类,可以明确保证其顺序,如 TreeMap;另一些映射实现则不保证顺序,如 HashMap 类。
4. Map 的实现类应该提供2个“标准的”构造方法:第一个,void(无参数)构造方法,用于创建空映射;第二个,带有单个 Map 类型参数的构造方法,用于创建一个与其参数具有相同键-值映射关系的新映射。实际上,后一个构造方法允许用户复制任意映射,生成所需类的一个等价映射。尽管无法强制执行此建议(因为接口不能包含构造方法),但是 JDK 中所有通用的映射实现都遵从它。
public class MapDemo
{ public static void main(String[] args) { Map<String,Integer> m = new HashMap<String,Integer>(); m.put("zhangsan", 19); m.put("lisi", 49);m.put("wangwu", 19); m.put("lisi",20); m.put("hanmeimei", null); System.out.println(m); System.out.println(m.remove("wangwu")); m.clear(); System.out.println(m); }
}
map的遍历
通过map 自带的.keySet() 对键进行遍历 ,遍历过程中也可以通过map.get(key) 对value进行遍历。
map.entrySet() //获取map中的所有键值对。
while(it.hasNext()){
Map.Entry<String,Integer> next = ( Map.Entry<String,Integer>) it.next();
}
//通过迭代器 Map<String,Integer> map = new HashMap<String,Integer>();map.put("王伟琪",23);map.put("上坂堇",30);map.put("丰田露娜",18);Iterator it = map.entrySet().iterator();while(it.hasNext()){Map.Entry<String,Integer> next = ( Map.Entry<String,Integer>) it.next();System.out.println(next.getKey());}Iterator it = map.keySet().iterator();while(it.hasNext()){String key = it.next().toString();System.out.println(key);System.out.println(map.get(key)); //value}
TreeMap
根据key进行降序排列
Map<String,String> map = new TreeMap<String,String>(new Comparator<String>(){ public int compare(String obj1,String obj2){ //降序排序 return obj2.compareTo(obj1); }
});
map.put("month", "The month");
map.put("bread", "The bread");
map.put("attack", "The attack");
Set<String> keySet = map.keySet();
Iterator<String> iter = keySet.iterator();
while(iter.hasNext()){ String key = iter.next(); System.out.println(key+":"+map.get(key));
}
根据value进行降序排列
List<Map.Entry<String,String>> mappingList = null;
Map<String,String> map = new TreeMap<String,String>();
map.put("aaaa", "month");
map.put("bbbb", "bread");
map.put("ccccc", "attack");
//通过ArrayList构造函数把map.entrySet()转换成list
mappingList = new ArrayList<Map.Entry<String,String>>(map.entrySet());
//通过比较器实现比较排序
Collections.sort(mappingList, new Comparator<Map.Entry<String,String>>(){ public int compare(Map.Entry<String,String> mapping1,Map.Entry<String,String> mapping2){ return mapping1.getValue().compareTo(mapping2.getValue()); }
});
for(Map.Entry<String,String> mapping:mappingList){ System.out.println(mapping.getKey()+":"+mapping.getValue());
}
HashTable
api与 HashMap一致但是两者不同·我们从他们的定义就可以看出,HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。
第二:HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。当HashMap遇到为null的key时,它会调用putForNullKey方法来进行处理。对于value没有进行任何处理,只要是对象都可以。
排序
Hashtable ht = new Hashtable();
ht.Add("dd", "value2");
ht.Add("cc", "value3");
ht.Add("bb", "value4");
ht.Add("aa", "value5");
ArrayList list = new ArrayList(ht.Keys);
list.Sort();
foreach (string str in list)
{ Console.WriteLine(str+":"+ht[str]);
}
Hashtable<String, String> h = new Hashtable<String, String>();
h.put("6", "666");
h.put("8", "888");
h.put("2", "222");
for (String key : h.keySet())System.out.println(key);List<String> v = new ArrayList<String>(h.keySet());
Collections.sort(v, new Comparator<Object>() {public int compare(Object arg0, Object arg1) {return Integer.valueOf(arg0.toString()) - Integer.valueOf(arg1.toString()); // 升序,参数顺序对调时降序<br> }
});
for (String key : v)System.out.println(key + " " + h.get(key)
);
Java set 和 map 学习记录相关推荐
- Java 8 Stream API学习记录
Stream简介 1.Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同. 2.stream是对集合对象功能的 ...
- java jdk动态代理学习记录
转载自: https://www.jianshu.com/p/3616c70cb37b JDK自带的动态代理主要是指,实现了InvocationHandler接口的类,会继承一个invoke方法,通过 ...
- java级联添加_JavaWeb学习记录(十三)——商城购物之添加订单的数据库级联操作...
一.方法实现 private JdbcTemplate jdbcTemplate = new JdbcTemplate(DBConn.getDataSource()); @SuppressWarnin ...
- java并发集合框架学习记录
1. concurrentHashMap图解:https://mp.weixin.qq.com/s?__biz=MzI1MTIzMzI2MA==&mid=2650561829&idx= ...
- java学习记录十五:集合二Collections、Set、Map
java学习记录十五:集合二 一.Collections工具类 一.解释 二.常用方法 1.打乱集合顺序 2.按照默认规则排序 3.按指定规则排序 4.批量添加元素 二.可变参数 一.解释 二.写法 ...
- Java设计模式学习记录-单例模式
前言 已经介绍和学习了两个创建型模式了,今天来学习一下另一个非常常见的创建型模式,单例模式. 单例模式也被称为单件模式(或单体模式),主要作用是控制某个类型的实例数量是一个,而且只有一个. 单例模式 ...
- 【Scala教程】如何在已掌握的Java知识基础上快速上手Scala?【个人学习记录】
如何在已掌握的Java知识基础上学习Scala 前言 正文开始! 1. 编译运行 2. 声明变量 3. 输出 4. 显式指定变量类型 5. 范围区间 6. 写入文本文件 7. 读取文本文件 8. if ...
- Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)
Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...
- java之字符串学习记录
java之字符串学习记录 public class StringDemo { public static void main(String[] args) { //静态初始化字符串 String s1 ...
最新文章
- 惊呆,一条sql竟然让oracle奔溃了
- 错误: (串列)对象不能强制改变成'double'解决办法
- centos 上假设svnserve
- 神策数据:游戏买量与长线运营的数据宝典
- ASP.NET中的Theme和Skin
- angularjs解决方案之 递归模板
- 设计模式理解:中介者模式(Mediator)
- 两路语音 两路计算机数据综合,脉冲编码调制解调实验摘要.doc
- PHP 比较两个文本文件差异 A diff implementation for PHP
- url decode problem
- 安装python报错
- 如何查看Linux的系统是64位的还是32位的
- MATPOWER工具本质原理解析
- SAP SD 销售订单收入和成本对应科目的逻辑
- 计算机爱情诗,优美诗句大全
- 移动流量转赠给好友_手机包月流量用不完:教你如何转赠给好友使用
- OSChina 周一乱弹 ——女人比代码复杂多了,搞不懂!
- 微信小程序开发报错及解决记录
- java 图形处理_课内资源 - 基于Java实现的几何图形处理系统
- PPT乱码如何解决?
热门文章
- 郑州轻工业大学oj1023C语言答案,郑州轻工业学院(ZZULI) OJ系统第1431题 读数字 解题报告...
- 2015年第六届蓝桥杯C/C++程序设计本科B组决赛第二题
- git cz: Missing script: “test“ To see a list of scripts, run: npm run
- 377.组合总和 Ⅳ
- 微信餐饮小程序有必要开发吗
- 吴军的谷歌方法论|周末互动|如何避免成为耍小聪明的人
- IOS开发中@2x图片等适应不同分辨率手机
- Service not registered解决方案
- 段码屏中液晶相与相变的含义?
- 计数数据分析模型:零膨胀负二项(ZINB)回归模型