`

黑马程序员----集合

阅读更多
集合

---------------------- android培训java培训、期待与您交流! ----------------------


1.集合是什么
集合是容器, 长度可变, 可以保存任意类型对象.
通常我们需要一个长度可变的容器时就可以使用集合.
2.集合分类
Collection: 单列集合
List: 有存储顺序, 可重复
ArrayList: 数组实现, 查找快, 增删慢
LinkedList: 链表实现, 增删快, 查找慢
Vector: 同ArrayList, 但线程安全, 效率低, 已被淘汰
Set: 无存储顺序, 不可重复
Map: 键值对
3.集合迭代
List集合迭代有4种方式:
普通for循环, Iterator迭代器, 增强for循环, Vector特有的Enumeration
4.在迭代List的时候删除元素
使用普通for循环时, 删除数据需要将循环变量-1
使用迭代器时, 必须使用迭代器的remove()方法, 否则会抛出ConcurrentModificationException
使用增强for循环时, 不能修改集合, 否则会抛出ConcurrentModificationException

JDK5新特性
* 1.增强for循环
for(元素类型 变量 : 容器){ 循环体 }
* 2.泛型
在集合类型后面加上<类型>就是指定集合中只能存储该类型的对象, 如果存储其他类型时编译报错
在获取元素的之后返回值就是该类型, 省去了强转的麻烦
3.可变参数
类型... 数组名
可以接收同一类型的数据, 0个, 1个, 多个或整个数组
可变参数必须是参数列表的最后一个形参


Set
* 1.HashSet
使用哈希算法去重复, 速度快
在存储对象的时候, 先使用对象的hashCode()方法计算一个哈希值, 然后在集合中查找是否有哈希值相同的对象
如果没有哈希值相同的对象, 直接存入. 如果有哈希值相同的对象, 和哈希值相同的对象逐个equals()比较
如果equals()比较结果为false就存入, 结果为true则不存.
如果想将一个对象存入HashSet去重复, 就要重写hashCode()和equals()
我们在象HashSet中存储对象的时候,如果想要去重复, 就要重写hashCode()和equals().
在Person中重写
public int hashCode()
		{
			final int num = 31;
			int result = 1;
			result = num * result + age;
			result = num *result +((name == null)? 0 :name.hashCode());
			return result;
		}


* 2.TreeSet
使用二叉树算法进行排序, 可自定义顺序(小的值就放在左边,大的放在右边,取得时候遵循 左 中 右 )
需要指定比较算法:
自然顺序:在Person中实现Comparable接口, 重写compareTo方法, 在该方法中定义比较算法
对应代码:

public int compareTo(Person o) {
		
		int nameTest = this.name.compareTo(o.name);
		
		return nameTest != 0 ? nameTest : this.age - o.age;
	}
比较器顺序: 可以在TreeSet的构造函数中传入一个Compartor, TreeSet就会调用Compartor的compare方法比较
对应代码:
TreeMap<Person, Integer> tm = new TreeMap<Person,Integer>(new Comparator<Person>(){

			@Override
			public int compare(Person o1, Person o2) {
				int nameTest = o1.getName().compareTo(o2.getName());
				
				return nameTest != 0 ? nameTest : o1.getAge() - o2.getAge();
			}});
	
3.LinkedHahSet
HashSet的子类, 原理和HashSet相同, 但保留存储顺序
* 4.迭代Set集合
通过iterator()方法得到Iterator, 调用其hasNext()判断是否有下一个元素, 调用next()获取下一个元素
通过增强for循环进行迭代 for(类型 变量 : 容器){循环体}
5.Collection总结:
如果要保存多个元素, 那么就用List. 如果增加和删除比查询要多就用LinkedList, 如果查询较多就用ArrayList
如果要对多个对象去重复就使用HashSet, 因为速度最快
如果要对多个对象去重复而且保留原有顺序, 就用LinkedHashSet
如果要对多个对象按照指定顺序排序, 就用TreeSet
三.Map
1.什么是Map
Map是一种保存键值对的容器, 键唯一, 可以根据键来查找值.
* 2.HashMap
使用哈希算法对Key对象去重复, 和HashSet原理相同
当存入一个键值对的时候, 先对Key对象调用hashCode方法获取一个哈希值, 在集合中查找是否有哈希值相同的对象
如果没有相同的, 直接将键值对存入. 如果有哈希值相同, 则和哈希值相同的Key对象进行equals比较
比较结果为false就直接存入, 如果比较结果为true, 那么用新的Value替换旧的Value
3.LinkedHashMap
HashMap的子类, 原理和HashMap相同, 可以保留存储顺序
4.Hashtable
和HashMap原理相同, 线程安全, 效率低, 已被淘汰
* 5.TreeMap
使用二叉树算法对Key对象进行排序, 和TreeSet原理相同
有两种指定排序算法的方式:
默认使用自然顺序: 使用Key对象的compareTo方法来比较
传入比较器顺序: 在TreeMap的构造函数中传入Comparator之后, 就会使用Comparator的compare方法
* 6.迭代Map集合
a.keySet():
先调用Map的keySet()获得所有Key对象组成的Set
然后遍历这个Set得到每一个Key
再用Key对象从Map中获取Value
对应代码:
Set<Person> s = tm.keySet();
		for (Person p : s) {
			System.out.println(p+"===="+tm.get(p));
		}
		b.entrySet():
先调用Map的entrySet()方法获得所有Entry组成的Set
循环遍历这个Set得到每一个Entry
再获取每个Entry的Key和Value
对应代码:
Set<Entry<Person,Integer>> s = tm.entrySet();
		for (Entry<Person, Integer> ent : s) {
			System.out.println(ent.getKey()+" :"+ent.getValue());
		}


*在EntrySet()中有以下的几个方法:
Equals(),getKey(),getValue,hashcode(),setValue()

---------------------- android培训java培训、期待与您交流! ---------------------- 详细请查看:http://edu.csdn.net/heima
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics