黑马程序员之集合框架1

------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------

集合框架:用于存储数据的容器。
特点:
1,对象封装数据,对象多了也需要存储。集合用于存储对象。
2,对象的个数确定可以使用数组,但是不确定怎么办呢?可以使用集合。因为集合是可变长度的。

集合数组的区别:
1, 数组是固定长度的,集合是可变长度的。
2,数组可以存储基本数据类型,也可以存储引用数据类型。集合只能存储引用数据类。
3,数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

数据结构:就是容器中存储数据的方式。

对于集合容器有很多种。因为每一个容器的自身特点不同,其实原理在于每一个容器的内部数据结构不同。集合容器在不断
向上的抽取的过程中,形成了集合体系。
在使用一个体系时,原则是:参阅顶层内容,建立底层对象。

java.util包Collection接口。
Collection:
List:有序(元素存入集合的顺序和取出的顺序一致);元素都有索引。元素可以重复。
Set:无序(元素存入集合的顺序和取出顺序不一定一致);不可以存贮重复元素。必须保证元素的唯一性。


Collection接口中的共性方法。
1,添加
add(Object):添加一个元素。
addAll(Collection):添加一堆元素。
2,删除:
clear():将集合中的元素全部删除,清空集合。
remove(obj):删除集合中指定的对象。注意:删除成功集合的长度会改变。
removeAll(collection):删除部分元素。
3,判断。
boolean contains(obj):集合中是否包含指定元素。
boolean containsAll(Collection):集合中是否包含指定的多个元素。
bollean isEmpty();集合中是否有元素。
4,获取。
int size();集合中有几个元素。
5,取交集
boolean retainAll(Collection);对当前集合中保留和指定集合中的相同元素。如果两个集合元素相同,返回false;如果
retainAll修改了当前集合,返回true。
5,获取集合中的所有元素
Iterator iterator();迭代器。
6,将集合变成数组。
toArray();


Iterator接口:
迭代器是一个接口。 作用:用于取出集合中的元素。
里边包含三个方法:hasNext()  next()  remove()


每一个集合都有自己的数据结构,都有特定的取出自己内部元素的方式。为了便于操作所有的容器,取出元素。
将容器内部的取出方式按照一个统一的规则向外提供,这个规则就是Iterator接口。
也就是说,只要通过该接口就可以取出Collection集合中所有的元素,至于每一个具体的容器依据自己的数据结构,
如何实现的具体取出细节,这个不用关心,这样就降低了取出元素和具体集合的耦合性。


取出集合中的元素两种方式:

import java.util.*;
class CollectionDemo
{
	 public static void main(String[] args)
	 {
	 	ArrayList al=new ArrayList();
		
		al.add("java01");
		al.add("java02");
		al.add("java03");
		al.add("java04");
		
		Iterator it=al.iterator();
		
		while(it.hasNext())
		{
			System.out.println(it.next());
		}
		
		//第二种方式
		for(Iterator it=al.iterator();it.hasNext();)
		{
			System.out.println(it.next());	
		}
	 }
}

List接口:
List本身是Collection的子接口,具备了Collection的所有方法。List体系还有特有的共性一些方法,查阅方法发现
List的特有方法都有索引,这是该集合的最大特点。

List:有序(元素存入集合的顺序和取出集合的顺序一致),元素都有索引,元素可以重复。
ArrayList:底层的数据结构是数组结构,线程不同步,查询速度非常快。
LinkedList:底层的数据结构是链表结构。线程不同步,增删速度非常快。
Vextor:底层的数据结构是数组,线程同步,被ArrayList替代了,无论查询和增删都巨慢。


方法:
1,添加:
add(index,element):在指定的索引位插入元素。
addAll(index,collection):在指定的索引位插入一堆元素。
2,删除:
remove(index):删除指定索引位的元素。返回被删的元素。
3,获取:
Object get(index):通过索引获取指定元素。
int indexOf(obj):获取指定元素第一次出现的索引位,如果该元素不存在返回-1。索引可以通过-1判断一个元素是否存在。
int lastIndexOf(Object o):反向索引指定元素的位置。
List subList(start,end):获取子列表。
4,修改:
Object set(index,element):对指定索引位的元素就行修改。
5,获取所有的元素
ListIterator listIterator():List集合特有的迭代器。


List集合支持对元素的增删改查。


List集合因为有角标所以有了有了自己的获取元素的方式。

for(inr x=0;x<list.size();x++)
{
	System.out.println(list.get(x));
}

在进行List列表元,素迭代的时候,如果想要在迭代的过程中,想要对元素进行操作的时候,比如满足条件添加新元素。会发生ConcurrentModificationException
并发修改异常。
导致的原因是:
集合引用和迭代器引用在同时操作元素,通过集合获取到对应的迭代器后,在迭代中,进行集合引用的元素添加,迭代器并不知道,所以会出现异常情况。
那么如何解决呢?
既然是在迭代中对元素进行操作,那么找迭代器的方法最为合适,可是Iterator中只有hasNext next remove方法,通过查阅它的子接口ListItertor,发现
该列表迭代器接口具备了堆元素的增删改查的动作。
ListIterator是List集合特有的迭代器。

注意:对于List集合,底层判断元素是否相同,其实用的是元素自身的equals方法完成的。所以建议元素都要复写equal方法,
建立元素对象自己的比较相同的条件依据。


LinkedList:特有方法。
addFirst();
addLast();
在JDK1.6以后。
offerFirst();
offerLast();


getFirst();获取链表中第一个元素。如果链表为空,抛出NoSuchElementException。
getLast();
在JDK1.6以后。
peekFirst();获取链表中的第一个元素,如果链表为空,返回null。
peekLast();


removeFirst();获取链表中第一个元素,但是会删除链表中的第一个元素。如果链表为空,会抛出NoSuchElementException。
removeLast();
在JDK1.6以后。
pollFirst();获取链表中的第一个元素,但是会删除链表中的第一个元素。如果链表为空,返回null。




java.util_Set接口。元素不可以重复,必须保证元素的唯一性。
Set接口中的方法和Collection接口中的方法一致的。Set接口的取出方式只有一种,就是迭代器。


HashSet:底层数据结构是哈希表,线程是不同步的。无序,高效。
HashSet集合保证元素的唯一性:
通过元素的hashCode方法和equals方法完成的。
当元素的hashCode值相同时,才继续判断元素的equals是否为true。
如果为true,那么视为相同元素,不存。如果为false,那么存储。
如果hashCode值不同,那么不判断equals,从而提高对象的比较速度。


LinkedHashSet:有序,hashSet的子类。


TreeSet:对Set集合中的元素进行指定顺序的排序。不同步。TreeSet底层数据结构是二叉树。


对于ArrList集合:判断元素是否存在或者删除元素底层依据的是equals方法。
对于HashSet集合:对于判断元素是否存在,或者删除元素,底层依据的是hashCode和equals方法。


TreeSet集合:
用于对Set集合进行元素的指定顺序的排序,排序需要依据元素自身具备比较性。
如果元素不具备比较性,在运行时会发生ClassCastException异常。
所以需要元素实现Comparable接口,强制让元素具备比较性,复写compareTo方法。
依据compareTo方法的返回值,确定元素在TreeSet数据结构中的位置。
TreeSet方法保证元素唯一性的方式:就是参考比较方法的结果是否为0.如果return 0,视为两个对象重复,不存。


注意:在进行比较时,如果判断元素不唯一,比如,同姓名,同年龄,才视为同一个人。
      在判断时,需要分主要条件和次要条件,当主要条件相同时,再判断次要条件,按照次要条件排序。


TreeSet集合排序的两种方式,Compareble和Comparator的区别:
1,让元素自身具备比较性,需要元素对象实现Compareble接口,覆盖compareTo方法。
2,让集合自身具备比较性,需要定义一个实现了Comparator接口的比较器,并覆盖compare方法,并将该类对象
   作为实际参数传递给TreeSet集合的构造函数。
第二种方式较为灵活。
当两种方式都存在时,以比较器为主。



------- <a  target="blank">android培训</a>、<a  target="blank">java培训</a>、期待与您交流! ----------


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值