java中的Map;Collections工具类

Map

以键值对形式存储元素,在进行存储前先调用哈希算法求出key的哈希值,再存入下标为该哈希值的链表中,然后再比较该哈希值下的链表中是否有该key值得节点,如果有替换,无则添加。
HashMap的初始化容量为16,默认加载因子为0.75。当链表元素到达8+时,链表会变成红黑树,提高效率;小于等于6时,又会变回链表形式。
Hashtable的初始化容量为10,扩容后为原来的2倍+1,是线程安全的。
TreeMap

map的常用方法:
V put(k key,v value); //往map里添加键值对
V get(Object k); //传入key,返回一个value
void clear(); //清空map
int size(); //获得map中个数? 链表的个数还是所有节点的个数?
boolean isEmpty(); //map是否为空
boolean containsKey(Object key); //是否包含key
boolean containsValue(Obeject value); //是否包含value
v remove(Object key); //将该key对应的节点删除
Collection values(); //返回map集合所有的value
Set keySet(); //获取map集合所有的key
Set<K,V> entrySet(); //获取键值对

package MapTest;

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

public class MapTest1 {
    public static void main(String[] args) {
        Map<Integer,String> map = new HashMap<>();
        map.put(1,"str1");
        map.put(2,"str2");
        map.put(3,"str3");
        map.put(4,"str4");
        System.out.println(map.values());       //[str1, str2, str3, str4]	
        System.out.println(map.size());     //4
        System.out.println(map.isEmpty());      //false
        System.out.println(map.get(2));     //str2
        Set<Integer> s = map.keySet();
        System.out.println(s);      //[1,2,3,4]
        System.out.println(map.entrySet());     //[1=str1, 2=str2, 3=str3, 4=str4]
        System.out.println(map.containsKey(1));     //true
        System.out.println(map.containsValue("str4"));      //true
        map.remove(1);
        System.out.println(s);      //[2,3,4]
        map.clear();
        System.out.println(map.size());     //0
        System.out.println(map.isEmpty());      //true
        System.out.println(map.get(2));     //null
        System.out.println(s);      //[]
        }
}

比较器以匿名内部类形式的实现:

comparable 、comparetor、匿名内部类。。
comparable是怎么作用的?comparetor又是怎么作用的?
在put放入数据时,会调用comparable或conparator进行比较,然后将元素放入数据结构中。

//在Person类家泛型Person则CompareTo方法的参数可以用this.age - o.age;  否则方法传入的参数会是一个Object对象。
public static class Person implements Comparable<Person>{
        int age;
        public Person() {
        }
        public Person(int age) {
            this.age = age;
        }
        public String toString() {
            return "Person{" +
                    "age=" + age +
                    '}';
        }
        public int compareTo(Person o) {
            return this.age - o.age;
        }
/**
*如果不给一个比较逻辑,会出现类无法转换的问题。原因是自定义的类的对象在调用put方法时在put方法体中会进行类型转换,将自定义类型转换为comparable
*然后调用comparable接口中的comparaTo方法进行比较。(无比较器情形)
*试验发现tree类型才能传比较器
*/
Set<Person> set = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o1.age - o2.age;
            }
        });

Properties

之后与io一起组合使用。

collection工具类Collections:

Collections.synchronizedList(list); //将list变成线程安全的
Collections.sorted(list); //将list进行排序

summary:

ArrayList、HashSet、HashMap、properties、TreeSet、TreeMap、LinkedList。
Tree 的compareTo传入的参数是树的节点,通过key调用compareTo
put会将kv值封装成一个node,再放入map中,node包含 k 、v、hash、next。
在应用时,记得重写hashcode 、 equals。(这里还有问题)

怎么理解entrySet方法的逻辑,返回的是一个set集合,set不是key吗? map.entrySet 不是键值对形式全部拿出来?
entrySet方法是将map中的键值对以一个字符串的形式放入Set中。
如: Set<Map.Entry<Integer,String>> set = m.entrySet();
for (Map.Entry<Integer,String> e : set) System.out.println(e);
//1=hys 2=say 3=sorry 其中数字为key ,后面的字符串为value,这三个值依次换行输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值