美文网首页
HashMap与TreeMap||Collections与Arr

HashMap与TreeMap||Collections与Arr

作者: 像天空的鸽子 | 来源:发表于2019-08-02 21:42 被阅读0次

HashMap与TreeMap

双列集合:
-------------| Map 如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复。
----------------| HashMap 底层也是基于哈希表实现 的。
HashMap的存储原理:
往HashMap添加元素的时候,首先会调用键的hashCode方法得到元素 的哈希码值,然后经过运算就可以算出该
元素在哈希表中的存储位置。
情况1: 如果算出的位置目前没有任何元素存储,那么该元素可以直接添加到哈希表中。

情况2:如果算出 的位置目前已经存在其他的元素,那么还会调用该元素的equals方法与这个位置上的元素进行比较
,如果equals方法返回 的是false,那么该元素允许被存储,如果equals方法返回的是true,那么该元素被视为
重复元素,不允存储。

----------------| TreeMap TreeMap也是基于红黑树(二叉树)数据结构实现 的, 特点:会对元素的键进行排序存储。

TreeMap 要注意的事项:
1. 往TreeMap添加元素的时候,如果元素的键具备自然顺序,那么就会按照键的自然顺序特性进行排序存储。
2. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性, 那么键所属的类必须要实现Comparable接口,把键
的比较规则定义在CompareTo方法上。

  1. 往TreeMap添加元素的时候,如果元素的键不具备自然顺序特性,而且键所属的类也没有实现Comparable接口,那么就必须
    在创建TreeMap对象的时候传入比较器。

----------------| Hashtable

package cn.itcast.map;
import java.util.Comparator;
import java.util.TreeMap;

class Emp {//implements Comparable<Emp>{
    
    String name;
    
    int salary;

    public Emp(String name, int salary) {
        super();
        this.name = name;
        this.salary = salary;
    }
    
    
    @Override
    public String toString() {
        return "[姓名:"+this.name+" 薪水:"+ this.salary+"]";
    }

/*
    @Override
    public int compareTo(Emp o) {
        return this.salary - o.salary;
    }*/
    
}


//自定义一个比较器
class MyComparator implements Comparator<Emp>{

    @Override
    public int compare(Emp o1, Emp o2) {
        return o1.salary - o2.salary;
    }
    
}




public class Demo6 {
    
    public static void main(String[] args) {
    /*  TreeMap<Character, Integer> tree = new TreeMap<Character, Integer>();
        tree.put('c',10);
        tree.put('b',2);
        tree.put('a',5);
        tree.put('h',12);
        System.out.println(tree);*/
        
        //创建一个自定义比较器
        MyComparator comparator = new MyComparator();
        
        TreeMap<Emp, String> tree = new TreeMap<Emp, String>(comparator);
        tree.put(new Emp("冰冰", 2000),"001");
        tree.put(new Emp("家宝", 1000),"002");
        tree.put(new Emp("习总", 3000),"003");
        tree.put(new Emp("克强", 5000),"005");
        
        tree.put(new Emp("财厚", 5000),"008");
        System.out.println(tree);
        
        
        
        
    }

}

Collections与Arrays

集合框架中的工具类:特点:该工具类中的方法都是静态的。

Collections:常见方法:

1, 对list进行二分查找:
前提该集合一定要有序。
int binarySearch(list,key);
//必须根据元素自然顺序对列表进行升级排序
//要求list 集合中的元素都是Comparable 的子类。
int binarySearch(list,key,Comparator);
2,对list集合进行排序。
sort(list);
//对list进行排序,其实使用的事list容器中的对象的compareTo方法
sort(list,comaprator);
//按照指定比较器进行排序
3,对集合取最大值或者最小值。
max(Collection)
max(Collection,comparator)
min(Collection)
min(Collection,comparator)4,对list集合进行反转。
reverse(list);
8,可以将不同步的集合变成同步的集合。
Set synchronizedSet(Set<T> s)
Map synchronizedMap(Map<K,V> m)
List synchronizedList(List<T> list)

Arrays:用于对数组操作的工具类

1,二分查找,数组需要有序
binarySearch(int[])
binarySearch(double[])

2,数组排序
sort(int[])
sort(char[])……
1, 将数组变成字符串。
toString(int[])
2, 复制数组。 copyOf();
3, 复制部分数组。
copyOfRange():
4, 比较两个数组是否相同。
equals(int[],int[]);
5, 将数组变成集合。
List asList(T[]);
这样可以通过集合的操作来操作数组中元素,
但是不可以使用增删方法,add,remove。因为数组长度是固定的,会出现
UnsupportOperationExcetion。
可以使用的方法:contains,indexOf。。。
如果数组中存入的基本数据类型,那么asList会将数组实体作为集合中的元素。
如果数组中的存入的引用数据类型,那么asList会将数组中的元素作为集合中
的元素。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Arrays;
import java.util.List;
class Demo1 
{
    public static void main(String[] args)
    {
        ArrayList<Integer> list = new ArrayList<Integer>();
        list.add(4);
        list.add(3);
        list.add(1);
        list.add(2);
        list.add(3);
        // 排序
        Collections.sort(list);
        // 折半查找的前提是排序好的元素
        System.out.println( Collections.binarySearch( list , 8 ) );  // 找不到返回-插入点-1
        // 反序集合输出
        Collections.reverse( list );
        System.out.println( list );
        // 求最值
        System.out.println( Collections.max( list ) );   // 4
        // fill()  使用指定的元素替换指定集合中的所有元素
        // Collections.fill( list, 5 );
        System.out.println( list );

        // 将数组转换为集合
        Integer is[] = new  Integer[]{6,7,8};
        List<Integer> list2 =  Arrays.asList(is);
        list.addAll( list2 );
        System.out.println( list );

        // 将List转换为数组
        Object [] ins =  list.toArray();
        System.out.println( Arrays.toString( ins ) );
   

    }
}

集合的练习

问题: 定义一个Person数组,将Person数组中的重复对象剔除?
思路:

  1. 描述一个Person类
  2. 将数组转换为Arrays.asList() List
  3. Set addAll( list )
  4. hashCode()且equals()
import java.util.Arrays;
import java.util.Set;
import java.util.List;
import java.util.HashSet;

// 1. 描述Person类
class Person {
    public String name;
    public int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String toString() {

        return getClass().getName() + " : name=" + this.name + " age="
                + this.age;

    }

    // 4. 重写hashCode和equals()
    public int hashCode() {

        return this.age;
    }

    public boolean equals(Object o) {
        Person p = null;
        if (o instanceof Person)
            p = (Person) o;
        return this.name.equals(p.name) && (this.age == p.age);
    }
}

class Demo2 {
    public static void main(String[] args) {
        Person[] ps = new Person[] { new Person("jack", 34),
                new Person("lucy", 20), new Person("lili", 10),
                new Person("jack", 34) };
        // 遍历数组
        System.out.println(Arrays.toString(ps));
        // 2. 将自定义对象数组转换为List集合
        List<Person> list = Arrays.asList(ps);
        // 3. 将List转换为Set
        Set<Person> set = new HashSet<Person>();
        set.addAll(list);
        System.out.println(set);

    }
}

相关文章

网友评论

      本文标题:HashMap与TreeMap||Collections与Arr

      本文链接:https://www.haomeiwen.com/subject/pgwrdctx.html