第十五章 ArrayList、LinkedList、HashSet和HashMap

文章目录

  • 第十五章 ArrayList、LinkedList、HashSet和HashMap
  • 一、ArrayList
    • 1.概述
    • 2.添加元素
    • 3.访问元素
    • 4.修改元素
    • 5.删除元素
    • 6.计算大小
    • 7.ArrayList排序
    • 8.迭代ArrayList
    • 9.常用方法列表
    • 10.ArrayList扩容
  • 二、LinkedList
    • 1.概述
    • 2.在列表开头添加元素
    • 3.在列表结尾添加元素
    • 4.在列表开头移除元素
    • 5.在列表结尾移除元素
    • 6.获取列表开头的元素
    • 7.获取列表结尾的元素
    • 8.迭代LinkedList
    • 9.常用方法列表
  • 三、HashMap
    • 1.概述
    • 2.添加元素
    • 3.访问元素
    • 4.删除元素
    • 5.计算大小
    • 6.迭代HashMap
    • 7.常用方法
    • 8.HashMap扩容
  • 四、HashSet
    • 1.概述
    • 2.添加元素
    • 3.判断元素是否存在
    • 4.删除元素
    • 5.计算大小
    • 6.迭代HashSet
    • 7.常用方法

一、ArrayList

1.概述

ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素

底层数据结构是数组,查改快,增删慢,非线程安全,效率高

2.添加元素

import java.util.ArrayList;public class add{public static void main(String[] args) {ArrayList<String> names= new ArrayList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");System.out.println(names);}
}

运行结果:

[Amy, Bob, Chris, David]

3.访问元素

import java.util.ArrayList;public class get{public static void main(String[] args) {ArrayList<String> names= new ArrayList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");System.out.println(names.get(1));  // 访问第二个元素}
}

运行结果:

Bob

4.修改元素

import java.util.ArrayList;public class set{public static void main(String[] args) {ArrayList<String> sites = new ArrayList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");sites.set(2, "Sisyphus"); // 第一个参数为索引位置,第二个为要修改的值System.out.println(names);}
}

运行结果:

[Amy, Bob, Sisyphus, David]

5.删除元素

import java.util.ArrayList;public class remove{public static void main(String[] args) {ArrayList<String> names= new ArrayList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("DAVID");sites.remove(3); // 删除第四个元素System.out.println(names);}
}

运行结果:

[Amy, Bob, Chris]

6.计算大小

import java.util.ArrayList;public class size{public static void main(String[] args) {ArrayList<String> names= new ArrayList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");System.out.println(names.size());}
}

运行结果:

4

7.ArrayList排序

Collections 类也是一个非常有用的类,位于 java.util 包中,提供的 sort() 方法可以对字符或数字列表进行排序

import java.util.ArrayList;
import java.util.Collections;  // 引入 Collections 类public class sort{public static void main(String[] args) {ArrayList<Integer> myNumbers = new ArrayList<Integer>();myNumbers.add(33);myNumbers.add(15);myNumbers.add(20);myNumbers.add(34);myNumbers.add(8);myNumbers.add(12);Collections.sort(myNumbers);  // 数字排序for (int i : myNumbers) {System.out.println(i);}}
}

运行结果:

8
12
15
20
33
34

8.迭代ArrayList

//方式一:for
for (int i = 0; i < arraylist.size() - 1; i++) {System.out.println(arraylist.get(i));
}
//方式二:foreach
for (int i : arraylist) {System.out.println(arraylist.get(i));
}
//方式三:Iterator
//获取迭代器对象
Iterator<Integer> iterator= arraylist.iterator();
//循环迭代集合中的所有元素
while(iterator.hasNext()){//判断是否右下一个元素可迭代,如果有就继续循环System.out.println(iterator.next());
}
//方式四:ListIterator//获取迭代器对象
ListIterator<Integer> listIterator = arraylist.listIterator();
//循环迭代集合中的所有元素
while(listIterator .hasNext()){System.out.println(listIterator .next());
}

9.常用方法列表

继承自 Collection 接口的方法

方法 描述
boolean add(E e) 向集合中添加指定的元素
boolean addAll(Collection c) 向集合中添加参数集合中的所有元素
void clear() 清空集合
boolean contains(Object o) 判断集合是否包含指定元素
boolean containsAll(Collection c) 判断集合是否包含参数集合中的所有元素
boolean equals(Object o) 比较此 collection 与指定对象是否相等
int hashCode() 返回此 collection 的哈希码值
boolean isEmpty 判断集合是否为空,为空返回 true
Iterator<E> iterator() 返回用来迭代此集合的迭代器
boolean remove(Object o) 移除集合中的指定元素
boolean removeAll(Collection c) 移除此集合中属于参数集合的所有元素
boolean retainAll(Collection c) 仅保留此集合中属于两个集合交集的公共元素
int size() 返回此集合中的元素的个数
Object[] toArray() 将集合转为数组

ArrayList 自己的方法

方法 描述
void add(int index,E element) 在指定位置处向列表添加指定元素
boolean addAll(int index,Collection c) 在指定位置处向列表添加参数列表中的所有元素
E get(int index) 返回列表中指定位置处的元素
int indexOf(Object o) 返回本列表中指定元素第一次出现的索引
int lastIndexOf(Object o) 返回本列表中指定元素最后一次出现的索引
ListIterator<E> listIterator() 返回本列表独有的迭代器
E remove(int index) 移除列表中指定位置上的元素
E set(int index,E element) 用指定元素替换列表中指定位置的元素
List<E> subList(int fromIndex,int toIndex) 指定开始索引与结束索引,截取子列表【含头不含尾】

10.ArrayList扩容

ArrayList 底层是数组,用于存放插入的数据。初始大小是0,当有数据插入时,默认大小DEFAULT_CAPACITY = 10

当添加元素时,如果元素个数 +1 > 当前数组长度 (size + 1 > elementData.length)时,进行扩容,扩容后的数组大小是: oldCapacity + (oldCapacity >> 1

右移运算符(>>)
例:12 >> 2

二、LinkedList

1.概述

底层数据结构是链表,查改慢,增删快,非线程安全,效率高

  • LinkedList 继承了 AbstractSequentialList 类
  • LinkedList 实现了 Queue 接口,可作为队列使用
  • LinkedList 实现了 List 接口,可进行列表的相关操作
  • LinkedList 实现了 Deque 接口,可作为队列使用
  • LinkedList 实现了 Cloneable 接口,可实现克隆
  • LinkedList 实现了 java.io.Serializable 接口,即可支持序列化,能通过序列化去传输

2.在列表开头添加元素

import java.util.LinkedList;public class addFirst{public static void main(String[] args) {LinkedList<String> names= new LinkedList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");// 使用 addFirst() 在头部添加元素sites.addFirst("Sisyphus");System.out.println(names);}
}

运行结果:

[Sisyphus, Amy, Bob, Chris]

3.在列表结尾添加元素

import java.util.LinkedList;public class addLast{public static void main(String[] args) {LinkedList<String> names = new LinkedList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");// 使用 addLast() 在尾部添加元素sites.addLast("Sisyphus");System.out.println(names);}
}

运行结果:

[Amy, Bob, Chris, Sisyphuis]

4.在列表开头移除元素

import java.util.LinkedList;public class removeFirst{public static void main(String[] args) {LinkedList<String> names= new LinkedList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");// 使用 removeFirst() 移除头部元素sites.removeFirst();System.out.println(names);}
}

运行结果:

[Bob, Chris, David]

5.在列表结尾移除元素

import java.util.LinkedList;public class removeLast{public static void main(String[] args) {LinkedList<String> names= new LinkedList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");// 使用 removeLast() 移除尾部元素sites.removeLast();System.out.println(names);}
}

运行结果:

[Amy, Bob, Chris]

6.获取列表开头的元素

import java.util.LinkedList;public class getFirst{public static void main(String[] args) {LinkedList<String> names= new LinkedList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");// 使用 getFirst() 获取头部元素System.out.println(names.getFirst());}
}

运行结果:

Amy

7.获取列表结尾的元素

import java.util.LinkedList;public class getLast{public static void main(String[] args) {LinkedList<String> names= new LinkedList<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");// 使用 getLast() 获取尾部元素System.out.println(names.getLast());}
}

运行结果:

David

8.迭代LinkedList

参考 ArrayList 的迭代方式

9.常用方法列表

继承自 Collection 接口的方法

方法 描述
boolean add(E e) 向集合中添加指定的元素
boolean addAll(Collection c) 向集合中添加参数集合中的所有元素
void clear() 清空集合
boolean contains(Object o) 判断集合是否包含指定元素
boolean containsAll(Collection c) 判断集合是否包含参数集合中的所有元素
boolean equals(Object o) 比较此 collection 与指定对象是否相等
int hashCode() 返回此 collection 的哈希码值
boolean isEmpty 判断集合是否为空,为空返回 true
Iterator<E> iterator() 返回用来迭代此集合的迭代器
boolean remove(Object o) 移除集合中的指定元素
boolean removeAll(Collection c) 移除此集合中属于参数集合的所有元素
boolean retainAll(Collection c) 仅保留此集合中属于两个集合交集的公共元素
int size() 返回此集合中的元素的个数
Object[] toArray() 将集合转为数组

LinkedList 自己的方法

方法 描述
void addFirst(E e) 将指定元素插入此列表的开头
void addLast(E e) 将指定元素添加到此列表的结尾
E getFirst() 返回此列表的第一个元素
E getLast() 返回此列表的最后一个元素
E removeFirst() 移除并返回此列表的第一个元素
E removeLast() 移除并返回此列表的最后一个元素
E element 获取但不移除此列表的第一个元素
boolean offer(E e) 将指定元素添加到此列表的结尾
boolean offerFirst(E e) 在此列表的开头插入指定的元素
boolean offerLast(E e) 在此列表的结尾插入指定的元素
E peek() 获取但不移除此列表的第一个元素
E peekFirst() 获取但不移除此列表的第一个元素;如果此列表为空,返回 null
E peekLast() 获取但不移除此列表的最后一个元素;如果此列表为空,返回 null
E poll() 获取并移除此列表的第一个元素
E pollFirst() 获取并移除此列表的第一个元素;如果此列表为空,返回 null
E pollLast() 获取并移除此列表的最后一个元素;如果此列表为空,返回 null

三、HashMap

1.概述

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射

从结构实现来讲,HashMap是数组+链表+红黑树(JDK1.8增加了红黑树部分)实现的,如下如所示

HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步

HashMap 是无序的,即不会记录插入的顺序

HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value

2.添加元素

import java.util.HashMap;public class put{public static void main(String[] args) {// 创建 HashMap 对象 NamesHashMap<Integer, String> Names= new HashMap<Integer, String>();// 添加键值对Sites.put(1, "Amy");Sites.put(2, "Bob");Sites.put(3, "Chris");Sites.put(4, "David");System.out.println(Names);}
}

运行结果:

{1=Amy, 2=Bob, 3=Chris, 4=David}

3.访问元素

import java.util.HashMap;public class get{public static void main(String[] args) {// 创建 HashMap 对象 NamesHashMap<Integer, String> Names= new HashMap<Integer, String>();// 添加键值对Sites.put(1, "Amy");Sites.put(2, "Bob");Sites.put(3, "Chris");Sites.put(4, "David");System.out.println(Names.get(3));}
}

运行结果:

Chris

4.删除元素

import java.util.HashMap;public class remove{public static void main(String[] args) {// 创建 HashMap 对象 NamesHashMap<Integer, String> Names= new HashMap<Integer, String>();// 添加键值对Sites.put(1, "Amy");Sites.put(2, "Bob");Sites.put(3, "Chris");Sites.put(4, "David");Sites.remove(4);System.out.println(Names);}
}

运行结果:

{1=Amy, 2=Bob, 3=Chris}

5.计算大小

import java.util.HashMap;public class size{public static void main(String[] args) {// 创建 HashMap 对象 NamesHashMap<Integer, String> Names= new HashMap<Integer, String>();// 添加键值对Sites.put(1, "Amy");Sites.put(2, "Bob");Sites.put(3, "Chris");Sites.put(4, "David");System.out.println(Names.size());}
}

运行结果:

4

6.迭代HashMap

/**方式一:* 遍历 map 中的数据,但是 map 本身没有迭代器,所以需要先转换成 set 集合* Set<Key>:把 map 中的所有 key 值存入到 set 集合当中 -- keySet()*/
//1.将 map 集合中的 key 值取出存入 set 集合中,集合的泛型就是 key 的类型 Integer
Set<Integer> keySet = map.keySet();
//2.想要遍历集合就需要获取集合的迭代器
Iterator<Integer> it = keySet.iterator();
//3.循环迭代集合中的所有元素
while(it.hasNext()){    //判断是否有下一个元素可以迭代Integer key = it.next();System.out.println(key + "=" + map.get(key));
}/**方式二:* 遍历 map 集合,需要把 map 集合先转成 set 集合* 是把 map 中的一对键值对 key & value 作为一个 Entry 整体放入 set* 一对 K,V 就是一个 Entry*/
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
//获取迭代器
Iterator<Map.Entry<Integer, String>> it2 = entrySet.iterator();
while(it2.hasNext()){Map.Entry<Integer, String> entry = it2.next();System.out.println(entry.getKey() + "=" + entry.getValue());
}

7.常用方法

继承自 Map 接口的方法

方法 描述
V put(K key,V value) 在此映射中关联指定值与指定键
int hashCode() 返回此对象的哈希码值
boolean equals(Object o) 比较指定对象与此映射的相等性
boolean isEmpty() 如果此映射不包含键-值映射关系,则返回 true
int size() 返回此映射中的键-值映射关系数
boolean containKey(Object key) 如果此映射包含对于指定键的映射关系,则返回 true
boolean containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true
V get(Object key) 返回指定键所映射的值;如果对于该键来说,此映射不包含任何映射关系,则返回 null
Y remove(Object o) 从此映射中移除指定键的映射关系(如果存在)
Collection<V> values() 返回此映射所包含的值得 Collection 视图
Set<Map.Entry<K,V>> entrySet() 返回此映射所包含的映射关系的 Set 视图
Set<K> keySet() 返回此映射中所包含的键的 Set 视图

8.HashMap扩容

为了方便说明,这里明确几个名词:

  • capacity(容量),默认为 16
  • loadFactor(加载因子),默认为 0.75
  • threshold(阈值),阈值 = 容量 × 加载因子,默认为 12.当元素数量超过阈值时便会触发扩容

一般情况下,当元素数量超过阈值时便会触发扩容,每次扩容的容量都是之前容量的 2 倍

HashMap 的容量是有上限的,必须小于 1 << 30(即 1073741824,<< 是左移运算符)

四、HashSet

1.概述

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合

HashSet 允许有 null 值

HashSet 是无序的,即不会记录插入的顺序

HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问

2.添加元素

import java.util.HashSet;public class add{public static void main(String[] args) {HashSet<String> names= new HashSet<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");sites.add("Bob");  // 重复的元素不会被添加System.out.println(names);}
}

运行结果:

[Amy, Bob, Chris, David]

3.判断元素是否存在

import java.util.HashSet;public class contains{public static void main(String[] args) {HashSet<String> names= new HashSet<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");System.out.println(sites.contains("Chris"));}
}

运行结果:

true

4.删除元素

import java.util.HashSet;public class remove{public static void main(String[] args) {HashSet<String> names = new HashSet<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");sites.remove("Chris");  // 删除元素,删除成功返回 true,否则为 falseSystem.out.println(names);}
}

运行结果:

[Amy, Bob, David]

5.计算大小

import java.util.HashSet;public class size{public static void main(String[] args) {HashSet<String> names = new HashSet<String>();sites.add("Amy");sites.add("Bob");sites.add("Chris");sites.add("David");System.out.println(sites.size());  }
}

运行结果:

4

6.迭代HashSet

参考 ArrayList 的迭代方式,由于 HashSet 未继承 List 接口,所以无法实现方式四:ListIterator

7.常用方法

继承自 Collection 接口的方法

方法 描述
boolean add(E e) 向集合中添加指定的元素
boolean addAll(Collection c) 向集合中添加参数集合中的所有元素
void clear() 清空集合
boolean contains(Object o) 判断集合是否包含指定元素
boolean containsAll(Collection c) 判断集合是否包含参数集合中的所有元素
boolean equals(Object o) 比较此 collection 与指定对象是否相等
int hashCode() 返回此 collection 的哈希码值
boolean isEmpty 判断集合是否为空,为空返回 true
Iterator<E> iterator() 返回用来迭代此集合的迭代器
boolean remove(Object o) 移除集合中的指定元素
boolean removeAll(Collection c) 移除此集合中属于参数集合的所有元素
boolean retainAll(Collection c) 仅保留此集合中属于两个集合交集的公共元素
int size() 返回此集合中的元素的个数
Object[] toArray() 将集合转为数组

【JAVA SE】第十五章 ArrayList、LinkedList、HashMap和HashSet相关推荐

  1. Java(第十五章)

    第十五章 一.字符串类String 1.String是一个类,位于java.lang包中 2.创建一个字符串对象的2种方式: String 变量名="值"; String 对象名= ...

  2. Java学习 第十五章 成员变量和局部变量的区别 / 三大特征之一 (封装性)/构造方法 /private关键字

    第十五章 局部变量和成员变量: 1.定义位置不一样 局部变量:在方法内部定义 成员变量:在方法的外部,直接写在类当中 2.作用范围不一样 局部变量:只能在方法当中使用 成员变量:整个类都可以使用 3. ...

  3. 【JAVA SE】第五章 数组、多维数组和Arrays类

    第五章 数组.多维数组和Arrays类 文章目录 第五章 数组.多维数组和Arrays类 一.数组 1.概述 2.声明数组变量 3.创建数组 4.For-Each 循环 二.多维数组 1.概述 2.多 ...

  4. java第五章课后题_黑猴子的家:Java SE 练习题第五章

    尾部都有答案 第五章练习题(继承) (1)下列关于继承优点的叙述正确的是哪几项?(选三项) A.可以创建更为特殊的类型 B.消除重复代码 C.执行效率高 D.便于维护 (2)在子类中调用父类中被覆盖的 ...

  5. java疯狂讲义输入输出视频_疯狂JAVA讲义---第十五章:输入输出(上)流的处理和文件...

    在Java中,把这些不同类型的输入.输出抽象为流(Stream),而其中输入或输出的数据称为数据流(Data Stream),用统一的接口来表示,从而使程序设计简单明了. 首先我要声明下:所谓的输入输 ...

  6. java十五章_java:第十五章

    第十五章 字符串1.字符串(String)的定义 String str="内容"; String str=new String(); //内容为null String str=ne ...

  7. 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条

    http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...

  8. java语言程序设计基础篇课后答案_《Java语言程序设计:基础篇》课后复习题答案-第十五章.pdf...

    <Java语言程序设计:基础篇>课后复习题答案-第十五章 Chapter15Graphics 1. Theycoordinateshouldincreaseandthexcoordinat ...

  9. 【Java数据结构与算法】第十五章 B树、B+树和B*树

    第十五章 B树.B+树和B*树 文章目录 第十五章 B树.B+树和B*树 一.B树 1.引入 2.介绍 二.B+树 1.引入 2.介绍 三.B*树 1.介绍 一.B树 1.引入 为什么数据库索引要使用 ...

最新文章

  1. 索尼AI CEO:我们要让AI在30年内拿到诺贝尔奖
  2. linux虚拟机安装oracle全过程(一)
  3. spring boot 限制初始值大小及参数中文详解
  4. 自用shell命令搜集
  5. 部署GitLab代码托管仓库
  6. 动态路由下的导航守卫--(to,from,next)
  7. python爬关键词百度指数_Python爬虫爬取百度指数的关键词搜索指数教程
  8. 算法导论适合c语言吗,看《算法导论》需要多好的数学基础?
  9. 《软件体系结构原理、方法与实践》第二版期末考试复习总结
  10. 【技巧】谷歌Chrome浏览器清理缓存的两种方式
  11. python爬虫豆瓣高分电影前一百部
  12. java mail类_Java Mail工具类
  13. 实用防火与防爆技术培训---第十讲 可燃气体的燃爆特性
  14. Java中的BigDecimal比较大于小于等于,四舍五入保留几位(setScale方法详解),加减乘除取余
  15. LWIP之DNS域名解析(二)
  16. 亲测绝对有用,,电脑不显示可连接WiFi列表,无法连接WiFi的解决办法。
  17. 用Python来检测微信好友是否拉黑你
  18. 一梦江湖——华山快还钱是怎么会事呢?
  19. scrcpy CreateProcessW() error 5
  20. 摩托罗拉Android+7寸,3.7英寸电容屏 摩托3G旗舰XT800发布

热门文章

  1. salesforce php,具有自动登录功能的Salesforce php REST API
  2. Codevs 1043 方格取数
  3. Beta版本测试报告以及Beta版本发布说明
  4. 图像编码中的小白问题sps ,pps ,nalu ,frame ,silce ect....
  5. ASP.NET 程序中常用的三十三种代码(1)
  6. 安全的本质--理解CIA和AAA
  7. ffmpeg视频处理
  8. MySQL深度剖析之事务隔离级别和锁机制(2021)
  9. Spark源码分析之Executor分析
  10. (94)分频器设计(奇数分频)