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 点赞
Java集合框架中底层文档的List与Set的更多相关文章
- 第49节:Java集合框架中底层文档的List与Set
Java集合框架中的List与Set // 简书作者:达叔小生 Collection -> Set 无序不重复 -> 无序HashSet,需要排序TreeSet -> List 有序 ...
- Java集合框架中的快速失败(fail—fast)机制
fail-fast机制,即快速失败机制,是java集合框架中的一种错误检测机制.多线程下用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加.删除),则会抛出Concurre ...
- Java集合框架中List接口的简单使用
Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...
- Java集合框架中的元素
之前有一篇笔记,讲的是集合和泛型,这几天看Java集合中几个接口的文档,思绪非常混乱,直到看到Oracle的“The Collections Framwork”的页面,条理才清晰些,现在进行整理. 一 ...
- Java集合框架中Map接口的使用
在我们常用的Java集合框架接口中,除了前面说过的Collection接口以及他的根接口List接口和Set接口的使用,Map接口也是一个经常使用的接口,和Collection接口不同,Map接口并不 ...
- 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方法判断两个元素是否是一样的, ...
随机推荐
- Springboot导出Excel并下载
引入相关依赖 <!--数据导出excel--> <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> & ...
- zabbix-自定义告警(二)
实现自定义监控 文章引用:https://www.cnblogs.com/clsn/p/7885990.html#auto_id_28 一.实现自定义监控 说明zabbix自带模板Template O ...
- 2 - sat 模板(自用)
2-sat一个变量两种状态符合条件的状态建边找强连通,两两成立1 - n 为第一状态(n + 1) - (n + n) 为第二状态 例题模板 链接一 POJ 3207 Ikki's Story IV ...
- Linux更改ext4根目录文件系统大小
首先通过lsblk 查看一下文件系统情况 然后通过fdisk /dev/sda类似命令,打开对应的磁盘管理,然后: 删除所有磁盘分区 重新建立一个更大的分区. 保存退出 再次通过lsblk查看分区大小 ...
- JavaScript设计模式(单例模式)
单例模式是一种简单但非常实用的模式,特别是惰性单例技术,在合适的时候才创建对象,并且只创建唯一的一个.下面我们来逐步了解单例模式的用法. 一.简版单例模式: var Singleton = funct ...
- 【原创】大叔问题定位分享(35)spring中session失效时间
spring项目中将sessionid对应的cookie过期时间设置很长,但是实际session还是在半个小时后失效,跟了一下代码,spring中session实现接口为 org.springfram ...
- JS-逻辑运算符的与,或,非
JS-逻辑运算符的与,或,非 1.非 所谓非,就是取反,非真即假,非假即真. 非运算符不仅仅只能用于布尔值,其他数据类型也是可以的,如下: 1.如果操作数是一个对象,返回false 2.如果操作数是一 ...
- 简单聊聊服务发现(redis, zk,etcd, consul)(转载)
服务发现并没有怎样的高深莫测,它的原理再简单不过.只是市面上太多文章将服务发现的难度妖魔化,读者被绕的云里雾里,顿觉自己智商低下不敢高攀. 服务提供者是什么,简单点说就是一个HTTP服务器,提供了AP ...
- mysql 关于字符串搜索的函数
与like作用相似 FIND_IN_SET LOCATE POSITION
- IO[File_API学习]
IO流[File_API学习的使用] File_API学习的使用1.名称分隔符 / \ separatorjava下路径:\ 在Windows下的路径,在java里 \ 是转义字符.需要 \\Str ...