【JAVA SE】第十五章 ArrayList、LinkedList、HashMap和HashSet
第十五章 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相关推荐
- Java(第十五章)
第十五章 一.字符串类String 1.String是一个类,位于java.lang包中 2.创建一个字符串对象的2种方式: String 变量名="值"; String 对象名= ...
- Java学习 第十五章 成员变量和局部变量的区别 / 三大特征之一 (封装性)/构造方法 /private关键字
第十五章 局部变量和成员变量: 1.定义位置不一样 局部变量:在方法内部定义 成员变量:在方法的外部,直接写在类当中 2.作用范围不一样 局部变量:只能在方法当中使用 成员变量:整个类都可以使用 3. ...
- 【JAVA SE】第五章 数组、多维数组和Arrays类
第五章 数组.多维数组和Arrays类 文章目录 第五章 数组.多维数组和Arrays类 一.数组 1.概述 2.声明数组变量 3.创建数组 4.For-Each 循环 二.多维数组 1.概述 2.多 ...
- java第五章课后题_黑猴子的家:Java SE 练习题第五章
尾部都有答案 第五章练习题(继承) (1)下列关于继承优点的叙述正确的是哪几项?(选三项) A.可以创建更为特殊的类型 B.消除重复代码 C.执行效率高 D.便于维护 (2)在子类中调用父类中被覆盖的 ...
- java疯狂讲义输入输出视频_疯狂JAVA讲义---第十五章:输入输出(上)流的处理和文件...
在Java中,把这些不同类型的输入.输出抽象为流(Stream),而其中输入或输出的数据称为数据流(Data Stream),用统一的接口来表示,从而使程序设计简单明了. 首先我要声明下:所谓的输入输 ...
- java十五章_java:第十五章
第十五章 字符串1.字符串(String)的定义 String str="内容"; String str=new String(); //内容为null String str=ne ...
- 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条
http://blog.csdn.net/terryzero/article/details/3797782 疯狂JAVA讲义---第十二章:Swing编程(五)进度条和滑动条 标签: swing编程 ...
- java语言程序设计基础篇课后答案_《Java语言程序设计:基础篇》课后复习题答案-第十五章.pdf...
<Java语言程序设计:基础篇>课后复习题答案-第十五章 Chapter15Graphics 1. Theycoordinateshouldincreaseandthexcoordinat ...
- 【Java数据结构与算法】第十五章 B树、B+树和B*树
第十五章 B树.B+树和B*树 文章目录 第十五章 B树.B+树和B*树 一.B树 1.引入 2.介绍 二.B+树 1.引入 2.介绍 三.B*树 1.介绍 一.B树 1.引入 为什么数据库索引要使用 ...
最新文章
- 索尼AI CEO:我们要让AI在30年内拿到诺贝尔奖
- linux虚拟机安装oracle全过程(一)
- spring boot 限制初始值大小及参数中文详解
- 自用shell命令搜集
- 部署GitLab代码托管仓库
- 动态路由下的导航守卫--(to,from,next)
- python爬关键词百度指数_Python爬虫爬取百度指数的关键词搜索指数教程
- 算法导论适合c语言吗,看《算法导论》需要多好的数学基础?
- 《软件体系结构原理、方法与实践》第二版期末考试复习总结
- 【技巧】谷歌Chrome浏览器清理缓存的两种方式
- python爬虫豆瓣高分电影前一百部
- java mail类_Java Mail工具类
- 实用防火与防爆技术培训---第十讲 可燃气体的燃爆特性
- Java中的BigDecimal比较大于小于等于,四舍五入保留几位(setScale方法详解),加减乘除取余
- LWIP之DNS域名解析(二)
- 亲测绝对有用,,电脑不显示可连接WiFi列表,无法连接WiFi的解决办法。
- 用Python来检测微信好友是否拉黑你
- 一梦江湖——华山快还钱是怎么会事呢?
- scrcpy CreateProcessW() error 5
- 摩托罗拉Android+7寸,3.7英寸电容屏 摩托3G旗舰XT800发布
热门文章
- salesforce php,具有自动登录功能的Salesforce php REST API
- Codevs 1043 方格取数
- Beta版本测试报告以及Beta版本发布说明
- 图像编码中的小白问题sps ,pps ,nalu ,frame ,silce ect....
- ASP.NET 程序中常用的三十三种代码(1)
- 安全的本质--理解CIA和AAA
- ffmpeg视频处理
- MySQL深度剖析之事务隔离级别和锁机制(2021)
- Spark源码分析之Executor分析
- (94)分频器设计(奇数分频)