IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 【程序员养成之路】Java基础篇 6-集合 -> 正文阅读

[Java知识库]【程序员养成之路】Java基础篇 6-集合

以下内容若有误,欢迎私信我或在下方留言,谢谢^_?


集合

1.Collection

1.1 概述

Collection是单例集合的顶层接口,继承自Iterable,JDK不提供此接口的任何直接实现,但提供更具体的子接口(如Set、List)实现。

1.2 创建方式

  • 通过多态的方式创建
    Collection<Object> o = new ArrayList<>();
  • 使用具体实现类创建
    ArrayList<Object> o = new ArrayList<>();

1.3 常用方法

方法名说明
boolean add(E e)添加元素
boolean remove(Object o)移除指定元素
void clear()清空元素
boolean contains(Object o)判断是否存在指定元素
boolean isEmpty()判断是否为空
int size()获取集合长度

2.List

2.1 概述

List集合是一种有序、可含有重复元素的集合,可以精确控制列表中每个元素的插入位置。能够通过索引直接访问元素,并搜索列表中的元素。

说明:有序是指存储和取出的元素顺序是一致的,并不是排序。(以下同理)

2.2 特有方法

方法名说明
void add(int index, E element)指定位置插入指定元素
E remove(int index)删除指定索引处的元素,返回被删除的元素
E set(int index, E element)修改指定索引处的元素,返回被修改的元素
E get(int index)返回指定索引处的元素

2.3 List子类

(1)ArrayList:底层数据结构是数组,特点是查询快、增删慢

(2)LinkedList:底层数据结构是双向链表,特点是查询慢、增删快

(3)Vector:底层数据结构是数组,是线程安全的,但效率较低,使用较少

方法名说明
void addFirst(E, e)在头部插入指定元素
void addLast(E, e)在尾部插入指定元素
E getFirst()返回第一个元素
E getLast()返回最后一个元素
E removeFirst()删除并返回第一个元素
E removeLast()删除并返回最后一个元素

3.Set

3.1 概述

Set集合是一种不包含重复元素的集合。由于该集合不带有索引的方法,所以不能使用普通for循环进行遍历

3.2 哈希值

(1)哈希值:哈希值是JDK根据对象的地址字符串数字计算出来的int类型数值。

(2)获取对象哈希值的方法int hashCode()

(3)对象哈希值的特点

  • 同一个对象多次调用hashCode()方法返回的哈希值是相同的
  • 默认情况下,不同对象的哈希值不相同,但可以通过重写hashCode()方法实现不同对象的哈希值相同

特例
“重地”.hashCode(); // 哈希值为1179395
“通话”.hashCode(); // 哈希值为1179395

3.3 Set子类

(1)HashSet:底层数据结构是哈希表,是一种无序集合,即不保证存储和取出元素的顺序一致

HashSet的底层其实是HashMap,而HashMap的底层是哈希表,所以存储到HashSet里面的元素实际上是存储到了HashMap的key中

(2)LinkedHashSet:底层数据结构是双向链表哈希表,是一种有序集合,由链表保证元素有序,由哈希表保证元素唯一

(3)TreeSet:底层数据结构是自平衡的排序二叉树,元素按照一定规则进行排序,具体排序方式取决于构造方法

TreeSet的底层其实是TreeMap,而TreeMap的底层是自平衡的排序二叉树,所以存储到TreeSet里面的元素实际上是存储到了TreeMap的key中

4.泛型

4.1 概述

泛型是JDK 5中引入的特性,本质是参数化类型。它提供了编译时类型安全检测机制,能够在编译时检测到非法类型。

参数化类型就是将类型由原来的具体的类型参数化,然后在使用或者调用时传入具体类型。这种参数类型可以用在类、方法、接口中,分别被称为泛型类、泛型方法、泛型接口。

简单地说,泛型就是一种未知的数据类型。当我们不确定使用什么数据类型时,就可以使用泛型,泛型也可以看成是一个变量,用来传递数据类型。

4.2 好处

  • 将运行时期的问题提前到编译期间
  • 避免强制类型转换

4.3 泛型类

  • 格式:修饰符 class 类名<类型>{}
  • 范例public class Generic< T>{}
    - T可以是任意标识,常见的还有E、K、V等

4.4 泛型方法

  • 格式:修饰符 <类型> 返回值类型 方法名(类型 变量名){}
  • 范例public < T> void show(T t){}

4.5 泛型接口

  • 格式:修饰符 interface 接口名 <类型> {}
  • 范例public interface Generic< T>{}

5.Map

5.1 概述

  • Interface Map<K,V> K:键的类型;V:值的类型
  • 键不能重复,值可以重复,每个键最多映射到一个值

5.2 创建方式

  • 通过多态的方式
  • 通过具体实现类

5.3 常用方法

方法名说明
V put(K key,V value)添加元素
V remove(Object key)根据键删除键值对元素
void clear()移除所有键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsValue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()获取集合的长度
V get(Object key)根据键获取值
Set< K> keySet()获取所有键的集合
Collection< V> values()获取所有值的集合
Set<Map.Entry<K,V>> entrySet()获取所有键值对对象的集合

5.4 Map子类

(1)HashMap:底层数据结构是哈希表
(2)Hashtable:底层数据结构是哈希表,是线程安全的,效率较低,使用较少
(3)Properties线程安全的,并且key和value只能存储字符串String
(4)TreeMap:底层数据结构是自平衡的排序二叉树,TreeMap集合中的key自动按照大小顺序排序

5.5 遍历方式

(1)方式一:键集合→键→值

  • 获取所有键的集合【keySet()方法】
  • 遍历键的集合,获取每一个键【增强for循环】
  • 根据键获取值【get()方法】

(2)方式二:键值对集合→键值对→键和值

  • 获取所有键值对对象的集合【Set<Map.Entry<K,V>> entrySet()】
  • 遍历键值对对象的集合,获取每一个键值对对象【增强for】
  • 根据键值对对象获取键和值【getKey()和getValue()】

5.其它

5.1 集合中存放的是元素的地址或者说是元素的引用,不能存储基本数据类型

能够添加基本数据类型,是因为系统会进行自动装箱,即由基本数据类型转换为对应的包装类,但里面存储的依然是地址

5.2 contains()方法是通过equals()方法判断集合中是否包含了某个元素的方法


拓展1:迭代器(Iterator)

(1)概述

Java Iterator并不是一个集合,而是一种用于访问集合的方法,可以用于迭代ArrayList、HashSet等集合。迭代器只能用于遍历集合,不能对集合进行添加、修改、删除操作(ListIterator除外)。

原因:Java认为在迭代的过程中,迭代器的容量应当保持不变。

原理:Java容器中通常保留了一个域称为modCount,每次对容器进行修改,modCount就会加1。当调用iterator方法时,返回的迭代器会记录当前的modCount,随后在迭代器遍历过程中会检查这个值,一旦发现这个值发生变化,就说明对容器做了修改,就会抛异常(ConcurrentModificationException)。

(2)常用方法

方法名说明
boolean hasNext()判断迭代是否有下一个元素
E next()返回迭代中的下一个元素
default void remove()从底层集合中删除此迭代器返回的最后一个元素(可选操作)

拓展2:增强for循环

// 定义格式
for(ElementType element: arrayName){};
// 快捷键,输入num.for后回车
int[] num ={1, 2, 3, 4, 5};
for (int i : num) {
    System.out.println(num[i]);
}

拓展3:HashSet集合保证元素唯一性

总共会进行三个判断(一次遍历三次判断):

第一个判断:根据对象的哈希值计算出对象的存储位置,若该位置没有元素,则进行存储;若该位置有元素,则进行下一个判断;

第二个判断:比较存入元素和集合中元素的哈希值,如果哈希值不同,则进行存储;若哈希值相同,则进行下一个判断;

第三个判断:调用equals()方法比较两个元素,如果返回false,则将元素添加到集合;如果返回true,说明元素重复,不存储。

HashSet集合要保证元素唯一性,则需要重写hashCode()和equals()
原因
对于两个相同内容的不同对象,默认的hashCode()方法会将它们生成不同的哈希值,根据以上三个判断,它们都将被存储到集合中,所以需要重写hashCode()方法。
equals()方法默认比较的是内存地址,因此对于相同地址的不同内容的元素,都将被存储到集合中,所以也需要重写equals()方法。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:24:43  更:2021-07-10 14:26:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/17 20:50:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码