第49节:Java集合框架中底层文档的List与Set
Java集合框架中的List与Set
// 简书作者:达叔小生
Collection
-> Set 无序不重复 -> 无序HashSet,需要排序TreeSet
-> List 有序可重复 -> 查,改ArrayList,增删LinkedList
List
为列表,中在列表中的对象是由顺序的排序的,并且是有重复的对象。
简单为:有序,有重复。
Set
为集合,在集合中的对象是不按照顺序排列的,并且是没有重复的对象的。
简单为:无序,无重复。
Set
为无序集合,无序无重复;
List
为有序集合,有序有重复;
// 简书作者:达叔小生
Collection
-> Set
-> HashSet
-> LinkedHashSet
-> TreeSet
-> List
-> ArrayList
-> Vector
-> LinkedList
案例
// 简书作者:达叔小生
import java.util.List;
import java.util.ArrayList;
public class Demo{
public static void main(String args[]){
// 创建列表的实现类对象
ArrayList<String> arrayList = new ArrayList<String>();
// 添加数据
arrayList.add("a");
arrayList.add("b");
arrayList.add("c");
// 移除
arrayList.remove(1);
// 获取数据
String s = arrayList.get(1);
System.out.println(s);
// 获取长度
int a = arrayList.size();
// 打印所有元素
for(int i=0; i<arrayList.size(); i++){
String s = arrayList.get(i);
System.out.println(s);
}
}
}
// 简书作者:达叔小生
public class ListDemo{
public static void main(String[] args){
// List
List list = new ArrayList();
// 添加元素
list.add( new Student("a",12) );
list.add( new Student("b",13) );
list.add( new Student("c",14) );
// 插入元素
// list.add( 1, new Student("d",15) );
// list.remove(44);
// 角标越界IndexOutOfBoundsException)
// list.set( 2, new Student("dashucoding", 16) );
// 循环出对象
for(Iterator it = List.iterator(); it.hasNext(); ){
Student stu = (Student) it.next();
System.out.println(stu);
}
// 获取对象
Object obj = list.get(1);
System.out.println(obj);
// 获取对象
for(int i = 0; i<list.size(); i++){
System.out.println(list.get(i));
}
}
// 简书作者:达叔小生
import java.util.Set;
import java.util.HashSet;
public class Demo{
public static void main(String args[]){
HashSet<String> hashSet = new HashSet<String>();
Set<String> set = hashSet;
// 实现类向上转型为接口
// 同理 Set<String> set = new HashSet<String>();
// 添加元素
set.add("a");
set.add("b");
set.add("c");
set.add("d");
// 获取集合中的元素长度
int a = set.size();
}
}
// 简书作者:达叔小生
import java.util.Set;
import java.util.HashSet;
import java.util.Iterator;
public class Demo{
public static void main(String args[]){
HashSet<String> hashSet = new HashSet<String>();
Set<String> set = hashSet;
// 实现类向上转型为接口
// 同理 Set<String> set = new HashSet<String>();
// 添加元素
set.add("a");
set.add("b");
set.add("c");
set.add("d");
// 迭代器 iterator() 遍历整个set
// 通过迭代器取出集合中的对象
Iterator<String> it = set.iterator<String>();
while(it.hasNext){
String s = it.next();
System.out.println(s);
}
}
}
// 简书作者:达叔小生
public class ListIteratorDemo{
// 创建List对象
List list = new ArrayList();
// 添加元素
List.add("a");
List.add("b");
List.add("c");
// 获取元素,iterator()方法进行迭代
Iterator it = list.iterator();
// 获取元素
while(it.hasNext()){
System.out.println(it.next());
}
}
知识点
next()
返回迭代的下一个元素,如果抛出异常为:NoSuchElementException
,为没有元素可以迭代。
迭代器
在迭代过程中,使用了集合的方法对元素进行操作,导致迭代器不知道集合中的变化,容易产生数据的不确定性,所以不要使用集合的方法进行操作元素,可以使用迭代器的方法进行操作。
迭代器的方法:
// 简书作者:达叔小生
hasNext()
next()
remove()
迭代器
java.util
接口Iterator<E>
知道的接口:ListIterator<E>,XMLEventReader
知道的实现类:BeanContextSupport.BCSIterator,EventReaderDelegate,Scanner。
// 简书作者:达叔小生
public interface Iterator<E>
迭代器的三个方法:
方法 | 说明 |
---|---|
hasNext() | 返回的是boolean 类型,如果集合中还有元素存在,就可以进行迭代,然后返回true ,代表为还有元素存在,反之,返回的是false |
next() | 返回的是E ,返回的是迭代出来的下一个元素 |
remove() | 返回的类型为void ,从迭代器中移除迭代器中的最后一个元素 |
列表迭代器
接口
Iterator<E>
下的子接口有个:
ListIterator<E>
为列表迭代器
// 简书作者:达叔小生
java.util
接口ListIterator<E>
超级接口:Iterator<E>
// 简书作者:达叔小生
public interface ListIterator<E> extends Iterator<E>
// 简书作者:达叔小生
while(it.hasNext()){
Object obj = it.next();
if("a".equals(obj)){
list.add("aaaaa");
}
}
列表迭代器的特性可以在迭代期间进行修改列表,然后获取迭代器在列表中的当前位置。
方法 | 说明 |
---|---|
add(E e) | 方法返回的是void 类型,可以将指定的元素进行插入到列表中 |
hasNext() | 方法返回的是boolean 类型,该方法表示如果next 返回一个元素后,不是抛出异常,则代表有下一个元素,则返回ture ,否则返回false |
hasPrevious() | 返回的是boolean 类型,该方法的作用是如果逆向遍历列表,列表迭代器中有多个元素,则返回为true ,即简单说就是有没有前一个 |
next() | 返回的是E ,该方法表示返回列表中的下一个元素 |
nextIndex() | 返回的是Int 类型,该方法对next的后续调用所返回元素的索引 |
previous() | 返回的是列表中的前一个元素,取出前一个 |
previousIndex() | 返回的类型为int 类型,返回对previous 的后续调用所返回元素的索引 |
remove() | 返回的类型为void ,从列表中移除一个元素 |
set(E e) | 返回的类型为Void ,用指定的元素取替代next 或previous 返回的最后一个元素 |
使用ListIterator
// 简书作者:达叔小生
// 创建List对象
List list = new ArrayList();
// 添加元素
List.add("a");
List.add("b");
List.add("c");
// 列表迭代器
ListIterator it = list.listIterator();
while(it.hasNext()){
Object obj = it.next();
if("a".equals(obj)){
// 添加 it.add("dashucoding");
// 删除 it.set("dashucoding");
}
}
迭代器的
List
接口的子接口ListIterator
,可以实现增删改查
List
接口List<E>
,知道的实现类:
List
是有序的,带索引的,元素可以重复
List
可以增删改查,增加add()
,删除remove()
,修改set()
,查询get()
// 简书作者:达叔小生
实现类:
AbstractList , ArrayList , LinkedList , Vector
AbstractSequentialList , AttributeList , CopyOnWriteArrayList , RoleList , RoleUnresolvedList , Stack
ArrayList
(数组结构,不同步的,为了提高效率),LinkedList
(链接列表结构,就像链子一样,不同步的) ,Vector
(可以实现可增长的对象数组,可变化,同步的)
ArrayList
// 简书作者:达叔小生
ArrayList为数组结构,长度可以改变
java.util
类 ArrayList<E>
java.lang.Object
-> java.util.AbstractCollection<E>
-> java.util.AbstractList<E>
-> java.util.ArrayList<E>
知道的实现接口:
Serializable,Cloneable,Iterable<E>,Collection<E>,List<E>,RandomAccess
知道的子类:
AttributeList, RoleList, RoleUnresolvedList
// 简书作者:达叔小生
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, Serializable
LinkedList 可以用于实现堆栈,队列(栈内存先进后出,队列先进先出)
// 简书作者:达叔小生
java.util
类 LinkedList<E>
java.lang.Object
-> java.util.AbstractCollection<E>
-> java.util.AbstractList<E>
-> java.util.AbstractSequentialList<E>
-> java.util.LinkedList<E>
public class LinkedList<E>
extends AbstractSequentiaList<E>
implements List<E>, Deque<E>, Cloneable, Serializable
知道的接口:
Serializable, Cloneable, Iterable<E>, Collection<E>, Deque<E>, List<E>, Queue<E>
LinkedList
队列
// 简书作者:达叔小生
public class LinkedListDemo{
public static void main(String[] args){
// 创建一个队列对象
Queue queue = new Queue();
// 队列添加元素
queue.add("a");
queue.add("b");
queue.add("c");
while(!queue.isNull){
System.out.println(queue.myGet());
}
}
}
队列
class Queue{
// 封装了一个链表的数据结构
private LinkedList link;
Queue(){
link = new LinkedList();
}
// 功能
public void add(Object obj){
// 内部,使用链表方法
link.addFirst(obj);
}
// 先进先出
public Object myGet(){
return link.removeList();
}
// 判断队列中的元素是否为空
public boolean isNull(){
return link.isEmpty();
}
}
堆栈,手枪弹夹,队列,排队买票
// 去除重复元素
public static void getSingleElement(List list){
// 临时容器
List temp = new ArrayList();
// 原容器
for(Iterator it = list.iterator(); it.hasNext(); ){
// 遍历原对象元素
Object obj = it.next();
if(temp.contains(obj)){
// 判断是否存在
temp.add(obj);
}
}
list.clear();
list.addAll(temp);
}
// 简书作者:达叔小生
public class ArrayListDemo{
public static void main(String[] args){
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
}
}
// 简书作者:达叔小生
public boolean equals(Object obj){
if(this == obj){
return true;
}
if(!(obj instanceof Student)){
throw new ClassCastException();
}
Student stu = (Student) obj;
return this.name.equals(stu.name) && this.age == stu.age;
}
// 简书作者:达叔小生
public boolean contains(Object o){
return indexOf(o) >= 0;
}
// 简书作者:达叔小生
public int indexOf(Object o){
if(o == null){
for(int i = 0; i<size; i++){
if(elementData[i] == null){
return i;
}
}
}else{
for( int i = 0; i<size; i++){
if(o.equals(elementData[i])){
return i;
}
}
}
return -1;
}
// 简书作者:达叔小生
List
-> Vector
-> ArrayList
-> LinkedList
接口集合框架-Set接口
API-set
java.util
接口 Set<E>
参数E:此set所维护元素的类型
超级接口
Collection<E>,Iterable<E>
知道的子接口
NavigableSet<E>,SortedSet<E>
知道实现类
AbstractSet,ConcurrentSkipListSet,CopyOnWriteArraySet,EnumSet,HashSet,
JobStateReasons,LinkedHashSet,TreeSet
HashSet
查询效率很高,它的子类(儿子)LinkedHashSet
,可以迭代顺序的set
接口的哈希表和链接列表的实现。
public class LinkedHashSetDemo{
public static void main(String[] args){
Set set = new LinkedHashSet();
set.add("a");
set.add("b");
set.add("c");
for(Iterator it = set.iterator(); it.hesNext();){
System.out.println(it.next());
}
}
}
public interface Set<E>
extends Collection<E>
Set
为一个不包含重复的集合,
Set
的一些方法:
方法 | 说明 |
---|---|
add(E e) | 返回类型为boolean ,该方法用来添加元素 |
addAll(Collection<? extends g> c) | 返回的是boolean 类型,该方法是用来添加所有元素到set 中的 |
clear() | 返回void 类型,是用来移除set 中的所有元素 |
contains(Object o) | 返回boolean 类型,该方法是指定set 中是否包含该元素,如果有则返回true ,否则就为false |
containsAll(Collection<?> c) | 返回boolean 类型,如果在set 中有包含所有指定的collection 元素,就返回true ,否则返回false |
equals(Object o) | 返回类型为boolean ,用来比较指定对象与此set 的相等性 |
hashCode() | 返回的类型为Int ,返回set 的哈希码值 |
isEmpty() | 返回的是int 类型,返回set 不包含元素,则返回true |
iterator() | 返回的是Iterator<E> 类型,返回在此set 中的元素上进行迭代的迭代器。 |
remove(Object o) | 返回boolean 类型,如果set 中存在指定的元素,就将其移除 |
removeAll(Collection<?> c) | 返回boolean 类型,移除set 中那些包含在指定collection中的元素 |
retainAll(Collection<?> c) | 返回boolean 类型,仅保留set 中那些包含在指定collection中的元素 |
size() | 返回Int 类型,返回set 中的元素数 |
toArray() | 返回一个包含set 中所有元素的数组 |
toArray([] a) | 返回一个包含set 中所有元素的数组,返回数组的运行时类型是指定数组的类型。 |
public class SetDemo{
public static void main(String[] args){
Set set = new HashSet();
set.add("a");
set.add("b");
set.add("c");
// set.add(new Student("a",12));
// set.add(new Student("b",13));
// set.add(new Student("c",14));
for(Iterator it = set.iterator(); it.hasNext(); ){
Object object = (Object) it.next();
System.out.println(it.next();
}
}
}
Set
-> HashSet
-> TreeSet
HashSet<E>
java.lang.Object
-> java.util.AbstractCollection<E>
-> java.util.AbstractSet<E>
-> java.util.HashSet<E>
类HashSet<E>
知道已实现的接口:
Serializable,Cloneable,Iterable<E>,Collection<E>,Set<E>
知道的子类:
JobStateReasons,LinkedHashSet
public class HashSet<E>
extends AbstractSet<E>
implements Set<E>,Cloneable,Serializable
HashSet
该类实现了Set
的接口,数组中存储的是元素,哈希值对应关系,所以叫哈希表或叫散列,查询速度快。有重复元素,用不了哈希表,即不可以包含重复的元素,不保证顺序,方法有hasCode()
和equals()
方法。
方法 | 说明 |
---|---|
hashCode() | 返回的是Ine 类型,返回该对象的哈希值 |
// 简书作者:达叔小生
public int hashCode(){
return 1;
}
public boolean equals(Object obj){
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
if(age != other.age)
return false;
if(name == null){
if(other.name != null)
return false;
}else if(!name.equals(other.name))
return false;
return true;
}
}
TreeSet<E>
,可以进行排序set
集合中的元素,比较结果为0
,视为相同元素不存。
案例
// 简书作者:达叔小生
public class TreeSetDemo{
public static void main(String[] args){
Set set = new TreeSet(new ComparatorLength() );
set.add("a");
set.add("b");
set.add("c");
for(Iterator it = set.iterator();it.hasNext(); ){
System.out.println(it.next());
}
}
}
// 简书作者:达叔小生
public class ComparatorLength implements Comparator{
public int compare(Object o1,Object o2){
// 比较字符串,强转
String s1=(String)o1;
String s2=(String)o2;
int temp = s1.length() - s2.length();
return temp == 0? s1.compareTo(s2) : temp;
}
}
// 简书作者:达叔小生
public class TreeSet<E>
extends AbstractSet<E>
implements NavigableSet<E>,Cloneable,Serialirable
// 简书作者:达叔小生
java.lang
接口 Comparable<T>
参数为可以与对象进行比较
// 定义一个类实现Comparator
public class ComparatorName implements Comparator{
public int compare(Object o1,Object o2){
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int temp = s1.getName().compareTo(s2.getName());
return temp==0? s1.getAge()-s2.getAge() : temp;
}
}
已知的那些子接口:
Delayed,Name,RunnableScheduledFuture<V>,ScheduleFuture<V>
方法:实现comparable
接口,可以排序的功能
方法 | 说明 |
---|---|
compreTo(T o) | 返回类型为Int ,是用来比较对象与指定对象的顺序 |
// 简书作者:达叔小生
public int compareTo(Object o){
if(!(o instanceof Student)){
throw new ClassCastException();
}
Student stu = (Student) o;
if(this.age>stu.age)
return 1;
if(this.age<stu.age)
return -1;
return 0;
}
// 简书作者:达叔小生
public class TreeSetDemo{
public static void main(String[] args){
// Set set = new TreeSet();
TreeSet set = new TreeSet();
set.add("a");
set.add("b");
set.add("c");
for(Iterator it = set.iterator(); it.hasNext(); ){
System.out.println(it.next());
}
}
}
// 源码
public boolean add(E e){
return m.put(e, PRESENT)==null;
}
构造方法:
方法 | 说明 |
---|---|
TreeSet() | 无参构造方法,该set 根据其元素的自然顺序进行排序 |
TreeSet(Collection<? extend E> e) | 构造一个包含指定collection 元素的新TreeSet,它按照其元素的自然顺序进行排序 |
TreeSet(Comparator<? super E> comparator) | 构造一个新的空TreeSet ,它根据指定比较器进行顺序 |
TreeSet(SortedSet s) | 构造一个与指定有序set 具有相同映射关系和相同排序的新TreeSet |
二叉树结构
二叉树结构把小的放在左边,大的放在右边。
for each 循环
// 简书作者:达叔小生
public class ForeachDemo{
public static void main(String[] args){
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
for(Object str : list){
System.out.println(obj);
}
}
}
枚举,一枚一枚的举出了来
方法 | 说明 |
---|---|
hasMoreElements() | 返回的是booleam 类型,测试枚举是否包含更多的元素 |
nextElement() | 如果该枚举对象至少还有一个可提供的元素,就返回此枚举,取出下一个元素 |
// 简书作者:达叔小生
public class EnumerationDemo{
public static void main(String[] args)}
Vector v = new Vector();
v.addElement("a");
v.addElement("b");
v.addElement("c");
for(Enumeration e = v.elements(); e.hasMoreElements();){
System.out.println(e.nextElement());
}
// 不考虑,先考虑Iterator
for(Object obj : v){
System.out.println(obj);
}
}
}
集合:
List -> ArrayList
(数组,查询快),LinkedList
(链表,增删快)
Set -> HashSet
(哈希表,查询快,表对应唯一)
TreeSet
(二叉树,就知道排序的,有规则)
往后余生,唯独有你
简书作者:达叔小生
90后帅气小伙,良好的开发习惯;独立思考的能力;主动并且善于沟通
简书博客: https://www.jianshu.com/u/c785ece603d1
结语
- 下面我将继续对 其他知识 深入讲解 ,有兴趣可以继续关注
- 小礼物走一走 or 点赞
第49节:Java集合框架中底层文档的List与Set的更多相关文章
- Java集合框架中底层文档的List与Set
Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...
- Java集合框架中的快速失败(fail—fast)机制
fail-fast机制,即快速失败机制,是java集合框架中的一种错误检测机制.多线程下用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除),则会抛出Concurre ...
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
- Java集合框架中List接口的简单使用
Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...
- Java集合框架中的元素
之前有一篇笔记,讲的是集合和泛型,这几天看Java集合中几个接口的文档,思绪非常混乱,直到看到Oracle的“The Collections Framwork”的页面,条理才清晰些,现在进行整理. 一 ...
- Java中的函数式编程(五)Java集合框架中的高阶函数
写在前面 随着Java 8引入了函数式接口和lambda表达式,Java 8中的集合框架(Java Collections Framework, JCF)也增加相应的接口以适应函数式编程. 本文的 ...
- java集合框架中contains(),containsKey()和containsValue()的用法:
List集合的contains()方法用于判断集合中包不包含某个元素,返回值是boolean. Map集合的containsKey()和containsValue()方法和上面的相同. 示例: pub ...
- java集合框架中Set和List的区别
1. Set 接口实例存储的是无序的,不重复的数据.List 接口实例存储的是有序的,可以重复的元素. 2. Set检索效率低下,删除和插入效率高,插入和删除不会引起元素位置改变 <实现类有Ha ...
- java集合框架中的去重问题
对于自定义的类来说,必须要重写hashcode和equals方法 hashcode方法的作用是确定元素在数据结构中的位置,当两个元素的hash值一样时,需要用equals方法判断两个元素是否是一样的, ...
随机推荐
- JavaScript获取扫码枪相关资料
https://blog.csdn.net/jiongxian1/article/details/78906124 https://blog.csdn.net/jifengdalu/article/d ...
- C语言编写程序计算圆上的点的坐标
Problem Description There is a cycle with its center on the origin. Now give you a point on the cycl ...
- HYSBZ 2743 (树状数组) 采花
题目:这里 题意: 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记, ...
- Centos 安装 android sdk(转)
原文地址: https://blog.csdn.net/kai_1215/article/details/80731099 这个后面有个指令没有运行起来,我做了一些修改: 原文:sdkmanager ...
- GUI学习之二——PyQt控件初识
一.控件概念 控件是一个程序界面上的各个独立的元素, 它具备用户点击.接收用户输入.展示不同内容.存放其他控件等功能. 二.控件分类 常用的控件按功能可以分为以下几种类 按钮 QPushButton— ...
- delphi中 panel如何在Form实现鼠标移动拖放
Panel的MouseDown事件 移动就写上ReleaseCapture;SendMessage(Panel1.Handle,wm_SysCommand,$F012,0); 改变大小就写上Relea ...
- Spring+MVC Controller层接收App端请求的中文参数乱码问题。
在正文之前,说明下Filter的作用: 过滤器顾名思义就是进行过滤的,可以实现代码的定向执行和预处理.通俗点说法filter相当于加油站,request是条路,response是条路,目的地是serv ...
- JavaSE编程题
Test1–取出一个字符串中字母出现的次数.如:字符串:”abcdekka27qoq”,输出格式为:a(2)b(1)k(2)… Test2–假如我们在开发一个系统时需要对员工进行建模,[员工]包含3个 ...
- idea运行固定多个模块项目
第一步:配置workspace.xml 在.idea文件夹下,搜索RunDashboard位置 <component name="RunDashboard"> < ...
- 阿里云远程连接CentOS
1.购买一个CentOS的ECS服务器: 2.修改安全组,开放SSH/22的端口号: 这里是22/22为SSH连接的端口号:3389为远程桌面的默认端口号 3.利用xshell或者SecureCRT连 ...