————集合框架
为什么会出现那么多的容器呢?
因为每一个容器对数据的存储方式不同。这个存储方式称之为: 数据结构。
共性方法: 1、add方法的参数类型是Object。以便于接收任意类型的对象。
2、集合中存储的都是对象的引用。
基本操作:
ArrrayList a1 = new ArrayList();
1、添加元素
a1.add(Object obj);
2、打印原集合
System.out.println(a1);
3、删除元素
a1.remover(元素);
a1.clear(); 清空集合
4、判断元素
a1.contains(需要判断的元素); 判断是否存在某元素?
a1.isEmpoty(); 判断集合是否为空?
5、获取个数 。集合的长度
a1.size();
6、取两个集合中相同的部分
a1.retainAll(a2); 取交集 ,a1 中只会保留和a2 中相同的元素。
迭代器: (就是集合的取出元素的方式)
Iterator it = a1.iterator(); //获取迭代器,用于取出集合中的元素。
for(Iterator it = a1.iterator(); it.hasNext() ; ) {
System.out.println(it.next());
}
把取出方式定义在集合的内部,就可以直接访问集合内容的元素。
即取出方式就被定义为了内部类。 它们都有共性的内容:判断和取出。就可以抽取 到Iterator。 ———如果集合实现了Iterator这个规则,就可以通过一个对外的方法 iterator();来获取集合的取出对象了。
Collection
|——List: 元素是有序的,元素可以重复,因为该集合体系有索引。
|---ArrayList : (线程不同步) 底层的数据结构使用的是数组结构; 特点:查询速度很快、但是增删很慢。
|---LinkedList : 底层使用的链表数据结构 ;
|---Vector : (线程同步) 底层是数组数据结构。 被ArrayList替代了。
List集合判断元素是否相同,依据的是元素的equals方法。
|——Set: 元素是无序的, 元素不可以重复。
|--- HashSet : 底层数据结构是哈希表。线程是同步的
|---TreeSet : 可以对Set集合中的元素进行排序
底层数据结构是二叉树
保证元素唯一性的依据: CompareTo 方法 return 0。
Set集合的功能和Collection 是一致的。
————List :
特有方法,凡是可以操作角标的方法都是该体系特有的方法。
增:
add (index , element );
addAll (index , Collection);
删:
remove(index);
改:
set(index, element);
查:
get(index);
subList(form , to); 获取子链表
listIterator(); //在迭代过程中,准备添加或者删除元素。
List集合特有的迭代器。 ListIterator 是Iterator 的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素; 因为会发生ConcurrentModificationException 异常。
所以,在迭代器时,只能用迭代器的获取操作元素,可是Iterator 方法有限,只能对元素进行判断、取出、删除的操作;如果想要对其进行其他 如 添加、修改等操作,就需要使用其子接口,ListIterator 。
----该接口只能通过List 集合的ListIterator 方法获取。
枚举就是Vector特有的取出方式。 发现枚举和迭代器很像, 其实枚举和迭代是一样的。 (--其实迭代器取代了枚举。)
LinkedList :特有的方法:
addFirst(); addLast(); 把一个元素添加到**;
getFirst(); getLast(); 获取元素,但是不删除元素。
removeFirst(); removeLast(); 获取元素,但是元素被删除。 如果集合中没有元素,会出现NoSuchElementException
JDK 1.6 出现了替代方法
offerFirst(); offerLast(); 把一个元素添加到**;
peekFirst(); peekLast(); 获取元素,但是不删除元素。如果集合中没有元素,会返回null。
pollFirst(); pollLast(); 获取元素,但是元素被删除。如果集合中没有元素,会返回null。
使用LinkedList 模拟一个堆栈或者队列数据结构;
堆栈: 先进后出,如同一个杯子;
队列:先进先出 First in First out FIFO 如同一个水管。
在迭代时 next调用一次, 就要hasNext判断一次;
—————Set:
HashSet 是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode 和equals来完成的。
如果元素的HashCode值相同,才会判断equals是否为true;
如果元素的HashCode值不同,才会调用equals方法。、
一般 某个对象要存储到集合中存的话,一般都有复写 hashCode 和equals方法。
注意: 对于判断是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals
TreeSet:
---排序时,当主要条件相同时,一定要判断次要条件。
TreeSet排序的第一种方式:
让元素自身具备比较性。元素需要实现Comparable 接口,覆盖CompareTo 方法,这种方式也叫元素的自然排序或者称为默认排序。
TreeSet的第二种排序方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。 在集合初始化时,就有了比较方式。
----当元素自身不具备比较性,或者具备的比较性不是所需要的。这时就需要让容器自身具备比较性。定义一个比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
当两种排序都存在时,以比较器为主。
定义一个类,实现Comparator接口,覆盖Compare方法。
Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部接口。
附加练习: 每一个学生都有对应的归属地。 学生属性: 姓名、年龄;注意: 姓名和年龄相同的视为同一个学生。保证学生的唯一性。
分析: 1、描述学生; 2、 定义一个Map容器,将学生作为键,地址作为值。存入。 3、获取map集合中的元素。
1 Class Student implements Comparable<Student> 2 { 3 private String name ; 4 private int age; 5 Student(String name, int age) { 6 this.name = name; 7 this.age = age; 8 } 9 public int compareTo(Student s) { 10 int num = new Integer(this.age).compareTo(new Integer(s.age)); 11 if(num ==0) 12 return this.name.compareTo(s.name); 13 } 14 public int hashCode() { 15 return name.hashCode() + age*34; 16 } 17 public boolean equals (Object obj) { 18 if(!(obj instanceof Student )) { 19 throw new ClassCastException("类型不匹配"); 20 } 21 Student s = (Student) obj; 22 return this.name.equals(s.name) && this.age == s.age; 23 } 24 public String getName() { 25 return name; 26 } 27 public int getAge() { 28 return age; 29 } 30 }
一个以学生姓名排序的 比较器:
1 class stuNameComparator implements Comparator<Student> {
public int compare(Student s1, Student s2) {
int num = s1.getName().compareTo(s2.getName());
if(num == 0)
return new Integer(s2.getAge()).compareTo(new Integer(s2.getAge())); return num;
}
}
map集合练习2:
“sdfkhfhfsklefs” 获取该字符串中的字母出现的次数。
希望打印的结果: a(2) c(4) d(3).....
可以发现字母与次数之间都有映射关系。
----当数据之间存在这映射关系时,就要先想到 map 集合。
思路: 1、将字符串转换成字符数组,因为要对每一个字母进行操作。 2、定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。 3、遍历字符数组 : 将每一个字母作为键去查map集合。 如果返回null ,将该字母和1 存入到map集合中去; 如果返回不是null ,说明该祖母在map集合中已经存在并有对应的次数。 那么久获取该次数并进行自增,,然后将该字母和自增后的次数存入到map集合中,覆盖调用原来键对应的值。 4、 将map集合中的数据变为指定的字符串形式返回。