集合:
1 由来:
面向对象语言会产生很多对象,为了对这些对象进行存储,操作,就产生了集合。集合存放的是对象的地址,操作的对象是对象。他是可变长度的。
对象用于封装特有数据,对象多了需要存储,如果对象的个数不定,则使用集合进行存储。
2.特点:
1.集合是用于存储对象的容器
2.集合的长度是可变的。
3.集合中不可以存储基本数据类型值。这是它和数组的重要区别之一。
3.每个容器都有自己的特点,所有的容器都有其共性。集合容器因为内部的数据结构不同,有多种具体容器,不断向上抽取,就形成了集合框架,框架的顶层Collection接口
迭代器对象必须依赖于具体的容器,因为么一个容器的数据结构都不相同,
所以该迭代器对象是在容器中进行内部实现的,对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器对象即可,也就是iterator方法。
Iterator接口就是对所有Collection子类容器进行元素取出的公共接口。
7.List(列表)和set(集):
List:有序的Collection,也成为序列。此接口的用户可以对列表中的每个元素的插入位置进行精确的控制,即索引。有序的:存入和取出存在一定的序列,顺序一致。每个元素都有角标(索引),可以存在重复的元素
set:不包含重复元的Collection,并且最多包含一个null元素。元素不能重复(与List最大的区分),无序的,内部有一定的存储规则。
为了避免异常,且完成相应的操作,可以使用Iterator接口的子接口列表迭代器(listIterator)。
它可以实现在迭代的过程中完成对元素的增删查改。
注意:只有在List集合中才存在该迭代器功能。
6.list下的重要的集合:
Vector:内部是数组数据结构。连续存储,每个元素带有索引,大小可根据需要增大或减小。它是同步的,线程安全。jdk 1.0就出现了。现在几乎不用了。
增删,查询速度都很慢。
ArrayList:内部是数组数据结构。他是不同步的,jdk 1.2才出现。替代了Vector。查询的速度很快。
LinkedList:内部是链表数据结构。他是不同步的。增删元素的速度很快。
判断对象是否相同的依据:equals()方法。
10.set:set中取数据使用迭代器iterator。set接口中的方法和Collection一致。
HashSet:内部数据结构是哈希表。有哈希表支持,不保证迭代顺序。特别是不保证顺序恒久不变。不同步。
哈希表判断元素是否相同的依据:
1.判断两个元素的哈希值是否相同。其实判断的是对象的hashCode()的方法。
2.判断两个元素的内容是否相同。其实是使用equals()方法进行判断。
注意:如果第一步不满足,则不再判断第二步。
treeSet:使用元素的自然顺序(字典序)对set集合中的元素进行排序。是不同步的。
判断元素唯一性的依据:根据比较方法(compareTo)的返回结果是否是0,若是代表两对象相等。正数代表大于。负数代表小于。
当无论比较结果如何,使返回值总是返回1,则会按照输入顺序存储。即产生有序现象。返回值为0时,按照倒序。
对元素进行排序的方式:
1.让元素本身剧本必备比较功能,需要实现Comparable接口,覆盖compareTo方法。
2.如果不要按照对象中具备的自然顺序进行排序,如果对象中不具备自然顺序时,可以让集合自身具备比较功能。
定义类实现Comparator比较接口。重写compare方法,将该类对象作为参数传递给创建的treeSet集合的构造函数。使集合自身具备比较功能。
1 由来:
面向对象语言会产生很多对象,为了对这些对象进行存储,操作,就产生了集合。集合存放的是对象的地址,操作的对象是对象。他是可变长度的。
对象用于封装特有数据,对象多了需要存储,如果对象的个数不定,则使用集合进行存储。
2.特点:
1.集合是用于存储对象的容器
2.集合的长度是可变的。
3.集合中不可以存储基本数据类型值。这是它和数组的重要区别之一。
3.每个容器都有自己的特点,所有的容器都有其共性。集合容器因为内部的数据结构不同,有多种具体容器,不断向上抽取,就形成了集合框架,框架的顶层Collection接口
4.Collention的常见方法:
1.添加:
Boolean add(Object o);
Boolean addAll(Collection c);//有重复元素时重复添加。
2.删除:
Boolean remove(Object o); //会改变集合的长度
Boolean removeAll(Collection c);//将两个集合中的相同元素从调用者集合中删除掉,注意删除的是相同的元素。
void clear(); //清空,容器还在。
3.判断:
Boolean contains(Object o);//包含
Boolean containsAll(Collection c);//必须包含所有元素才返回true。
Boolean isEmpty(); //判断集合是否为空
4.获取:
int size();//获取集合的元素个数(长度)。
Iterator iterator();//迭代器,获取元素。
5.其他:
Boolean retainAll(Collection c);//取交集,保留调用者集合中与指定集合相同元素
Object toArray();//将集合转化成数组
5.迭代器使用: Iterator it = Collention子类对象.iterator();//创建迭代器对象
it.next(); //输出第一个元素
it.next(); //输出第二个元素,it会自动后移。
//当迭代器到最后个元素时,即不存在next()时,会出现运行时错误。
it.hasNext(); //存在下一个时,返回true。
所以,输出容器中的所有元素,可以使用方法:
while(it.hasNext()){
System.out.println(it.next());
}
注意:该方法运行结束后,迭代器it还会驻留内存,但是相当于指向容器的末尾,已经没有存在的价值。
所以更好的使用方法时把迭代器定义成局部变量,相应代码执行结束时释放迭代器资源:
for(Iterator it = Collention子类对象.iterator();it.hasNext();){
System.out.println(it.next());
}
6.迭代器的原理: 迭代器对象必须依赖于具体的容器,因为么一个容器的数据结构都不相同,
所以该迭代器对象是在容器中进行内部实现的,对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器对象即可,也就是iterator方法。
Iterator接口就是对所有Collection子类容器进行元素取出的公共接口。
7.List(列表)和set(集):
List:有序的Collection,也成为序列。此接口的用户可以对列表中的每个元素的插入位置进行精确的控制,即索引。有序的:存入和取出存在一定的序列,顺序一致。每个元素都有角标(索引),可以存在重复的元素
set:不包含重复元的Collection,并且最多包含一个null元素。元素不能重复(与List最大的区分),无序的,内部有一定的存储规则。
List特有的常见方法:可以完成对元素的增删查改。List最大的特点(共性):都可以操作角标(索引)。
1.添加:
void add(index,element);
void add(index,collection);
2.删除:
Object remove(index); //返回被删除的对象。
3.修改
Object set(index,element); //返回修改前的对象,需要注意的是:在Vector也有该方法,不过在Vector中set方法中参数顺序与其正好相反。前对象后下标。
4.获取:
Object get(index); //返回角标代表的对象,特有的方式。
int indexOf(Object);
int lastIndexOf(Object);
List subList(from,to); //返回截出的对象
5.在迭代器过程中不要使用集合操作元素,因为容易出现异常。 为了避免异常,且完成相应的操作,可以使用Iterator接口的子接口列表迭代器(listIterator)。
它可以实现在迭代的过程中完成对元素的增删查改。
注意:只有在List集合中才存在该迭代器功能。
6.list下的重要的集合:
Vector:内部是数组数据结构。连续存储,每个元素带有索引,大小可根据需要增大或减小。它是同步的,线程安全。jdk 1.0就出现了。现在几乎不用了。
增删,查询速度都很慢。
ArrayList:内部是数组数据结构。他是不同步的,jdk 1.2才出现。替代了Vector。查询的速度很快。
LinkedList:内部是链表数据结构。他是不同步的。增删元素的速度很快。
8.LinkedList:
需要注意的是:
该链表中的方法中,获取元素的方法有:
1.Object get(index);
2.Object getFirst();
3.Object getLast();
//如果链表为空,则出现运行时错误。替代方法:
//jdk 1.6以后出现新的方法:peekFirst();peekLast();若不存在,则返回NULL,不会抛出异常。
以上三种方式,只获取,不删除。
4.Object remove(index);
5.Object removeFirst();
//如果链表为空,则出现运行时错误。替代方法:
//jdk 1.6以后出现新的方法:poolFirst();poolLast();若不存在,则返回NULL,不会抛出异常。
6.Object removeLast();
//以上三种方法返回删除了的元素。
9.ArrayList: 判断对象是否相同的依据:equals()方法。
10.set:set中取数据使用迭代器iterator。set接口中的方法和Collection一致。
HashSet:内部数据结构是哈希表。有哈希表支持,不保证迭代顺序。特别是不保证顺序恒久不变。不同步。
哈希表判断元素是否相同的依据:
1.判断两个元素的哈希值是否相同。其实判断的是对象的hashCode()的方法。
2.判断两个元素的内容是否相同。其实是使用equals()方法进行判断。
注意:如果第一步不满足,则不再判断第二步。
treeSet:使用元素的自然顺序(字典序)对set集合中的元素进行排序。是不同步的。
判断元素唯一性的依据:根据比较方法(compareTo)的返回结果是否是0,若是代表两对象相等。正数代表大于。负数代表小于。
当无论比较结果如何,使返回值总是返回1,则会按照输入顺序存储。即产生有序现象。返回值为0时,按照倒序。
对元素进行排序的方式:
1.让元素本身剧本必备比较功能,需要实现Comparable接口,覆盖compareTo方法。
2.如果不要按照对象中具备的自然顺序进行排序,如果对象中不具备自然顺序时,可以让集合自身具备比较功能。
定义类实现Comparator比较接口。重写compare方法,将该类对象作为参数传递给创建的treeSet集合的构造函数。使集合自身具备比较功能。