4-2-java高级API----集合

泛型

  • 通过泛型的语法定义,约束集合元素的类型,进行安全检查,把错误显示在编译期
  • 代码通用性更强,后面有案例
  • 泛型可以提升程序代码的可读性,但它只是一个语法糖(编译后这样的东西就被删除,不出现在最终的源代码中),对于JVM运行时的性能是没有任何影响的

泛型的声明

  • 泛型可以在接口、方法、返回值上使用:
    • java.util.List泛型接口/类:
      • public interface Collection<E> {}
  • 泛型方法的声明:
    • public <E> void print(E e) {}
  • 在方法返回值前声明了一个表示后面出现的E是泛型,而不是普通的java变量。

常用名称

  • E - Element (在集合中使用,因为集合中存放的是元素)
  • T - Type(Java 类)
  • K - Key(键)
  • V - Value(值)
  • N - Number(数值类型)
  • ? - 表示不确定的java类型

Collection接口

英文名称Collection,是用来存放对象的数据结构。其中长度可变,而且集合中可以存放不同类型的对象。并提供了一组操作成批对象的方法。
  • 数组的缺点:长度是固定不可变的,访问方式单一,插入、删除等操作繁琐。

Collection继承结构

在这里插入图片描述

  • Collection接口:
    • List接口 : 数据有序,可以重复。
      • ArrayList子类
      • LinkedList子类
    • Set接口 : 数据无序,不可以存重复值
      • HashSet子类
  • Map接口 : 键值对存数据
    • HashMap

Collections工具类

常用方法

boolean add(E e):               添加元素。
boolean addAll(Collection  c):  把小集合添加到大集合中 。
boolean contains(Object o) :    如果此 collection 包含指定的元素,则返回 trueboolean isEmpty() :             如果此 collection 没有元素,则返回 trueIterator<E> iterator():         返回在此 collection 的元素上进行迭代的迭代器。
boolean remove(Object o) :      从此 collection 中移除指定元素的单个实例。
int size() :                    返回此 collection 中的元素数。
Objec[] toArray():              返回对象数组

List接口

有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
  1. 数据有序
  2. 允许存放重复元素
  3. 元素都有索引

常用方法

ListIterator<E> listIterator()          			 返回此列表元素的列表迭代器(按适当顺序)。
ListIterator<E> listIterator(int index) 			 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
void add(int index, E element)         				 在列表的指定位置插入指定元素(可选操作)。
boolean addAll(int index, Collection<? extends E> c)  将指定 collection 中的所有元素都插入到列表中的指定位置(可选操作)。
List<E> subList(int fromIndex, int toIndex)			 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。
E get(int index)								   	返回列表中指定位置的元素。  
int indexOf(Object o)							    返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1

ArrayList实现类

  1. 存在于java.util包中。
  2. 内部用数组存放数据,封装了数组的操作,每个对象都有下标。
  3. 内部数组默认初始容量是10。如果不够会以1.5倍容量增长。
  4. 查询快,增删数据效率会降低。
  • 创建对象
    • new ArrayList():初始容量是10

ArrayList自动扩容

  1. ArrayList相当于在没指定initialCapacity时就是会使用延迟分配对象数组空间
  2. 当第一次插入元素时才分配10(默认)个对象空间。
  3. 假如有20个数据需要添加,那么会分别在第一次的时候,将ArrayList的容量变为10 ;
  4. 之后扩容会按照1.5倍增长。
  5. 也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15;
  6. 当添加第16个数据时,继续扩容变为15 * 1.5 =22个
  7. ArrayList没有对外暴露其容量个数,查看源码可以知道,实际其值存放在elementData对象数组中
  8. 只需拿到这个数组的长度,观察其值变化了几次就知道其扩容了多少次。只能通过反射技获取。

Linkedlist实现类

双向链表,两端效率高。底层就是数组和链表实现的。
在这里插入图片描述### 常用方法

void addFirst(E e) 	添加首元素
void addLast(E e) 	添加尾元素
E removeFirst() 	删除首元素
E removeLast() 		删除尾元素
E getFirst() 		获取首元素
E getLast() 		获取尾元素
E element() 		获取首元素

boolean offer(E e) 	添加尾元素
boolean offerFirst(E e) 添加首元素
boolean offerLast(E e) 添加尾元素
E peek() 			获取首元素
E peekFirst() 		获取首元素
E peekLast() 		获取尾元素
E poll() 			返回并移除头元素
E pollFirst() 		返回并移除头元素
E pollLast() 		返回并移除尾元素

Set接口

  1. set集合没有重复的元素
  2. set集合的元素是无序的
  3. set集合可以存null值,并且null最多有一个
  4. 我们自定义对象如果想去重,需要在自定义类中添加重写的equals()与hashCode()
  • HashSet:底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。当然K仍然不许重复。
  • TreeSet:底层就是TreeMap,也是红黑树的形式,便于查找数据。
  • HashMap实现中,当哈希值相同的对象,会在同一个hash值的位置存储不同属性的数据。

常用方法

boolean add(E e):	添加元素。
boolean addAll(Collection  c):把小集合添加到大集合中 。
boolean contains(Object o) : 如果此 collection 包含指定的元素,则返回 trueboolean isEmpty() :如果此 collection 没有元素,则返回 trueIterator<E> iterator():返回在此 collection 的元素上进行迭代的迭代器。
boolean remove(Object o) : 从此 collection 中移除指定元素的单个实例。
int size() : 返回此 collection 中的元素数。
Objec[] toArray():返回对象数组

HashSet实现类

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

Map接口

  • map集合的结构是:键值对、KEY与VALUE、Map.Entry<K,V>的映射关系
  • map中key值不允许重复,如果重复,对应的value会被覆盖
  • map中的映射关系是无序的
  • map没有自己的迭代器,所以迭代时通常需要转成set集合来迭代

在这里插入图片描述

Map继承结构

在这里插入图片描述

常用方法

 void clear()
          从此映射中移除所有映射关系(可选操作)。
 boolean containsKey(Object key)
          如果此映射包含指定键的映射关系,则返回 trueboolean containsValue(Object value)
          如果此映射将一个或多个键映射到指定值,则返回 trueV get(Object key)
          返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 nullboolean isEmpty()
          如果此映射未包含键-值映射关系,则返回 trueV put(K key, V value)
          将指定的值与此映射中的指定键关联(可选操作)。
 void putAll(Map<? extends K,? extends V> m)
          从指定映射中将所有映射关系复制到此映射中(可选操作)。
 V remove(Object key)
          如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。
 int size()
          返回此映射中的键-值映射关系数。
Set<Map.Entry<K,V>> entrySet()
          返回此映射所包含的映射关系的 Set 视图。

Map的迭代

Collection values() 把本map中的Value值取出放入一个Collection中并返回这个Collection
Set keySet() 把本map中的Key值取出放入一个Set集合中并返回这个Set集合
Set<Map.Entry<K,V>> entrySet()
把本map中的每一对KV都看成是一个Entry,把所有的Entry取出放入一个Set集合中并返回这个Set集合

HashMap

  • HashMap的键要同时重写hashCode()和equals()
  • hashCode()用来判断确定hash值是否相同
  • equals()用来判断属性的值是否相等
    • equals()判断数据如果相等,hashCode()必须相同
    • equals()判断数据如果不等,hashCode()尽量不同

基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。

HashMap底层是一个Entry数组,当存放数据时会根据hash算法计算数据的存放位置。算法:hash(key)%n,n就是数组的长度。

在这里插入图片描述

HashMap的扩容

成长因子:
static final float DEFAULT_LOAD_FACTOR = 0.75f;

  • 当空间只有仅仅为10的时候是很容易造成2个对象的hashcode 所对应的地址是一个位置的情况。
  • 这样就造成 2个 对象会形成散列桶(链表)。
  • 这时就有一个加载因子的参数,值默认为0.75 ,如果你hashmap的 空间有 100那么当你插入了75个元素的时候 hashmap就需要扩容了
  • 不然的话会形成很长的散列桶结构,对于查询和插入都会增加时间,因为它要一个一个的equals比较。
  • 但又不能让加载因子很小,如0.01,这样显然是不合适的,频繁扩容会大大消耗你的内存。
  • 这时就存在着一个平衡,jdk中默认是0.75,当然负载因子可以根据自己的实际情况进行调整。

HashMap的工作原理

  • Hashmap是面向查询优化的数据结构,查询性能优异
  • 内部用数组储存数据
  • 插入数据时,先根据Key的HashCode计算出数组的下标位置,再利用Key的equals()方法检查是否在重复的Key,如果不重复直接储存在数组中,如果重复就作为链表储存到散列桶中。
  • 插入的数据和数组容量的比值大于加载因子则进行数组扩容,并重新散列,默认的加载因子为“0.75”。
  • 查询时先根据Key的HashCode计算出数组的下标位置,再利用Key的equals()方法检查到Key的位置,如果找到返回Key对应的Value,否则返回Null.
  • 由于利用Key的HashCode直接计算出数据的储存位置,由于直接确定数据的储存位置,相对于其他查找方式,查询效率更高

HashMap/HashTable/ConcurrentHashMap三者的区别

  • HashMap几乎等价于HashTable
    • HashMap是map接口的实现类, 底层没有同步锁, 是线程不安全的
    • HashMap底层加了同步锁, 是线程安全的
  • ConcurrentHashMap 与hashtable加的同步锁位置不同, 是线程安全的, 速度要快
    • 实现了ConcurrentMap接口
    • 采用 CAS+synchronized , 保证线程安全
    • 底层是数组+链表+红黑树
      • 如果链表超过了某个值会转换成红黑树, 提高查询速度
  • HashTable 底层是数组+链表
    • 采用对象锁(synchronized修饰对象方法), 保证线程安全

在这里插入图片描述

集合的学习方法

  • 学习父级的公共方法,学习子类的创建方式,学习各种集合的特点
  • 关于List大多都是与下标有关的操作
  • 关于Set通常都是去重的操作
  • 关于map通常都是映射关系,也就是键值对
  • API要常练习,方法互相之间没有任何关系,用哪个,查哪个
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Java Platform指的是Java编程语言所基于的一套平台,包括Java虚拟机(JVM)、Java类库(Java API)等,可以在不同的操作系统和硬件平台上运行Java程序。Java平台的主要特点是跨平台性,即同一个Java程序可以在不同的操作系统和硬件平台上运行,而不需要对程序进行修改。Java平台还提供了丰富的类库,方便开发者进行快速开发。 ### 回答2: Java平台是由Java编程语言和Java虚拟机(JVM)组成的一种计算平台。Java平台的设计目标是实现“一次编写,到处运行”的理念,即开发者只需编写一次代码,就可以在不同的操作系统和设备上运行。 Java平台的核心是Java虚拟机,它提供了一个解释和执行Java字节码的环境。Java虚拟机使得Java程序可以在不同的操作系统上运行,这使得Java成为了一种跨平台的编程语言。 Java平台还包括Java类库,这是一组既包含基础功能又提供高级功能的软件库。Java类库包括了各种类和接口,用于处理文件、网络通信、图形界面、数据库等常见任务。开发者可以通过使用Java类库来减少重复劳动,并加快开发流程。 通过Java平台和Java编程语言,开发者可以实现各种不同类型的应用程序。Java平台被广泛应用于桌面应用、企业级应用和移动应用开发。它是世界上最广泛使用的编程平台之一。 Java平台的特点包括强大的安全性、可靠性和可移植性。Java通过提供丰富的安全机制,如类加载器和安全管理器,来确保应用程序的安全性。它还具有垃圾回收机制,以自动释放不再使用的内存资源。此外,Java平台的应用程序可以在不同的操作系统上运行,这使得它具有很高的可移植性。 总而言之,Java平台是一种跨平台的计算平台,提供了Java编程语言、Java虚拟机和Java类库等核心组件,用于开发各种类型的应用程序。它具有强大的安全性、可靠性和可移植性,因此广泛应用于各个领域的软件开发。 ### 回答3: Java平台是一种计算机编程语言和计算机平台的组合,这个平台提供了一个运行Java程序的环境和工具的集合。Java平台的核心是Java虚拟机(Java Virtual Machine,简称JVM),它负责将Java源代码编译成可在不同操作系统上运行的字节码。通过JVM,在不同的操作系统上可以统一运行Java程序。 Java平台的主要特点之一是它的跨平台性。由于Java程序是在JVM上运行的,而不是在特定操作系统上,所以能够在不同操作系统上统一运行。只要操作系统上有安装相应的Java虚拟机,就可以运行Java程序,不需要针对不同的操作系统进行代码修改。 Java平台还提供了丰富的库和工具,以帮助开发人员快速而高效地开发各种应用程序。其中包括标准库(Java Standard Library)提供了大量常用的类和方法,用于处理输入输出、网络通信、图形界面等常见任务;还有开发工具(例如编译器、调试器、集成开发环境等)和第三方类库,可以提供更广泛的功能和更便捷的开发体验。 Java平台广泛应用于各个领域的软件开发,尤其在企业级应用开发和大型系统中得到了广泛应用。它具备良好的跨平台性和稳定性,可以在不同的系统上部署和运行,并且具有强大的性能和安全性。同时,Java语言本身也具备简单易学、面向对象、类型安全等特点,使得开发人员可以高效地进行开发。 Java平台的不断发展和更新,也使得它逐渐成为了一种全球范围内使用最广泛的编程语言和开发平台之一。在移动应用开发、大数据处理、云计算等领域,Java平台都发挥着重要的作用,并持续为开发人员提供更多的技术和工具。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

偶尔也吹晚风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值