1.集合框架

1.1数组
数组在存储数据方面的特点:
1.一旦初始化,其长度就确定了。
2.存储连续的数据。
3.声明的类型,就决定了只能操作此类型的元素。
数组在存储数据方面的弊端:
1.一旦初始化,其长度就不可变。
2.数组中涉及到数据的增删改查的现成的方法较少,不及集合。
3.不能存放无序的、要求不可重复的数据。
1.2集合:
Collection和Map两种体系。
Collection接口:存储一个一个的数据。
|---------Set接口:元素无序、不可重复的集合。—>高中的"集合"(特性:确定性、互异性、无序性)
|---------实现类:HashSet、LinkedHashSet、TreeSet
|---------List接口:元素有序,可重复的集合。—>解决数组弊端的结构,"动态"数组。
|---------实现类:ArrayList、LinkedList、Vector
Map接口:存储一对一对的数据(key-value对)(双列数据)—>y = f(x)
|---------实现类:HashMap、LinkedHashMap、TreeMap、Hashtable
1.3学习层次:
能够灵活运用java提供的集合中的具体实现类,实现内存中数据的统一管理。
关注不同集合类底层的存储结构—>数据结构。
1.4集合存储的优点:
使用集合可以不用考虑长度的问题,直接添加即可。
集合中提供了丰富的方法,便于数据的操作(CRUD)。
操作的数据特点更丰富。可以存储无序的、不可重复的;有序的、可重复的;键值对等。

2.Collection接口中的常用方法:

1.add(Object obj):添加。(向Collection中添加元素,要求元素所在的类要重写equals()方法。)
2.size():获取集合中存储数据的个数。
3.addAll(Collection coll):将形参coll中的所有元素添加到当前集合中。
4.isEmpty():判断集合是否有元素。
5.clear():清空。
6.contains(Object obj):判断集合中是否包含obj元素。判断的标准:调用obj元素所在类的equals();
7.containsAll(Collection coll):判断当前集合中是否包含coll集合中的所有元素。
8.remove(Object obj):删除元素obj,仍然需要调用obj中的equals()方法。
9.removeAll(Collection coll):差集,删除当前集合与coll集合共有的元素。
10.retainAll(Collection coll):交集,返回当前集合和coll集合共有的元素。
11.equals(Object obj):判断当前集合和对象obj是否相等。
12.hashCode():获取哈希值。
13.toArray():返回Object类型数组。集合—>数组。
14.List list = Arrays.asList(Array[] arr); :数组—>集合(List)。
15.Iterator:迭代器接口,作用:用来遍历Collection集合元素。
Collection coll = new Collection();
Iterator iterator = coll.iterator();
itrator.hasNext();//判断集合中是否还有下一个元素。
iterator.next();//指针下移;将下移以后集合位置上的元素返回。

3.List接口的简单说明:

作用:使用List的实现类去替换原有项目、练习的数组。
3.1 List中常用的方法。
1.Object get(int index):获取指定index位置的元素。
2.void add(int index,Object ele):在index位置插入ele元素。
3.boolean addAll(int index,Collection eles):从index位置开始讲eles中所有元素添加到集合中。
4.int indexOf(Object obj):返回obj在集合中首次出现的位置。
5.int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置,不存在,返回-1。
6.Object remove(int index):移除指定index位置的元素;并返回此元素。
6.Object remove(Object obj):移除指定对象;并返回此元素。
7.Object set(int index,Object ele):将index位置的元素改成ele,并返回。
8.List sublist(int fromIndex,int toIndex):返回从fromIndex到toIndex位置的左闭右开的子集合。
3.2 三个实现类的特点。
ArrayList:List接口的主要实现类,线程不安全,效率高。底层使用数组存储。
可以使用Collections工具类的synchonized List(ArrayList list)将ArrayList转化成线程安全。
LinkedList:对于频繁的插入和删除操作,建议使用此类。底层是用链表存储的。
Vector:List接口的古老实现类,线程安全,效率低。底层使用数组存储。

4.ArrayList/LinkedList 的源码。

5.Set接口:元素无序、不可重复的集合。

Set接口的三个实现类:
5.1 HashSet,Set的主要实现类;底层使用数组+链表实现。
5.2 LinkedHashSet,是HashSet的子类,底层使用数组+链表;在数据添加的同时,记录数据添加的顺序(使用双向链表),进而在遍历集合时,可以实现按照添加的顺序遍历。
5.3 TreeSet,可以实现添加的数据的某一个属性排序,并按照此排序遍历。使用红黑树存储。
按照从小到大的顺序输出。
必须向TreeSet中添加同一个类型的对象。
默认情况下,包装类、String都可以添加到TreeSet中,而且默认按照从小到大的顺序存储。
TreeSet的排序方式有两种:自然排序,定制排序。
5.3.1自然排序:要求添加的元素所在的类要实现Comparable接口。重写接口中的compareTo(),指明按照那个属性实现排序。将多个元素添加到TreeSet中即可。在TreeSet中判断两个元素是否相等的标准,不再是使用hashCode()和equals(),而是重写接口中的方法,如果返回0,则认为两个元素相等。向TreeSet中添加的元素所在的类,可以不用重写hashCode()和equals()。
5.3.2定制排序:
1.提供事项Comparator接口的匿名实现类的对象。
2.重写Comparator接口中的compare()
3.将此接口实现类的对象作为参数传递到TreeSet的构造器中。
4.将compare()中涉及的类的对象添加到TreeSet中。

//提供事项Comparator接口的匿名实现类的对象。
	Comparator com = new Comparator(){
		//按照年龄从小到大,按照姓名从大到小。
		@Override
		public int compare(Object o1,Object o2){
			if(o1 instanceof User && o2 instanceof User){
				User u1 = (User)o1;
				User u2 = (User)o2;
				int age = u1.getAge() -u2.getAge();
				if(age != 0){
					return age;
				}else{
					return - u1.getName().compareTo(u2.getName());
				}
			}else{
				return 0;
			}
		}
	};
	TreeSet set = new TreeSet(com);
	set.add(new User("Name",Age));

5.4Set接口中除了Collection中定义的方法之外,没有再额外定义方法。
说明:实际开发中,我们使用List和Map的频率很高,而Set的使用频率比较低。
无序性:无序性不等于随机性,所谓的无序性,是指在底层存储数据方面,不是连续的,而是无序的。
不可重复性:添加到Set中的元素不相同。涉及到重写hashCode()和equals().
向HashSet或LinkedHashSet中添加数据的过程:哈希算法
向Set中添加元素a,首先根据元素a所在类的hashCode(),计算a的哈希值,此哈希值就决定了元素a在底层数组中的存储位置。
如果要存储的位置上之前没有元素,则元素a直接添加成功,如果要存储的位置上已经有其他元素b,则此时需要调用元素a所在类的equals()方法,将元素b作为参数传入,判断a与b是否相等,如果返回true,则认为元素a与元素b是相同的,如果返回false,则认为元素a与b不同,元素a仍能添加成功,此时元素a与b一链表方式存储。
(jdk 7:元素b指向元素a;jdk 8:元素a指向元素b)
保证hashCode()和equals()重写的时候,保持一致性!

6.Map接口。

存储的是键值对特点的数据。
一个key-value构成一个entry对象。
Map中所有的key是无序的、不可重复的,即使用Set进行存储。
hashMap—>HashSet/LinkedHashMap—>LinkedHashSet/TreeMap—>TreeSet
Map中的所有的value是无序的、可重复的,即使用Collection进行存储。
所有的entry也是无序的、不可重复的,即使用Set进行存储。
HashMap:是Map的主要实现类,线程不安全,效率高;可以存储null的key和null的value。底层使用数组+链表+红黑树(jdk8新增)。
LinkedHashMap:是HashMap的子类,在添加数据的同时,记录数据的添加的先后顺序(使用双向链表),便于遍历时,能按照添加的顺序实现遍历。
TreeMap:可以按照key中对象的相应的属性进行排序,便于遍历时,能按照属性的大小顺序实现遍历。
Hashtable:是Map的古老实现类;线程安全,效率低;不可以存储null的key和null的value。
Properties:Hashtable的子类,主要用于处理属性文件。键和值都是String类型。

7.Map中常用的方法:

Object put(Object key,Object value):添加。
Object remove(Object key):通过key删除。
void putAll(Map t):将t中的所有键值对添加到当前的map中。
void clear():清空数据。
Object get(Object key):根据指定的key,查询对应的value。
boolean containsKey(Object key):判断是否包含形参key。
boolean containsValue(Object value):判断是否包含形参value。
int size():获取集合中的键值对个数。
boolean isEmpty():判断集合是否为空。
boolean equals(Object obj):判断集合与obj是否相同。

要求:key所在的类,要重写hashCode()和equals().
value所在的类,要重写equals().
遍历Map中的key集,value集,key-value集
Set keySet()
Collection values()
Set entrySet()

10-04 21:21