Java教程

JAVA集合

本文主要是介绍JAVA集合,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
  • 集合
    • 1.集合、数组都是对多个数据进行存储操作的结构,简称JAVA容器
    • 2.数组在存储多个数据方面的特点:
      • 1)一旦初始化以后,其长度就确定了。
      • 2)数组一旦定义好,其元素的类型也就确定了。只能操作指定类型的数据
      • 3)数组中提供的方法有线,对于添加、删除、插入数据非常不方便,并且效率不高
      • 4)数据存储的特点:有序、可重复
    • 3.JAVA集合分为Collection和Map两种体系
      • 图示:

      • 1.Collection接口:单列数据,定义了存取一对对象的方法的集合
        • 1)List接口:元素有序,可重复的集合。(动态数组,与数组的区别是长度可以修改)
          • ArraryList 作为list接口的主要实现类,线程不安全,效率高,底层使用Object【】elementDate存储
            • jdk7
              • ArraryList底层,若容量不够,容量扩容为原来的1.5倍
              • 为了避免Arrary的自动扩容, 所以建议开发时使用带参的构造器ArraryList list=new ArraryList(int capacity) 提供初始化容量
            • jdk8
              • ArraryList list=new ArraryList() 底层object【】elementDate=初始化为{},并没有创建长度为10的数组,第一次创建add方法操作,底层才创建了长度为10的数组,并将元素添加到elementDate数组中,后续的扩容和添加操作和jdk7一样
          • LinkedList 对于频繁的插入、删除操作,效率比较高,底层使用双向链表存储
          • Vector 作为list接口的古老实现类,线程安全,效率低,底层使用,扩容时默认扩容为原来的二倍,Object【】elementDate存储
          • 方法:自定义类需要重写toString和equals方法

            • contaions 判断是否包含某个值,若直接new对象,则调用的equals方法
            • contaionsAll(Collection coll)
            • add
            • addAll(Collection coll)
            • remove() 移除某个元素 ,判断是否移除,判断的也是equals方法
            • removeAll(Collection coll) 从当前集合移除某个集合的共同值(差集)
            • retainAll(Collection coll) 交集
            • equals(object obj) 比较两个集合是否相等
            • hashCode() 返回当前对象的哈希值
            • Iterator()迭代器接口
              • next() 挨个输出元素,超过范围报出异常
                • 1.指针下移
                • 2.将下移以后位置上的元素返回
              • hashNext 判断是否还有元素
              • 内部定义了remove方法,移除元素操作
        • 2)Set:元素无序、不可重复的集合。
          • HashSet:作为set接口的主要实现类,线程不安全,可以存储null值
            • 必须要重写hashCode和equals方法
            • 1.无序性:不是随机性,存储的数据在底层数组中并非按照数组的索引数据进行添加,而是根据数据的哈希值决定的。
            • 2.不可重复性:保证添加的元素按照equals()判断,不能返回true相同的元素只有一个、
            • 3.添加元素的过程
              • 首先调用hashCode()计算哈希值,
              • 哈希值通过某种算法计算出在HashSet底层数组中的位置()索引位置
              • 判断此位置上是否已经有元素
                • 1.若没有其他元素,则添加成功
                • 如果此位置上有其他元素,比较两个元素的哈希值,2.如果哈希值不相同则添加成功,如果哈希值相同,进而需要比较equals方法,3.若不同,则添加成功,否则添加失败。
                • 对于2和3,待添加数据与数组中存在的数据以链表的形式存储(jdk7 jdk8的不同,七上八下)
          • LinkedHashset:作为HashSet子类,遍历其内部的数据,可以按照添加的顺序遍历
            • 作为HashSet的子类,在原有的基础上,添加了引用,用来对下一个添加的数据进行双向指引(双向链表),对于比较频繁的遍历操作,效率高于HashSet
          • TreeSet:可以按照添加对象的指定属性进行排序
            • 1.向TreeSet中添加的数据,必须是相同类的对象
            • 2.自然排序中(实现comparable接口),比较两个对象是否相同的方法是compareTo返回0,并不是equals方法
            • 3.在定制排序中comparator,比较两个对象是否相同的方法是compare方法返回0,不再是eauals方法
        • 若想去除list的重复数据,可以将list利用addAll方法添加到set中,从而达到去重的目的,对于自定义类,需要重写equals和hashcode方法
        • 当hashset中自定义类对象的属性改变时,其所对应的哈希值也会改变,但是已经创建的位置不会改变
      • 2.Map接口:双列数组,保存具有映射关系的”key--value“键值对集合
        • 图示:

      • Map结构的理解:
        • Map中的key:无序的、不可重复。使用set存储所有的key
        • Map中的value:无序的、可重复的,使用Collection存储所有的value,
        • 一个键值对key:value构成了一个Entry对象
        • Map中的entry:无序的、不可重复的,使用set存储所有的entry
      • HashMap的底层实现原理
        • HashMap map =new HashMap();在实例化以后,底层创建了一个长度为16的一维数组Entry【】table
        • 添加put方法的调用:
        • 首先,计算key所在类的hashcode值,若经过计算得到的位置上数据为空,则添加成功
        • 若此位置上的数据不为空。比较待添加数据和原本数据的哈希值,若哈希值不相同,则添加成功
        • 若哈希值不相同,调用equals方法,若不太相同,则添加成功。若相同,则与原来的数据以链表的形式储存
        • 当超出临界值时,并且要存放的位置非空时,进行扩容,扩容为原来的二倍,需要重新计算位置(容量不一样可能会导致哈希值不同,导致数据的位置需要重新计算)
        • 添加时,若key值位置存在原有的key值,讲原来的vlaue替换为新添加的value值
        • jdk8

      • LinkedHashMap 能够记录数据添加的先后顺序
      • Map常用方法:

      • Map的遍历:(不能使用迭代器)
        • 1.遍历所有的key集:
          • map.keySet();
          • 按照set的方式遍历(迭代器,foreach,for)
        • 2.遍历所有的value集
          • Collection values=map.values();
          • 按照Collection遍历的方式遍历(迭代器,foreach,for)
        • 3.遍历Entry数组集:
          • entrySet();
          • 按照set的方式遍历(迭代器,foreach,for),也可以对其进行Entry强转,然后电泳Entry的getKey和getValue方法
        • TreeMap:可以对key进行排序(不能对value进行排序)
          • 1.自然排序(在自定义类中实现Compareable接口,重写compareTo方法)
          • 2.定制排序(创建TreeMap时直接实现Comparator,重写compare方法)
      • Hashtable
        • Properties用于处理属性文件,它的key和value都是String类型
        • load(file) 加载流对应的文件
        • getProperty("key") key作为参数会得到一个String类型的value
    • 4.Collections工具类
      • 1)reverse(list):反转list中元素的顺序,返回void
      • 2)shuffle(list):随机排列liest中元素的顺序
      • 3)swap(list,Comparator) 默认为其自然排序
      • 4)swap(list,int ,int )将list集合中i处元素和j处元素进行交换
      • 5)max(collection,Comparator)根据自然排序或指定排序寻找最大值
      • 6)min.........
      • 7)int frequency(lsit,Object) 某个元素在list中出现的次数
      • 8)void copy(list dest,list src)将src中的内容复制到dest中,首先要将待接受的list进行填充,List dest=Arrays.asList(new object[src.size()])
      • 9)synchronizedXxx()即可将线程不安全的Collection或map,转换成线程安全的、
    • 总结:
      • Map:
        • 双列数据,存储key-value数据
        • key:无序的、不可重复的->Set存储
        • value:无序的、可重复的->Collection存储
        • key-value无序的、不可重复->Set存储
      • HashMap的底层实现原理(jdk8)
        • 数组+链表+红黑树(排序二叉树)
      • Map中常用的实现类:
        • HashMap:作为Map的主要实现类,线程不安全,效率高
          • LinkedHashMap:保证遍历map元素时,可以按照添加的顺序实现遍历,原因:在原有的HashMap的底层结构基础上,添加了一对指针,指向前一个和后一个元素,对于频繁的遍历操作,此类效率高于HashMap
        • TreeMap:保证按照添加的key-value对进行排序,实现排序遍历使用自然排序或定制排序
        • Hashtable:古老的实现类,线程安全,效率低,不能存储nll的key和value,不常用
          • Properties:用来处理配置文件。key和value都是String类型
      • 遍历Map中的key-value对
        • keySet
        • Entry
        • Values
这篇关于JAVA集合的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!