赞
踩
目录
- import java.util.TreeMap;
- import java.util.Map;
- public static void TestMap(){
- Map<String, String> m = new TreeMap<>();
- // put(key, value):插入key-value的键值对
- // 如果key不存在,会将key-value的键值对插入到map中,返回null
- m.put("林冲", "豹子头");
- m.put("鲁智深", "花和尚");
- m.put("武松", "行者");
- m.put("宋江", "及时雨");
- String str = m.put("李逵", "黑旋风");
- System.out.println(m.size());
- System.out.println(m);
- // put(key,value): 注意key不能为空,但是value可以为空
- // key如果为空,会抛出空指针异常
- //m.put(null, "花名");
- str = m.put("无名", null);
- System.out.println(m.size());
- // put(key, value):
- // 如果key存在,会使用value替换原来key所对应的value,返回旧value
- str = m.put("李逵", "铁牛");
- // get(key): 返回key所对应的value
- // 如果key存在,返回key所对应的value
- // 如果key不存在,返回null
- System.out.println(m.get("鲁智深"));
- System.out.println(m.get("史进"));
- //GetOrDefault(): 如果key存在,返回与key所对应的value,如果key不存在,返回一个默认值
- System.out.println(m.getOrDefault("李逵", "铁牛"));
- System.out.println(m.getOrDefault("史进", "九纹龙"));
- System.out.println(m.size());
- //containKey(key):检测key是否包含在Map中,时间复杂度:O(logN)
- // 按照红黑树的性质来进行查找
- // 找到返回true,否则返回false
- System.out.println(m.containsKey("林冲"));
- System.out.println(m.containsKey("史进"));
- // containValue(value): 检测value是否包含在Map中,时间复杂度: O(N)
- // 找到返回true,否则返回false
- System.out.println(m.containsValue("豹子头"));
- System.out.println(m.containsValue("九纹龙"));
- // 打印所有的key
- // keySet是将map中的key防止在Set中返回的
-
- for(String s : m.keySet()){
- System.out.print(s + " ");
- }
- System.out.println();
- // 打印所有的value
- // values()是将map中的value放在collect的一个集合中返回的
- for(String s : m.values()){
- System.out.print(s + " ");
- }
- System.out.println();
- // 打印所有的键值对
- // entrySet(): 将Map中的键值对放在Set中返回了
- for(Map.Entry<String, String> entry : m.entrySet()){
- System.out.println(entry.getKey() + "--->" + entry.getValue());
- }
- System.out.println();
- }
不包含重复元素的集合。更正式地说,设置 不包含一对元素,并且最多包含一个 null 元素。Set 接口除了这些规定之外,还放置了其他规定 继承自 Collection 接口,在 all 的合约上 构造函数以及 add、equals 和 hashCode 方法的合约。其他继承方法的声明包括 为方便起见,此处也包括在内。
- import java.util.TreeSet;
- import java.util.Iterator;
- import java.util.Set;
- public static void TestSet(){
- Set<String> s = new TreeSet<>();
- // add(key): 如果key不存在,则插入,返回ture
- // 如果key存在,返回false
- boolean isIn = s.add("apple");
- s.add("orange");
- s.add("peach");
- s.add("banana");
- System.out.println(s.size());
- System.out.println(s);
-
- isIn = s.add("apple");
- // add(key): key如果是空,抛出空指针异常
- //s.add(null);
- // contains(key): 如果key存在,返回true,否则返回false
- System.out.println(s.contains("apple"));
- System.out.println(s.contains("watermelen"));
- // remove(key): key存在,删除成功返回true
- // key不存在,删除失败返回false
- // key为空,抛出空指针异常
- s.remove("apple");
- System.out.println(s);
- s.remove("watermelen");
- System.out.println(s);
- Iterator<String> it = s.iterator();
- while(it.hasNext()){
- System.out.print(it.next() + " ");
- }
- System.out.println();
- }
顺序结构以及平衡树 中,元素关键码与其存储位置之间没有对应的关系,因此在 查找一个元素时,必须要经过关键 码的多次比较 。 顺序查找时间复杂度为 O(N) ,平衡树中为树的高度,即 O( ) ,搜索的效率取决于搜索过程中 元素的比较次数。理想的搜索方法:可以 不经过任何比较,一次直接从表中得到要搜索的元素 。 如果构造一种存储结构,通过某种函 数 (hashFunc) 使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快 找到该元素 。
当向该结构中:插入元素根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放搜索元素对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若 关键码相等,则搜索成功 该方式即为哈希( 散列 ) 方法, 哈希方法中使用的转换函数称为哈希 ( 散列 ) 函数,构造出来的结构称为哈希表 (Hash Table)( 或者称散列表 )
- package 哈希;
-
- import java.util.Arrays;
-
- public class HashBuck {
- //链表节点
- static class Node {
-
- public int key;
-
- public int val;
- public Node next;
-
- public Node(int key, int val) {
- this.key = key;
- this.val = val;
- }
- }
-
-
- public Node[] array;
- public int usedSzie; //存放了多少个数据
-
- public static final float DEFAULT_LOAD_FACTOR = 0.75f;
-
- public HashBuck(){
- array = new Node[10];
- }
-
- public void put(int key,int val){
-
- int index = key%array.length;
-
- //遍历index下标的链表 是否更新value 不存在 进行 头插法 插入数据
- Node cur = array[index];
- while (cur!= null){
- if(cur.key == key){
- //更新value
- cur.val = val;
- return;
- }
- cur = cur.next;
- }
-
- //cur == null 链表遍历完成 没有找到这个key
- Node node = new Node(key, val);
- node.next = array[index];
- array[index] = node;
- usedSzie++;
-
-
- if(doLoadFactor()> DEFAULT_LOAD_FACTOR){
- //扩容
- resize();
- }
- }
-
- private void resize(){
- Node[] newArray = new Node[2*array.length];
-
- //遍历原来的数组
- for (int i = 0; i < array.length; i++) {
- Node cur = array[i];
- while (cur != null){
- Node tmp = cur.next;
- int newIndex = cur.key % newArray.length;//新数组的下标
- //采用头插法 插入到新数组的 newIndex下标
- cur.next = newArray[newIndex];
- newArray[newIndex] = cur;
-
- }
- }
-
- array =newArray;
- }
-
- public int get(int key){
- int index = key%array.length;
-
- //遍历index下标的链表 是否更新value 不存在 进行 头插法 插入数据
- Node cur = array[index];
- while (cur!= null){
- if(cur.key == key){
- //更新value
- return cur.val;
-
- }
- cur = cur.next;
- }
- return -1;
- }
-
-
- private float doLoadFactor() {
- return usedSzie*0.1f/array.length;
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。