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知识库 -> 1.4 Java集合 -> 正文阅读

[Java知识库]1.4 Java集合

集合

* 什么是集合?

? ? ? ? 集合就是以特定结构存放一组数据的容器,就叫做集合

* 它有什么优点?

? ? ? ? 每种规则都有各自的优点,例如ArrayList就解决了数组长度规定的问题

常用的集合和相关类

Collection

? ? ? ? |- List

? ? ? ? ? ? ? ? |- LinkedList

? ? ? ? ? ? ? ? |- ArrayList

? ? ? ? |- Set

? ? ? ? ? ? ? ? |- HashSet

????????? ? ? ? |- TreeSet

Map

? ? ? ? |- HashMap

? ? ? ? |- TreeMap

Collections 工具类

Iterator 遍历器

LinkedList

  • 它是双链表结构的。特点就是两端操作效率更高,越中间效率越低

什么是双链表结构

将一个数据封装在一个节点对象,这个对象还有两个属性,上一个节点属性和下一个节点属性。第一个节点的前一个节点是最后一个节点,同理,最后一个节点的下一个节点是第一个节点。

如何使用LinkedList

LinkedList<String> linkedList = new LinkedList<>();

它的一些方法

  • ?add(T);? ? ? ? 向集合里添加一个数据
  • get(index);? ?获取一个数据,根据索引
  • remove(index);? 根据索引移除一个数据
  • remove(T);? ? ?根据对象移除一个数据
  • addFirst(T);? ?在头部添加一个数据
  • addLast(T);? ? 在尾部添加一个数据
  • getFirst();? ? ? 获取头部的数据
  • getLast();? ? ? 获取尾部的数据
  • removeFirst();
  • removeLast();
  • size()? ? ? ? ? ? 集合的长度
  • iterator()? ? ? ?返回遍历器对象

关于Iterator的使用

* 遍历方式

? ? ? ? 它有一个下标,当你刚获得它的时候,下标指向第一个的前一个,也就是一个空的位置,此时使用hasNext()会去判断下一个是否有数据(有返回true,无返回false)然后使用next()将下一个数据取出来,此时下标也会自动向后移动一位。 遍历的时候只需要不断的重复这个步骤即可

Iterator<String> iter = linkedList.iterator();
while(iter.hasNext()){
    String str = iter.next();
    System.out.println(str);
    // 移除一个数据
    if(str.equals("Hello")){
        iter.remove();
    }
}

* 步骤

? ? ? ? 1. 首先获取到遍历器 Iterator<String> iter = linkedList.iterator();

? ? ? ? 2. 判断遍历器中是否有下一个数据? iter.hasNext();?

? ? ? ? 3. 取出下一个数据并将下标向后移动 iter.next();

? ? ? ? 4. 在使用遍历器时,无法使用linedList对象去移除数据,如果想删除数据必须用 iter.remove() 会移除刚刚使用next()方法取出的数据

ArrayList

* 它是什么?

? ? ? ? 它是一个可变长度的数组,内部封装了一个数组,当存放的内容过多时,会新建一个1.5倍长的数组,并把之前的数据复制进去。

? ? ? ? 这个数组的初始长度默认是10,也可以在创建对象时指定

* 它的特点是?

? ? ? ? 它的访问效率非常高。 但是增加和删除的效率会很低,如果你删除了中间的一个数据,那么后面的所有数据都要向前移动一位

* 如何使用它?

? ? ? ? ArrayList<String> arr = new ArrayList<>();

? ? ? ? ArrayList<String> arr = new ArrayList<>(15);? ? ? ? 指定数组默认长度

* 它有哪些方法?

? ? ? ? 它的方法和LinkedList一致,除去收尾操作的方法(First,Last)

Foreach

ArrayList<String> arr = new ArrayList<>();
//... 添加一些数据

for(String str:arr){
    // 遍历代码
}

HashMap

* 它是什么

? ? ? ? 它叫做哈希表,也叫做散列表。

* 它的存储原理是什么?

  1. 首先在内存中有一个数组,它作为存放数据的容器
  2. 当存储数据的时候,根据Key计算出Hash值
  3. 然后使用Hash值和数组的一些数据计算出对应下标
  4. 将Key和Value封装到一个对象里(Entry)
  5. 然后将Entry对象放到数组的对应的位置。

* 如果这个位置已经有数据了怎么办?

? ? ? ? 对比他们的Key是否一致

????????????????如果Key一致就会使用新的数据替换掉旧的

????????? ? ? ? 如果Key不一致,他们则会放在一起(使用双链表结构挤在一起)

* 但是使用双链表不会影响效率吗?

? ? ? ? 会的,所以当存储的数据数量大于数组的70%时会将数组扩大。

? ? ? ? 在JDK1.8后,当一个位置的数据大于8个时,就会将数据从双链表结构转为红黑树来提高效率

* 所以它的特点是

? ? ? ? 它的存储,查询,修改 几乎都是很快的。因为它不需要进行什么遍历,唯一耗时的就是计算Key的Hash值以及计算下标值.

如何使用HashMap

HashMap<String,String> hm = new HashMap<>();
// 添加数据
hm.put("key","value");
hm.put("key1","value1");
hm.put("key2","value2");
// 获取
String val = hm.get("key");
// 移除
hm.remove("key");
// 遍历,使用keySet()返回一个Set集合,里面存放的都是HashMap的key
Set<String> keys = hm.keySet();
for(String key:keys){
    String value = hm.get(key);
}

HashMap里的数据是无序的,从原理中就可以看出

Collections 工具类

addAll(集合,数据1,数据2,数据3,...,数据n);? ? ? ? ? ? ? ? 一次性添加多个数据到集合(只能用于List)

sort(集合);? ? ? ? ? ? ? ? 排序,只能用于List

sort(集合,Comparator); 排序,使用自定义排序器

Collections.sort(list,new Comparator<Date>(){

    @Override
    public int compare(Date o1,Date o2){
        //如果o1大于o2返回正数,否则返回负数,如果相等返回0
        return o1.compareTo(o2);
    }

});

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-24 15:25:20  更:2021-08-24 15:27:05 
 
开发: 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/18 20:31:09-

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