java之集合那些事

集合概述:

集合和数组都可以保存多个对象,但是数组的长度不可变,集合可以保存数量变化的数据。java中的集合类主要由两个接口派生出,Collection和Map

Collection接口和Iterator接口:

概述:Collection接口是List,Set和Queue接口的父接口

Collection中的主要方法如下:

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低一点。

 

猜你喜欢

转载自www.cnblogs.com/wgblog-code/p/11435476.html