Collection接口的所有子类(直接子类和间接子类)都必须实现2种构造函数:不带参数的构造函数 和 参数为Collection的构造函数。 int size() abstract <T> T[] toArray(T[] array) abstract Object[] toArray() 2. Set是没有重复元素的集合。 集合可以通过Iterator去遍历集合中的元素。Iterator提供的API接口,包括:是否存在下一个元素、获取下一个元素、删除当前元素。 即,当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast
话接上回,继续Java集合框架的学习,这次主要介绍Map接口。 (it.hasNext()){ //遍历集合 //两种类型(1统一Object类,不用强转.2强转:String key=(String) it.next(); :"+name); } } 运行结果 name集合:{1=zhangsan, 2=lishi, 3=wangwu, 4=zhaoliu} 添加name1集合中所有键值对后的name集合:{1=zhangsan , 2=lishi, 3=wangwu, 4=zhaoliu, 5=xiaoming, 6=wangba} name集合的大小:6 获取name集合中键为4对应的值:zhaoliu 删除name集合中键为 4对应键值对后的name集合:{1=zhangsan, 2=lishi, 3=wangwu, 5=xiaoming, 6=wangba} 清空name集合:{} 三、TreeMap(了解) 1、概述
用途与特点 可用于在需要存储有序的,可动态扩充集合大小的情况使用。可以看做是一个动态的数组。虽然该集合理论上是可以动态无限扩充,但也有最大长度限制。 默认初始数组长度是10,最大集合长度是Integer.MAX_VALUE大概21亿多 添加 ? 删除 ? 在删除数据时只会对数组进行移到操作,并不会修改调整数组的长度,所以对于内存方面如创建一个长度是100的数据集合,删除了90个数据,集合数组长度也不会缩小。 work return oldValue; } 扩容机制 扩容时机:是在加入数据时,elementData已满时进行扩容 扩充的新数组长度是: 原数组长度 + (原数组长度 / 2)
1.2 ArrayDeque源码(基于JDK1.7.0_45) 值得一提的是,Java中有一个类叫做Stack,该类实现了栈结构。 但是,Java已经不提倡Stack来实现栈结构,而是建议使用ArrayDeque类; 来自Stack类描述: A more complete and consistent set of LIFO stack tail; //最小初始化容量值: private static final int MIN_INITIAL_CAPACITY = 8; //扩大数组的长度:扩大为原有长度的2倍 ArrayDeque中,底层主要利用addFirst/removeFirst实现元素的出栈和入栈操作; 1.3 LinkedList源码(基于JDK1.7.0_45) LinkedList即有List集合方法 ,又有Deque集合方法。
extend Collection 四、Collection和Map的辨析 五、Collection和Collections的辨析 六、总结 一、Collection接口简介 collection在java 之所以需要这样一个接口,是因为java作为面向对象,总是避免不了处理多个对象的情况,要处理多个对象,首先需要容器存储,这个容器就是集合。 其实,这也算是哲学问题,java的类的设计是经过很长时间的考验以及调整形成的,平衡修改以及耦合等各方面的原因,结构更加清晰,维护成本更低,逻辑性更强。 例如下面的例子,输出的顺序就不一定是1,2,3...,可能是乱序的,这是因为任务会被分成多个小任务,任务执行是没有特定的顺序的。 [4,1,2,3],public static void rotate(List<?
1 HashMap概要 HashMap继承关系如下: java.lang.Object ↳ java.util.AbstractMap<K, V> ↳ java.util.HashMap 2 构造函数 // 默认构造函数。 static final int DEFAULT_INITIAL_CAPACITY = 16; // 最大容量(必须是2的幂且小于2的30次方,传入容量过大将被这个值替换) static ks : (keySet = new KeySet())); } // Key对应的集合 // KeySet继承于AbstractSet,说明该集合中没有重复的Key。 es : (entrySet = new EntrySet()); } // EntrySet对应的集合 // EntrySet继承于AbstractSet,说明该集合中没有重复的
泛型好处 泛型集合 参数化的类型、类型安全的集合,强制集合元素的类型必须一致。 这样是没问题的,但是有时候 需要知道是什么类型进行强转的话就会报错了。 - ArrayList<String > arraylist = new ArrayList <String>() ; 只需要这么改就可以了,这个时候集合里面只能是string。
当向后遍历完元素,游标就会在元素 N 的后面: 也就是说长度为 N 的集合会有 N+1 个游标的位置。 游标前没有元素就报 java.util.NoSuchElementException 的错,所以使用前最好判断一下; int nextIndex() 返回游标后边元素的索引位置,初始为 0 ;遍历 N 个元素结束时为 N; int previousIndex() 返回游标前面元素的位置,初始时为 -1,同时报 java.util.NoSuchElementException 错; void 注意,当没有迭代,也就是没有调用 next() 或者 previous() 直接调用 set 时会报 java.lang.IllegalStateException 错; void remove()
0x00 概述 本文涉及Java知识点有Set集合,HashSet,LinkedHashSet,TreeSet,比较器Comparator,泛型,可变参数。 由于是Set集合,所以是不包含重复元素的集合 HashSet集合的基本使用 package HashSetDemo; import java.util.HashSet; public class HashSetDemo1 1.6 HashSet集合存储学生对象并遍历 需求:创建一个存储学生对象的集合,存储多个学生对象,使用程序实现在控制台遍历该集合 示例: package HashSetDemo2; import ,没有修改方法 示例 package ArgsDemo2; import java.util.Arrays; import java.util.List; import java.util.Set; list2.remove("world"); // java.lang.UnsupportedOperationException list2.set(1,"javaee
Java 集合框架 早在 Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。 集合框架被设计成要满足以下几个目标。 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。 对一个集合的扩展和适应必须是简单的。 为此,整个集合框架就围绕一组标准接口而设计。 你可以直接使用这些接口的标准实现,诸如: LinkedList, HashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。 从上
Collection 接口是 Java 集合类的一个根接口,Java 在 Collection 接口中定义了许多通用的数据操作类方法以及判断类方法。 > c); 仅仅保存集合c中的元素 Iterator<E> iterator(); 判断类方法 boolean contains(Object o); boolean containsAll(Collection 查看 Java 源码我们可以看到 Collection 接口还继承了 Iterable<E> 接口: public interface Collection<E> extends Iterable<E> @return an Iterator. */ Iterator<T> iterator(); } 也就是说如果一个对象实现了这个接口,那么这个对象就可以用 foreach 循环读取集合元素 boolean hasNext(); E next(); void remove(); } Iterator<T> 接口定义了进行 foreach 遍历时的接口,接口逻辑需要在具体的集合类中实现
一、集合的由来 通常,我们的Java程序需要根据程序运行时才知道创建了多少个对象。但若非程序运行,程序开发阶段,我们根本不知道到底需要多少个数量的对象,甚至不知道它的准确类型。 集合便应运而生了。 二、集合是什么? Java集合类存放在java.util包中,是一个用来存放对象的容器。 注意: 1.集合只能存放对象。 比如你存入一个int型数据66放入集合中,其实它是自动转换成Integer类后存入的,Java中每一种基本数据类型都有对应的引用类型。 2.集合存放的都是对象的引用,而非对象本身。 三、Java集合框架 首先,我们来看一张图 发现一个特点,上述所有的集合类,除了map系列的集合,即左边的集合都实现了Iterator接口。 从图中我们可以看到: 1.集合主要分为Collection和Map两个接口。 2.Collection又分别被List和Set继承。
2. 具体的集合 ? 集合框架中的类 从上图中可以看出,除了Map结尾的类都实现了collection接口 从下图中可以看出java库具体的集合 ? java集合 2.1 链表 我们知道数组和ArrayList有一个重大缺陷。 每个结点存放着下个结点的引用 集合类库中提供了子接口ListIterator,其中包含add方法: interface ListIterator <E> extends Interator<E> { ; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; public class void addAll(int i, Col1ection elements) //将某个集合中的所有元素添加到给定位置。
= null && k1.equals(k2))) { Object v1 = getValue(); Object v2 = e.getValue(); if (v1 == v2 || (v1 ! entrySet()的作用是返回“HashMap中所有Entry的集合”,它是一个集合。 ; import java.util.Random; import java.util.Iterator; import java.util.HashMap; import java.util.HashSet ; import java.util.Random; import java.util.Iterator; import java.util.HashMap; import java.util.HashSet
更确切地讲,Set不包含满足e1.equals(e2)的元素对 e1和e2,并且最多包含一个null元素。 但是TreeSet集合的存储是有序的,即:存储到集合中的元素是按自然顺序存储的。 判断元素唯一性的方式: 根据比较方法的返回值来判断。是0(零)就存入集合,不是0就不存。 Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。 obj1.compareTo(obj2)方法如果返回0,则说明被比较的两个对象相等,如果返回一个正数,则表明obj1大于obj2,如果是 负数,则表明obj1小于obj2。 2.使用方式 (1)自然顺序(Comparable) TreeSet类的add()方法会把存入的对象提升为Comparable类型 调用对象的comparaTo()方法和集合中的对象比较 根据comparaTo
与Java中的数组相比,它的容量能动态增长。 // 若ArrayList的容量不足以容纳当前的全部元素,设置 新的容量=“(原始容量x3)/2 + 1” public void ensureCapacity(int minCapacity) for (int i = 0; i < size; i++) elementData[i] = null; size = 0; } // 将集合 = 0; } // 从index位置开始,将集合c添加到ArrayList public boolean addAll(int index, Collection<? (02) 当ArrayList容量不足以容纳全部元素时,ArrayList会重新设置容量:新的容量=“(原始容量x3)/2 + 1”。
List集合 List集合类中元素有序、且可重复,集合中的每个元素都有其对应的顺序索引。 List容器中的元素都对应一个整数型的序号记载其在容器中的位置,可以根据序号存取容器中的元素。 List集合里添加了一些根据索引来操作集合元素的方法 一、ArrayList ArrayList是List接口的典型实现类,本质上,ArrayList是对象引用的一个变长数组。 java.util.vector提供了向量类(Vector)以实现类似动态数组的功能。 java.util包中的其他类中也都有这类方法,以便于用户获取对应的枚举类型。 在Enumeration中封装了有关枚举数据集合的方法。 2、 效率问题,Vector效率低,ArrayList效率高。 3、 增长数量,Vector以1.5倍增长,ArrayList以2倍增长。
注意:Map中的集合不能包含重复的键,值可以重复。每个键只能对应一个值。 Map集合是键值对形式存储值的,所以遍历Map集合无非就是获取键和值,根据实际需求,进行获取键和值。 Set<Map, Entry<K, V>> entrySet(); //即将Map集合转化为Set集合。 } 三、具体实现 接口java.util.Map,包括3个实现类:HashMap、Hashtable、TreeMap。 (即先找到丈夫,再去找妻子) keySet的演示图解 (二)entrySet 先获取map中的键值关系封装成一个个的entry对象, 存储到一个Set集合中,再迭代这个Set集合, 根据entry获取对应的 可以对Map集合中的键进行排序。 五、HashMap
Java 集合框架01-----Java集合总览 大家好,我是架构君,一个会写代码吟诗的架构师。 今天说一说Java 集合框架01-----Java集合总览,希望能够帮助大家进步!!! 今天开始阅读Java集合源码了。 Collection 主要有List,Set和Queue三个分支,Collection定义了集合的基本操作,如集合的查找,修改,合并 - List是一个有序队列,允许重复元素,其实现类ArrayList 其实现类有HashSet和TreeSet,HashSet的实现依赖于HashMap,TreeSet的实现依赖于TreeMap 2. Arrays和Collection是操作数组和集合的工具类。
1.创建集合,并使用forEach和迭代器分别遍历 public class CollectionDemo { /* * 1.创建集合对象 * 2.创建添加集合元素 (15); array.add("java"); //遍历集合forEach遍历 for (Object object : array 集合添加集合,集合元素个数,集合化为Object数组(可以添加自定义对象) public static void main(String[] args) { //1.创建集合对象 array.add(""); array.add(15); array.add("java"); array2 .add("wo"); array2.add("shi"); array.addAll(array2); //遍历集合forEach遍历