zoukankan      html  css  js  c++  java
  • java集合

    把java集合理解成一个行李箱就可以了,行李箱里面装的都是相同类型的对象,方便携带,查找等。java语言的数据结构主要体现在java集合中。
     
    java集合框架的体系结构:
    由两大家族组成(Collection家族和Map家族)
    Collection接口有三个子接口:List(元素排列有序,可重复),Queue(元素排列有序,可重复),Set(元素无序,不可重复)
    List有一个很重要的实现类:ArrayList
    Queue有一个很重要的实现类:LinkedList(同时也是List的实现类)
    Set也有一个很重要的实现类:HashSet,HashSet本质上是通过HashMap实现的(只用了它的Key,没有使用它的Value)
     
    Map有一个非常重要的实现类:HashMap,里面存储的是Entry(键值对)
     
    List可以精确的控制每个元素的插入位置,或删除某个位置的元素。ArrayList的底层由数组实现。
     
    List<Course> coursesToSelect=new ArrayList<Course>();
    coursesToSelect.add(new Course());//增
    coursesToSelect.add(0,new Course());在第一个位置插入对象
     
    将数组转化成一个List:
    Course[] courses=new Course[];
    coursesToSelect.addAll(Arrays.asList(courses));//添加一个List
     
    Iterator it=coursesToSelect.iterator();        //返回一个迭代器   (遍历)
    while(it.hasNext()){
        Course cr=it.next()
    }
    coursesToSelect.size()        //返回当前List的大小
    coursesToSelect.get(3);        //查
    coursesToSelect.set(1,new Course()); //改
    coursesToSelect.remove()   //删
     
    集合中存放的是一个个对象的引用
     
    泛型:限制容器中只能添加某种类型的对象。
     
    ------------------------------------------------------------------------
    Set<Course> courses=new HashSet<Course>();
    遍历Set只能使用foreach或者iterator,每次遍历出来的元素顺序都不一样。不能使用get()方法,因为集合里面的元素是无序的。
    -----------------------------------------------------------------------------
     
    Map<K,V> students=new HashMap<K,V>();
    students.put(K key,V value);      //往map中添加一个元素(Entry)
    map中存放的是一个个键值对,键是不可以重复的,可以根据键来查找到对应的Value值。
    students.remove(Object key)        //根据键来删除某个Entry
     
    HashMap是基于哈希表实现的,HashMap中的Entry对象是无序排列的
    通过map的keySet()方法可以返回Map中的所有“键”的Set集合
    通过map的EntrySet()方法可以返回Map中的所有键值对的Set集合
    Set<Entry<String,Student>> entrySet=students.entrySet();
    -------------------------------------------------------------------------------------------------------------
    容器的contains()方法:判断该容器是否包含某个对象。以ArrayList为例,查看ArrayList类的源代码发现,
    contains()方法的实现原理是遍历容器中的每一个对象,并调用该对象的equals()方法,如果内中有一个对象
    与要判断的对象相等,就返回true.
     
    因为所有对象都继承自Object对象,而Object对象的equals()方法默认是通过==来实现的,所以如果没有复写
    equals()方法,那么
    List<Student> students=new ArrayList<Student>();
    Student s1=new Student("libi");
    students.add(s1);
    则students.contains(s1);返回true
    Student s2=new Student("libi");
    students.contains(s2);返回false,因为比较的是java虚拟机栈中的引用值。
     
    这时就需要复写Student类中的equals()方法了,根据姓名来判断两个对象是否相等,如果name相等,那么
    obj1.equals(obj2)返回true;
    那么Student s2=new Student("libi");
    students.contains(s2);返回true
    -----------------------------------------------------------------------------------------------------------------------------------
    HashMap的底层实现原理:
    HashMap的底层实际上是一个数组,数组里面存放的是Entry,即键-值对。每一个数组的元素又叫bucket(桶),一桶里只能存放一个Entry(或者一个Entry链)。现在有一个键值对<Key,Value>,HashMap通过对键进行hashcode(),得到键的哈希值,然后hash()得到具体的在数组中的索引值。
                             hash()
    hashcode(key)————>得到存放于数组中的位置
    现在如果想得到该Entry,只需计算出该Entry存放在数组中的具体位置(使用相同的哈希算法,即hash(hashcode(key))),就能非常快捷方便的找到该Entry了。
     
    如果有两个key,它们对应的hash(hashcode(key))的值相同,那么就需要比较key是否相同了(使用equals()比较),如果key相同的话,那么就覆盖掉原来的Value值,即修改key对应的value值;如果key不相同的话,那么这两个Entry存放在数组中的相同位置,只不过通过链表关联起来(新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部)
     
    HashMap的本质就是:不同的东西放在不同的位置,需要时才能快速找到它。
    ————————————————————————————————————————
    java集合框架的5大家族:Collection,Map,Collections工具类(主要是sort()方法),Comparable<T>接口,Comparator<T>接口
    List<Student> students=new ArrayList<Student>();
    Collections.sort(students);
    要想对Student排序,必须让Student实现Comparable接口(只有实现了之后才能说明Student是可以进行比较的)。
    List<Integer> list0=new ArrayList<Integer>();
    List<String> list1=new ArrayList<String>();
    Integer和String(先数字,后字母(先大写后小写))都是可以比较的,因为它们都实现了Comparable接口。
     
    实现了Comparable<T>接口,就必须实现int compareTo(Object obj)方法,在方法体中定义通过类的什么属性进行比较,
    如果this>obj,则返回正数,=的话返回零,this<obj则返回负数。
     
    Comparator<T>接口:定义临时的比较规则。实现了该接口的类必须实现int compare(T o1, T o2)方法。
     
    如何使用:Collections.sort(students,new Comparator<Student>());
  • 相关阅读:
    基础抽象代数
    斜堆
    WC2018
    WC2019
    有向图上不相交路径计数
    生成树计数
    Pr&#252;fer序列
    反演
    1.1 Linux中的进程 --fork、孤儿进程、僵尸进程、文件共享分析
    Python程序的执行过程 解释型语言和编译型语言
  • 原文地址:https://www.cnblogs.com/james111/p/6607403.html
Copyright © 2011-2022 走看看