java核心day02

集合

集合:java提供的一个容器

数组:集合

数组可以存储基本数据类型,大小不可变

集合只能存储引用数据类型,大小可以改变

  • 单列集合Collection 拥有List和Set

  • 双列集合Map

Collection集合

如果创建Collection集合的时候没有指定数据类型,自动提升为Object类型

常用方法

  • 创建对象

 Collection<Integer> coll = new ArrayList<>();
 Collection<Integer> coll1 = new ArrayList<>();
  • 遍历

 for (int i = 0; i < 12; i++) {
     coll.add(i);
 }
 for (int i = 6; i < 45; i++) {
     coll1.add(i);
 }
  • 是否一个集合包含另一个集合元素contains(Collection?)

 boolean contains = coll1.contains(coll);

  • //删除所有包含coll元素的内容removeAll(Collection?)

 //        boolean removeAll = coll1.removeAll(coll);
  • /交集retainAll(Collection?)

 boolean b = coll.retainAll(coll1);
  • 删除coll.clear();

 coll.clear();
  • 是否为空coll.isEmpty();

 coll.isEmpty();
  • 包含的个数coll.size();

 coll.size();

集合的遍历方式

  • 增强for

  • iterator

hashNext()表示当前迭代器里面是否还有下一个元素

next()表示的就是下一个元素

  • 增强for

 Collection<Integer> coll = new ArrayList();
         for (int i = 0; i < 5; i++) {
             coll.add(i);
         }
         for (Integer integer : coll) {
             System.out.println(integer);
         }
     }
  • iterator迭代器

 Iterator<Integer> iterator = coll.iterator();
 while (iterator.hasNext()) {
     String next =  iterator.next();
 }

List集合

创建List集合的方式:多态的方式创建

接口

实现了List接口的实现类集合,称为List集合

可以使用索引精确控制每个元素

以一种线性方式进行存储,可以通过索引访问集合中的指定元素

  • 特点:元素有序,存入顺序和取出顺序一致

    • 它是一个元素存取有序的集合。

    • 带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。

    • 可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。

List常用方法:

  • //指定位置插入元素

 List<String> list = new ArrayList<>();
 for (int i = 0; i < 8; i++) {
     list.add(i+"");
 }
 list.add(0,"a");
  • //获取指定位置元素

 System.out.println(list.get(0));
  • //替换指定位置的元素

 list.set(0,"b");
  • //返回泛型类型的数组

 //        String[]  s = new  String[list.size()];
         String[] strings = list.toArray(new String[list.size()]);
  • //根据索引移除元素

 list.remove(0);

List的子类

ArraysList集合

  • 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为: 查询数据、遍历数据,所以array List为最常用的数组

    • ArraysList中维护了一个Object类型的数组elementDate

    [debug]源码 transient Object[] elementDate;

    transient表示瞬间,短暂的,表示该属性不会背序列化

    • 当创建ArrayList对象时,如果用的是无参构造器,则初始elementDate容量为10,如需要再次扩容,则扩容elementDate为1.5倍数

      •  Arraylist()
    • 如果使用的是指定大小的构造器,则初始elementDate容量为指定大小,如果需要扩容,则直接扩容为elementDate的1.5倍,

      •  Arraylist(int)

ArraysList底层分析机制

使用Arrays.copyof扩容保证内容不变

Vector集合

底层也是一个数组

线程是同步的,安全

在使用线程时候考虑使用Vector

  • 扩容

    • 无参,默认10,满后按照2倍扩容

    • 如果指定大小,直接按照两倍扩容

LinkedList链表

LinkedList底层实现了一个双向链表和段高端队列

可以添加任意元素(元素可以重复)包括null

线程不安全,没有同步

  • 集合数据存储的结构是链表结构。方便元素添加、删除的集合。

  • 双向链表(数据域和指针域)

    特点:查询慢,增删快

ArrayList和LinkedLIst比较

ArraysList:可变数组 增删效率较低 改查效率较高

LinkedList:双向链表 增删效率较高通过链表追加 改查效率较低

set接口

  • 无序、

  • 不允许重复元素、最多包含一个元素,包括null

  • 继承Collection接口

    • 其中包括 linkedset 和hashset

hashset集合

  • 元素不可重复,元素无序

  • 底层是一个HashMap支持

  • 根据对象的哈希值来确定集合中的储存位置

  • 具有良好的存取性能,保证元素的唯一性

    • 依赖hashCode 和equals方法

HashSet集合存储数据的结构(哈希表)

哈希表是由数组+链表+红黑树实现

保证集合中的唯一,是由hashCode和equals来决定的


HashSet存储自定义类型元素

存放一个 自定义元素时,需要重写对象的HashCode和equals方法,建立自己的比较方式


LinkedHashSet

元素唯一,具有顺序

链表和哈希表组合的一个数据存储结构


Collections工具类

往集合中添加一些元素

  • public static <T> boolean addAll(Collection<T> c, T... elements)

打乱顺序

  • public static void shuffle(List<?> list) 打乱顺序

将集合中元素按照默认规则排序

  • public static <T> void sort(List<T> list)

:将集合中元素按照指定规则排

  • public static <T> void sort(List<T> list,Comparator<? super T> )

Comparator比较器

:将集合中元素按照默认规则排序。

  • public static <T> void sort(List<T> list)

  • 两个对象之间比较大小

    • Comparable:要求了被排序的类型

      需要实现Comparable接口完成比较的功能

     public final class String implements java.io.Serializable, Comparable<String>, CharSequence {}
    • Comparator :public int compare(String o1 , String o2)

    • 两个对象比较的结果有三种:大于,等于,小于。

      如果要按照升序排序, 则o1 小于o2,返回(负数),相等返回0,01大于02返回(正数) 如果要按照

      降序排序 则o1 小于o2,返回(正数),相等返回0,01大于02返回(负数)


Comparable和Comparator两个接口的区别。

  • Comparable : 强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的compareTo方法被称为它的自然比较方法。只能在类中实现compareTo()一次,不能经常修改类的代码实现自己想要的排序。实现此接口的对象列表(和数组)可以通过Collections.sort(和Arrays.sort)进行自动排序,对象可以用作有序映射中 的键或有序集合中的元素,无需指定比较器。

  • Comparator强行对某个对象进行整体排序。可以将Comparator 传递给sort方法(如Collections.sort或Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用Comparator来控制某些数据结构(如有序set或 有序映射)的顺序,或者为那些没有自然顺序的对象collection提供排序

map集合

Map实现类的结构

  • Map:双列数据,存储key-value对的数据 ----类似高中的函数 y= f(x)

    • HashMap:作为Map的主要实现类 线程不安全效率高:存储null的key和value

      • -LinkedHashMap:保证再遍历map元素是,可以按照添加的顺序实现遍历; 原因:在原有的Hashmap底层基础上,添加了一堆指针,指向前一个和后一个,队友频繁的遍历操作,此类执行效率高于HashMap

    • -TreeMap:按照添加的key-value对进行排序,实现排序遍历,此时考虑key的自然排序,或者定制排序;

      底层使用红黑树;

    • -Hashtable:古老的实现类:线程安全,效率低,不能储存null的key和value

    • --Properties: 常用来处理配置文件。key和value都是String类型

HashMap的底层:数组+链表+红黑树


二、结构的理解

  • Map中的key :无序的,不可重复的 ,

    • 使用Set存储所有的key---重写equals和hashCode(HashMap为列)

  • Map中的value: 无序的,可以重复的,

    • 使用Collection存储所有的value--------value所在的类要重些equals()。

  • 一个键值对:key和value构成了一个Entry对象。

    Entry:无序的,不可重复的,使用Set存储所有的entry

    三、HashMap的底层实现原理

    1.new HashMap()底层没有创建一个长度为16的数组

    2.jdk 8 底层的数组是Node[],而不是Entry[]

    3.首次调用put()方法时候,底层创建长度为16的数组

    4.jdk7底层结构只有:数组+链表,jdk中底层结构:数组+链表+红黑树

    当数组的某一个索引位置上的元素以链表形式存在的数据个数 > 8且当前数组的长度>64,此时索引的位置上的所有数据改为使用红黑树存储

DEFAULT_INITTAL_CAPACITY: HashMap的默认容量,16

DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75

threshold:扩容的临界值,=容量*填充因子:16 * 0.75=>12

MIN_TREEIFY_CAPACITY:桶中的Node被 树化时最小的hash表容量:64

LinkHaskMap的底层实现原理

 

Map中定义的方法

添加、删除、修改、操作:

Object put (Object key ,object value):将指定的key-value

添加到(或修改)当前map对象中

void putAll(Map m):将m中所有key-value对存放到当前map中

Object remove(object key):指定一处key的key-value对,并且返回value

void clean():清空当前Map中所有的数据

元素查询的操作:

  1. object get(object key ):获取指定key对应的value
  2. boolean containsKey (Object key):是否包含 指定的key
  3. boolean containsValue(object value):是否包含指定的value
  4. int size() :返回map中key-value对的个数
  5. boolean isEmpty():判断当前map是否为空
  6. boolean equals (object obj) :判断当前map和参数对象obj是否相等元视图操作的方法
  7. Set keySet():返回所有key构成的Set集合
  8. Collection values():返回所有key构成的Set集合
  9. Set entrySet():返回所有Key - value对构成的Set集合
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值