集合概述:
集合和数组都可以保存多个对象,但是数组的长度不可变,集合可以保存数量变化的数据。java中的集合类主要由两个接口派生出,Collection和Map
Collection接口和Iterator接口:
概述:Collection接口是List,Set和Queue接口的父接口
Collection中的主要方法如下:
方法名称 | 方法概述 |
boolean add(Object o) | 该方法向集合中添加一个元素,成功返回true |
boolean addAll(Collection c) | 该方法将集合C中的元素添加到指定集合中,成功返回true |
void clear() | 清除集合中的元素 |
boolean contains(Object o) | 返回集合里是否包含指定元素 |
boolean containAll(Collection c) | 返回集合中是否包含集合c里的所有元素 |
boolean isEmpty() | 返回集合是否为空 |
Iterator iterator() | 返回一个Iterator对象,用于遍历集合里的元素 |
boolean remove(Object o) | 删除集合中的指定元素 |
boolean removeAll(Coolection c) | 从指定集合中删除所包含的c集合中的全部元素 |
boolean retailAll(Coolection c) | 从集合中删除集合中不包含的元素 |
int size() | 返回集合中元素的个数 |
Object[] toArray() | 该方法把集合转化成一个数组 |
package cn.itcast.collection; import java.util.ArrayList; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import org.junit.jupiter.api.Test; public class CollectionTest { @Test public void testCollection(){ Collection c=new ArrayList(); c.add("孙悟空"); c.add(6); System.out.println("c集合的元素个数为"+c.size()); c.remove(6); System.out.println("c集合的元素个数为"+c.size()); System.out.println("c集合中是否包含孙悟空"+c.contains("孙悟空")); c.add("javaee实战"); System.out.println("c集合中的元素"+c); Collection books=new HashSet(); books.add("疯狂java讲义"); books.add("javaee实战"); System.out.println("c集合是否完全包含books集合"+c.containsAll(books)); c.removeAll(books); System.out.println("c集合中的元素"+c); c.clear(); System.out.println("c集合中的元素"+c); books.retainAll(c); System.out.println("books集合中的元素:"+books); } @Test public void IteratorTest() { Collection<String> c=new ArrayList<String>(); c.add("java编程思想"); c.add("疯狂java讲义"); c.add("数据结构与算法"); Iterator it=c.iterator(); while(it.hasNext()) { String book=(String) it.next(); System.out.println(book); if(book.equals("疯狂java讲义")) { it.remove(); } book="测试字符串"; } System.out.println(c); } }
上述代码主要展示了Collection的常用方法
testCollection方法的执行结果为:
c集合的元素个数为2 c集合的元素个数为1 c集合中是否包含孙悟空true c集合中的元素[孙悟空, javaee实战] c集合是否完全包含books集合false c集合中的元素[孙悟空] c集合中的元素[] books集合中的元素:[]
IteratorTest方法的执行结果为:
java编程思想 疯狂java讲义 数据结构与算法 [java编程思想, 数据结构与算法]
Set集合:
概述:Set集合类似于一个罐子,程序可以依次把多个对象装进这个罐子里面,Set集合通常不能记住元素的添加顺序。Set集合与Collection集合基本相同。
Set三个常用实现类:
HashSet:
概述:
HashSet是Set接口的典型实现,大多数时候使用Set集合时就是使用这个实现类。 HashSet按Hash算法来存储集合中的元素,因此具有很好的存取和查找性能。
特点:
1、不能保证元素的排列顺序,顺序可能与添加顺序不同,顺序也有可能发生变化
2、HashSet不是同步的,如果多个线程同时访问一个 HashSet,假设有两个或者两个以上线程同时修改了 HashSet集合时,则必须通过代码来保证其同步。
3、集合元素值可以是null
存储数据原理:
HashSet按Hash算法来存储集合中的元素,HashSet的内部存储结构是数组加链表。
HashSet存储元素时首先会根据Hash算法计算出元素在内存中的位置,然后将数据存放在相应的位置。如果该位置已经存放有元素,那么接着调用equals方法判断这两个元素是否相等,如果相等则是同一个元素,不需要存储,如果不相等,说明是不同的元素,此时HashSet会在该位置上产生一个链表来存储这两个元素,此时HashSet的查找性能会降低。
注意点:
在程序中如果重写某个类的hashCode()方法,则同时也应该修改其equals方法。
hashCode方法的重写规则:
1、在程序运行过程中,同一个对象多次调用 hashCode()方法应该返回相同的值。
2、当两个对象通过 equals方法比较返回tue时,这两个对象的 hashCode()方法应返回相等的值
3、对象中用作 equals方法比较标准的实例变量,都应该用于计算 hashCode值。
LinkedHashSet:
概述:
LinkedHashSet是HashSet的子类,它的功能和HashSet类似,LinkedHashSet也是根据元素的hashCode值来存储,但它同时使用链表维护元素的数据,这样使得元素看起来是以插入的顺序保存的。LinkedHashSet需要使用链表维护数据,因此性能方面要比HashSet低一点。