---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------
集合的特点:
1:对象封装数据,对象多了也需要存储。集合用于存储对象。2:对象的个数确定可以使用数组,但是不确定怎么办?可以用集合。因为集合是可变长度的。
集合和数组的区别:
1:数组是固定长度的;集合可变长度的。
2:数组可以存储基本数据类型,也可以存储引用数据类型;集合只能存储引用数据类型。
3:数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。
数据结构:就是容器中存储数据的方式。
对于集合容器,有很多种。因为每一个容器的自身特点不同,其实原理在于每个容器的内部数据结构不同。
集合容器在不断向上抽取过程中。出现了集合体系。
collection接口的两个子接口:
List:有序(元素存入集合的顺序和取出的顺序一致),元素都有索引。元素可以重复。
Set:无序(存入和取出顺序有可能不一致),不可以存储重复元素。必须保证元素唯一性。
List接口:
List本身是Collection接口的子接口,具备了Collection的所有方法。
List的三个实现类
ArrayList:底层的数据结构是数组,线程不同步,ArrayList替代了Vector,查询元素的速度非常快。
LinkedList:底层的数据结构是链表,线程不同步,增删元素的速度非常快。
Vector:底层的数据结构就是数组,线程同步的,Vector无论查询和增删都巨慢。
Set接口:
Set接口中的方法和Collection中方法一致的。Set接口取出方式只有一种,迭代器。
HashSet:底层数据结构是哈希表,线程是不同步的。无序,高效;
HashSet集合保证元素唯一性:通过元素的hashCode方法,和equals方法完成的。
当元素的hashCode值相同时,才继续判断元素的equals是否为true。
如果为true,那么视为相同元素,不存。如果为false,那么存储。
如果hashCode值不同,那么不判断equals,从而提高对象比较的速度。
TreeSet:对Set集合中的元素的进行指定顺序的排序。不同步。TreeSet底层的数据结构就是二叉树。
TreeSet用于对Set集合进行元素的指定顺序排序,排序需要依据元素自身具备的比较性。
如果元素不具备比较性,在运行时会发生ClassCastException异常。
所以需要元素实现Comparable接口,强制让元素具备比较性,复写compareTo方法。
依据compareTo方法的返回值,确定元素在TreeSet数据结构中的位置。
Map接口:
HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable.
TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。
Map集合存储和Collection有着很大不同:
Collection一次存一个元素;Map一次存一对元素。
Collection是单列集合;Map是双列集合。
Map中的存储的一对元素:一个是键,一个是值,键与值之间有对应(映射)关系。
框架结构:
HashSet集合:
- package cn.jiava.basic.collection;
- import java.util.HashSet;
- import java.util.Iterator;
- //Set集合演示
- public class SetDemo {
- @SuppressWarnings("unchecked")
- public static void main(String[] args) {
- HashSet set=new HashSet();
- set.add("aaa");
- set.add("bbb");
- set.add("ccc");
- set.add("ccc");
- set.add("ddd");
- //我们应该考虑最小内存开销,保证循环结束后迭代器被释放。
- for( Iterator it=set.iterator();it.hasNext();){
- System.out.println(it.next());
- }
- }
- }
运行结果:
aaa
ddd
ccc
bbb
得出HashSet集合内部是哈希表,在存入对象时会先调用hashCode方法算哈希值,如果哈希值相同,则会调用对象的eqauls方法继续判断,如果返回true则认为对象重复,则不存入。同时存入的对象元素都是无序的。
TreeSet集合:
- //如果TreeSet容器没有比较器,那么存入的对象具有自然顺序,否则报错。
- public class Person implements Comparable{
- private int age;
- private String name;
- public Person() {
- super();
- }
- public Person(String name,int age ) {
- super();
- this.age = age;
- this.name = name;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- //在TreeSet容器没有比较器时,会调用此方法进行比较再存入容器。
- //在这里按照人的年龄进行比较
- @Override
- public int compareTo(Object o) {
- if(!(o instanceof Person)){
- throw new ClassCastException("类型不合法");
- }
- Person p=(Person) o;
- int temp=this.age-p.age;
- return temp==0?this.name.compareTo(p.name):temp;
- }
- }
- /TreeSet集合存入元素时根据元素自然顺序存入
- public class TreeSetDemo {
- @SuppressWarnings("unchecked")
- public static void main(String[] args) {
- TreeSet ts=new TreeSet();
- ts.add(new Person("zhangsan",22));
- ts.add(new Person("lishi",21));
- ts.add(new Person("wangwu",23));
- ts.add(new Person("wbngwu",23));//如果年龄相同,则按次要条件年龄进行比较存入
- ts.add(new Person("zhaoliu",20));
- Iterator it=ts.iterator();
- while(it.hasNext()){
- Person person=(Person) it.next();
- System.out.println(person.getName()+":::"+person.getAge());
- }
- }
- }
- <p> </p>
运行结果:
zhaoliu:::20
lishi:::21
zhangsan:::22
wangwu:::23
wbngwu:::23
TreeMap集合:
- //TreeMap和TreeSet存入元素一样,根据自然顺序和集合的比较器进行存入。
- public class TreeMapDemo {
- @SuppressWarnings("unchecked")
- public static void main(String[] args) {
- TreeMap<Person, String> hm=new TreeMap<Person, String>(new ComparatorByName());//传入集合比较器
- hm.put(new Person("zhangsan",22), "北京");
- hm.put(new Person("lishi",20), "深圳");
- hm.put(new Person("wangwu",21), "上海");
- hm.put(new Person("zhaoliu",25), "天津");
- hm.put(new Person("wangwu",21), "重庆");
- //Map.Entry为内部类,通过该内部类的getKey和getValue方法可获得键和值。
- for(Map.Entry<Person, String> me:hm.entrySet()){
- System.out.println(me.getKey().getName()+":::"+me.getKey().getAge()+"..."+me.getValue());
- }
- }
- }
运行结果:
lishi:::20...深圳
wangwu:::21...重庆
zhangsan:::22...北京
zhaoliu:::25...天津
---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------