------- android培训、java培训、期待与您交流! ----------
集合:
面向对象所操作的重点事物是对象,我们可以将属性和方法封装成对象,那么对象多了就需要对对象进行存储,集合就是用来存储对象最常用的方式。
集合和数组都是容器,二者的不同是数组的长度是固定的,而集合的长度是可变的,数组可以存储基本数据类型,集合只能存储对象。
我们知道在java的集合框架中有很多的容器,之所以会有这么多不同的容器是
因为每一个容器底层的实现的数据结构不同。
集合中的迭代器:
迭代器是集合中取出元素的一种方法,他是定义在集合类中的一个内部类,而且不同容器中的迭代器进行共性的抽取,形成了一个接口Iterator
我们在学习中应该重点掌握的部分如下所示:
Collection |----List:元素是有序的,可以重复,因为该集合体系有索引。 |----ArrayList底层的数据结构使用的是数组结构。特点:查询速度很快。但是增 删稍慢,线程不同步; |----LinkedList:底层使用的数据结构是链表数据结构。特点:增删速度很快, 查询稍慢,线程不同步; |---- Vector:底层是数组数据结构,线程同步,现在已经很少使用它了,如果 需要线程同步的话,我们可 以对集合手动加锁 |----Set:元素无序,不可以重复; |----HashSet:底层数据结构是哈希表,线程是非同步的。保证元素唯一性 的原理:判断元素的 hashcode值是否相同;如果相同, 还 会继续判断元素的equals方法,是否为true;
|----TreeSet:可以对Set集合中的元素进行排序;底层数据结构是二叉树, 保证元素唯一性的依 据:compareTo方法return 0 ; TreeSet排序的第一种方式:让元素自身具备比较性。元素 需要实现Comparable接口, 覆盖compareTo方法。也种方 式也成为元素的 自然顺序,或者叫做默认顺序 。 TreeSet 的第二种排序方式:当元素自身不具备比 较性时, 者具备的比较性不是所 需要 的。这时 就需 要让集合自身 具备比较性。在集合一初始化时,就有了比较 方式。
Map |-----------------HashMap:底层是hash表数据结,它允许null键和null值,并且该 集合是线程同步的。
|-----------------HashTable:底层也是hash表数据结构,但是它不允许null键和 null值,该集合是线程同步的。
|-----------------TreeMap: 底层是二叉树数据结构,线程不同步,可以用于给Map 集合的键值排序。 |
下面我们看一下集合存储自定义的对象时一些注意点:
若存储对象时没有要求对象不能重复,则选用List集合,若要求集合中的元素不能重复,则选用Set集合。在定义
一个要被集合存储的类的时候要做的事情就比以前多了不少,如实现Comparable接口,覆写equals方法,
覆写hashCode方法等,看下面的例子:
我们定义一个Person类:
class Person implements Comparable { private String name; private int age; Person(String name,int age) { this.name=name; this.age=age; }
public int comparaTo(Object obj) { if(!(obj instanceof Person)) throw new RuntimeException("不是Person对象"); Person p=(Person)obj; if(this.age<p.age) return -1; if(this.age>p.age) return 1; return 0; }
public int hashCode() { return name.hashCode()+age*27; }
public boolean equals(Object obj) { if(!(obj instanceof Perosn)) throw new RuntimeException("不是Person对象"); Person p=(Person)obj; return this.name.equals(p.name)&&this.age==age; } public String getName() { return name; } public int getAge() { return age; } } |
现在我们用TreeSet集合存储上述自定义的对象:
class SetDemo2 { public static void main(String[]args) { TreeSet<Person> ts=new TreeSet<Person>(); ts.add(new Perosn("zhangsan",23)); ts.add(new Person("lisi",23)); ts.add(new Person("wangwu",24)); ts.add(new Person("zhaoliu",54));
Iterator<Person> it=ts.iterator(); while(it.hasNext()) { Person p=it.next(); System.out.println(p.name+"......"+p.age); }
} } |
注:TreeSet集合对元素进行排序是通过comparaTo方法,所以执行程序后lishi 23并没有存进集合。
再用HashSet集合存储:
class SetDemo2 { public static void main(String[]args) { HashSet<Person> hs=new HashSet<Person>(); hs.add(new Perosn("zhangsan",23)); hs.add(new Person("lisi",23)); hs.add(new Person("wangwu",24)); hs.add(new Person("zhaoliu",54)); hs.add(new Person("lisi",23));
Iterator<Person> it=ts.iterator(); while(it.hasNext()) { Person p=it.next(); System.out.println(p.name+"......"+p.age); }
} } |
注:HashSet判断元素是否相同的依据是hashCode和equals方法,所以最后添加的lisi 23没有添加进去。
Map集合的两种取出方式总结:
看如下代码示例:
import java.util.*; class MapDemo { public static void main(String[]args) { Map<String,String> map=new HashMap<String,String>(); map.put("1","zhangsan1"); map.put("2","lisi"); map.put("3","wangwu");
method_1(map); method_2(map); }
public static void method_1(Map<String,String> map) { Set<String> keyset=map.keySet(); Iterator<String> it=keyset.iterator(); while(it.hasNext()) { String key=it.next(); String Value=map.get(key); System.out.println("key:"+key+"....value:"+value); } }
public static void method_2(Map<String,String> map) { Set<Map.Entry<String,String> entryset=map.entryset(); Iterator<Map.Entry<String,String>>it=entryset.iterator(); while(it.hasNext()) { Map.entry<String,String>me=it.next(); String key=me.getKey(); String value=me.getValue(); System.out.println(key+"......"+value); } } } |