• 二.1 Java高级-集合


    集合,IO,多线程

    反射,注解,泛型

    jvm

    Collection和Map

    Collection:包括List和Set。List:有序,可重复;Set:无序,不可重复

          有序:存入顺序和取出顺序一致

          方法:查增删改

    一.List接口:

    1.ArrayList(可变数组)

    (1)内部封装了一个数组,查找(随机访问)块,增删慢

    (2)方法:查:get(i) 增加:add(i,e),add(e) 删除:remove(i),remove(e) 改:set(i,e)

          size(),isEmpty(),toArray()

                            数组和集合的互相转化(主要是与List的转换,与Set也可以)

    //1.数组转集合(包装数组转集合,如果是基本数组,则需要先遍历一遍,转为包装数组,再转为集合)
    Integer[] arr=new Integer[] {1,2,3};
    List<Integer> list=new ArrayList<>(Arrays.asList(arr));
            
    //2.集合转数组(用toArray(T[] a)方法)
    Integer[] array=list.toArray(new Integer[0]);

    //基本类型数组与包装类型数组的转换:就用for循环吧

      java8的Stream流得看看

    2.LinkedList

    (1)内部是:双向循环链表(有头尾指针:first和last),增删快,查找慢

    (2)方法:查、增、删

        查:getFirst(),getLast(),get(i)   增:addFirst(),addLast(),add(i,e),add(e)   删:removeFirst(),removeLast(),remove(i),remove(e) 。remove()

    3.Collection集合遍历

    (1)foreach遍历集合

        for(元素类型 临时变量 : 容器){

        }

        只能查找(访问),不能增删改

    (2)Iterator遍历集合

      用Iterator遍历时,如果要删除元素,要用迭代器自身的删除方法    

      Collection,Map用于存储元素,Iterator用于遍历。内部采用指针的方式跟踪集合中的元素,开始指向第一个元素之前

      使用Iterator对集合元素迭代时,如果调用了集合对象的remove()方法去删除元素,会出现异常。原因是:集合中删除了元素会导致迭代器预期的迭代次数发生改变,导致迭代器的结果不准确。可以使用迭代器自身的删除方法。

     二.Queue接口

    1.Deque接口

    (1)ArrayDeque 可以用作栈,队列(单端队列,双端队列) 比LinkedList块

    (2)LinkedList

    2.PriorityQueue优先级队列

    三.Set接口:

    1.HashSet

    (1)当向HashSet添加一个元素时,index=hashCode(key)%tableSize

      首先会调用该元素的hashCode()方法来确定元素的存储位置然后调用equals()方法来确保该位置没有重复元素

    (2)为了正常工作,需要重写存入对象的equals()方法和hashCode()方法(重写equals方法必须重写hashCode方法),不重写,不能保证唯一性

      两个对象相同,hashCode一定相同;hashCode相同,这两个对象不一定相同

    (3)方法:

          查:contains(e)  增:add(e)  删:remove(e)  

          size(),isEmpt()

    (4)没有get()方法

    2.TreeSet

    (1)内部用红黑树存储元素。保证没有重复元素,并且可以对元素排序

    (2)两种排序方式:自然排序和定制排序

    四.Map接口:

    Map接口中定义了一些增删改查的方法

    LinkedHashMap保证元素存入和取出的顺序

    1.HashMap

    (1)存的是键值对entry,键和值允许为空,但键不能重复。且集合中元素无序

    (2)底层有哈希表结构组成,其实就是:数组+链表+红黑树。故HashMap对元素的增删改查效率比较高

    (3)方法:查:get(key) 增:put(key,value)  删:remove(key)  改:replace(key,value)

           大小:size(),判空:isEmpty()   判断:containsKey(key),containsValue(value)  

          获取键值对集:Set entrySet()---getKey(),getValue()  获取键集:Set keySet()  获取值集:Collection values()

    2.TreeMap(可以排序)

    3.Map集合遍历

    (1)Iterator遍历:两种:keySet(),entrySet()

    (2)forEach()遍历

     

     

    四.常用工具类:

    1.Collections工具类

    2.Arrays工具类

    细节:

    1.HashSet

    (1)HashSet添加元素时,首先会调用该元素的hashCode()方法来确定元素的存储位置,然后再调用元素对象的equals()方法来确保该位置没有重复元素

    (2)当向集合中存入元素时,为了保证HashSet正常工作,要求在存入对象是,需要重写Object类中的hashCode()和equals()方法。

    存入字符串时,String类已经默认重写了hashCode()和equals()方法。但如果自定义的类型对象存入HashSet,就不能保证不可重复性。出现这种情况是因为自定义类型没有重写hashCode()和equals()方法

    (3)HashSet底层是new了一个HashMap,其元素是内部map的key;所有key所对应的值都是一个静态的Object对象

    (4)HashCode就像人的名字。两个对象的hashCode一样,两个对象可能一样;但如果hashCode不一样,那么肯定不是同一个对象。相当于先确定一个大的范围,再用equals去比较

      equals()相等的两个对象他们的hashCode一定相等,也就是equals对比是绝对可靠的。hashCode相等的两个对象他们的equals不一定相等,也就是hashCode不是绝对可靠的

    2.TreeSet

    (1)集合中元素在进行比较时,都会调用compareTo()方法,该方法是Comparable接口中定义的,因此要想对集合中的元素进行排序,就必须实现Comparable接口。java中大部分类都实现了Coparable接口,并默认实现了接口中的copareTo()方法,如包装类,String等。自定义类型数据无法直接在集合中排序,java提供了两种排序规则:自然排序,定制排序。默认情况下,TreeSet都采用自然排序

    (2)自然排序,集合中元素实现了Comparable接口,集合会对该元素使用compareTo()方法进行比较,并默认进行升序排序

    (3)定制排序,在创建TreeSet集合时就自定义一个比较器来对元素进行定制排序

        方法:创建TreeSet集合时传入Comparator接口实现类参数  /     传入Lambda表达式参数

    3.HashMap

    (1)哈希表结构中,水平方向数组的长度称为HashMap的容量(capacity),竖直方向每个元素位置对应的链表结构称为一个桶(bucket),每个桶的位置在集合中都有对应的桶值,用于快速定位集合元素的添加,查找时的位置

    (2)链表添加元素是头插法(为了插入更快,不用遍历)

    (3)HashMap根据具体情况,动态的分配桶数量。创建时,默认集合容量capacity=16,加载因子loadFactor=0.75,此时阈值threshold=capacity*loadFactor=12.

    不断添加元素,超过12个时,集合默认新增加一倍桶的数量到32

    (4)LinkedHashMap可以保证元素的添加顺序

    4.TreeMap

    (1)TreeMap同TreeSet一样,也可以通过自定义比较器Comparator对所有键进行定制排序

    序:

    1.LinkedList用作链表

    头插:addFirst()  尾插:addLast()  中间插:add(int index,E element)  都无返回值

    头删:removeFirst()  尾删:removeLast()  中间删:remove(index)  返回值都是Object

    查头:getFirst()  查尾:getLast()  查中间:get(int index)

    2.LinkedList用作栈

                     栈方法  等效方法

           入栈      push(e)  addFirst(e)

           出栈      pop()      removeFirst()

           取栈顶元素   peek()     peekFirst()

    3.LinkedList用作单端队列

        队列方法  等效方法

    入队  offer(e)   addLast(e)  区别:前者返回boolean,后者返回void

    访问队头 peek()    getFirst()    

    出队  poll()    removeFirst()  

             

    4.排序:comparable接口和comparator比较器

    5.遍历

  • 相关阅读:
    在同一台机器上让Microsoft SQL Server 2000/ SQL2005/ SQL2008共存
    HTML 中<style>中</style>里面<!-- -->标签是干嘛的
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    怎样清除td和input之间空隙
    aspx页面中, <%= % > 与 <%# % > 的区别
    python之day13(ORM,paramiko模块,堡垒机)
    python之day12(线程池,redis,rabbitMQ)
    RabbitMQ与SQLAlchemy(预习)
    redis操作篇
    python之day11(线程,进程,协程,memcache,redis)
  • 原文地址:https://www.cnblogs.com/midiyu/p/15118154.html
Copyright © 2020-2023  润新知