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 学习记录相关推荐

  1. Java 8 Stream API学习记录

    Stream简介 1.Java 8引入了全新的Stream API.这里的Stream和I/O流不同,它更像具有Iterable的集合类,但行为和集合类又有所不同. 2.stream是对集合对象功能的 ...

  2. java jdk动态代理学习记录

    转载自: https://www.jianshu.com/p/3616c70cb37b JDK自带的动态代理主要是指,实现了InvocationHandler接口的类,会继承一个invoke方法,通过 ...

  3. java级联添加_JavaWeb学习记录(十三)——商城购物之添加订单的数据库级联操作...

    一.方法实现 private JdbcTemplate jdbcTemplate = new JdbcTemplate(DBConn.getDataSource()); @SuppressWarnin ...

  4. java并发集合框架学习记录

    1. concurrentHashMap图解:https://mp.weixin.qq.com/s?__biz=MzI1MTIzMzI2MA==&mid=2650561829&idx= ...

  5. java学习记录十五:集合二Collections、Set、Map

    java学习记录十五:集合二 一.Collections工具类 一.解释 二.常用方法 1.打乱集合顺序 2.按照默认规则排序 3.按指定规则排序 4.批量添加元素 二.可变参数 一.解释 二.写法 ...

  6. Java设计模式学习记录-单例模式

    前言 已经介绍和学习了两个创建型模式了,今天来学习一下另一个非常常见的创建型模式,单例模式. 单例模式也被称为单件模式(或单体模式),主要作用是控制某个类型的实例数量是一个,而且只有一个. 单例模式 ...

  7. 【Scala教程】如何在已掌握的Java知识基础上快速上手Scala?【个人学习记录】

    如何在已掌握的Java知识基础上学习Scala 前言 正文开始! 1. 编译运行 2. 声明变量 3. 输出 4. 显式指定变量类型 5. 范围区间 6. 写入文本文件 7. 读取文本文件 8. if ...

  8. Java学习记录五(多线程、网络编程、Lambda表达式和接口组成更新)

    Java学习记录五(多线程.网络编程.Lambda表达式和接口组成更新) Java 25.多线程 25.1实现多线程 25.1.1进程 25.1.2线程 25.1.3多线程的实现 25.1.4设置和获 ...

  9. java之字符串学习记录

    java之字符串学习记录 public class StringDemo { public static void main(String[] args) { //静态初始化字符串 String s1 ...

最新文章

  1. 惊呆,一条sql竟然让oracle奔溃了
  2. 错误: (串列)对象不能强制改变成'double'解决办法
  3. centos 上假设svnserve
  4. 神策数据:游戏买量与长线运营的数据宝典
  5. ASP.NET中的Theme和Skin
  6. angularjs解决方案之 递归模板
  7. 设计模式理解:中介者模式(Mediator)
  8. 两路语音 两路计算机数据综合,脉冲编码调制解调实验摘要.doc
  9. PHP 比较两个文本文件差异 A diff implementation for PHP
  10. url decode problem
  11. 安装python报错
  12. 如何查看Linux的系统是64位的还是32位的
  13. MATPOWER工具本质原理解析
  14. SAP SD 销售订单收入和成本对应科目的逻辑
  15. 计算机爱情诗,优美诗句大全
  16. 移动流量转赠给好友_手机包月流量用不完:教你如何转赠给好友使用
  17. OSChina 周一乱弹 ——女人比代码复杂多了,搞不懂!
  18. 微信小程序开发报错及解决记录
  19. java 图形处理_课内资源 - 基于Java实现的几何图形处理系统
  20. PPT乱码如何解决?

热门文章

  1. 郑州轻工业大学oj1023C语言答案,郑州轻工业学院(ZZULI) OJ系统第1431题 读数字 解题报告...
  2. 2015年第六届蓝桥杯C/C++程序设计本科B组决赛第二题
  3. git cz: Missing script: “test“ To see a list of scripts, run: npm run
  4. 377.组合总和 Ⅳ
  5. 微信餐饮小程序有必要开发吗
  6. 吴军的谷歌方法论|周末互动|如何避免成为耍小聪明的人
  7. IOS开发中@2x图片等适应不同分辨率手机
  8. Service not registered解决方案
  9. 段码屏中液晶相与相变的含义?
  10. 计数数据分析模型:零膨胀负二项(ZINB)回归模型