集合(collection)
使用数组存放数据的弊端:长度不可变,而集合可以动态的添加值
java集合类不仅可以存储数量不等的多个对象,还可以保存具有映射关系的关联数组
/*
* 1.存储对象可以考虑:①数组 ②集合
* 2.数组存储对象的特点:Student[] stu = new Student[20]; stu[0] = new Student();....
* >弊端:①一旦创建,其长度不可变。②真实的数组存放的对象的个数是不可知。
* 3.集合
* Collection接口
* |------List接口:存储有序的,可以重复的元素
* |------ArrayList(主要的实现类)、LinkedList(对于频繁的插入、删除操作)、Vector(古老的实现类、线程安全的)
* |------Set接口:存储无序的,不可重复的元素
* |------HashSet、LinkedHashSet、TreeSet
* Map接口:存储“键-值”对的数据
* |-----HashMap、LinkedHashMap、TreeMap、Hashtable(子类:Properties)
*/
java集合有Collection和Map集合两种
Collection接口:
Set集合:元素之间无序,不可重复
List集合:元素有序、可以重复
Map集合:具有映射关系的键值对
Collection的继承体系:
Map集合的继承体系
Collection接口:
Collection接口是List、Set、Queue接口的父接口
在java5之前,java集合会丢失容器中所有对象的数据类型,把所有的对象都当做Object对象,java5之后,增加了泛型,java集合可以记住容器中的对象的数据类型
List接口的实现类之一:ArrayList
使用Iterator接口遍历集合中的元素,还可以使用增强for进行遍历
List接口中的元素都有一个整数序号来记录元素的位置,可以根据序号来获取元素
List接口的常用实现类:ArrayList、LinkedList、Vector
ArrayList是List接口的典型实现类,本质上,ArrayList是对象引用的一个变长数组
ArrayList是线程不安全的,而Vector是线程安全的,即使要保证List是安全的,也不用Vector
Arrays.asList()方法返回的List集合是一个固定长度的List集合,不是ArrayList实例,也不是Vector的实例
1 public void collection1() {
2 Collection coll = new ArrayList();
3 // 1.size():返回集合中元素的个数
4 System.out.println(coll.size());
5 // 2.add(Object obj):向集合中添加一个元素
6 coll.add(123);
7 coll.add("AA");
8 coll.add(new Date());
9 coll.add("BB");
10 System.out.println(coll.size());
11 // 3.addAll(Collection coll):将形参coll中包含的所有元素添加到当前集合中
12 Collection coll1 = Arrays.asList(1, 2, 3);
13 coll.addAll(coll1);
14 System.out.println(coll.size());
15 // 查看集合元素
16 System.out.println(coll);
17 // 4.isEmpty():判断集合是否为空
18 System.out.println(coll.isEmpty());
19 // 5.clear():清空集合元素
20 coll.clear();
21 System.out.println(coll.isEmpty());
22 }
1 public void collection2() {
2 Collection coll = new ArrayList();
3 coll.add(123);
4 coll.add(new String("AA"));
5 coll.add(new Date());
6 coll.add("BB");
7 // Person p = new Person("MM",23);
8 coll.add(new Person("MM", 23));
9 System.out.println(coll);
10 // 6.contains(Object obj):判断集合中是否包含指定的obj元素。如果包含,返回true,反之返回false
11 // 判断的依据:根据元素所在的类的equals()方法进行判断
12 // 明确:如果存入集合中的元素是自定义类的对象。要求:自定义类要重写equals()方法!
13 boolean b1 = coll.contains(123);
14 b1 = coll.contains(new String("AA"));
15 System.out.println(b1);
16 boolean b2 = coll.contains(new Person("MM", 23));
17 System.out.println(b2);
18 // 7.containsAll(Collection coll):判断当前集合中是否包含coll中所有的元素
19 Collection coll1 = new ArrayList();
20 coll1.add(123);
21 coll1.add(new String("AA"));
22
23 boolean b3 = coll.containsAll(coll1);
24 System.out.println("#" + b3);
25 coll1.add(456);
26 // 8.retainAll(Collection coll):求当前集合与coll的共有的元素,返回给当前集合
27 coll.retainAll(coll1);
28 System.out.println(coll);
29 // 9.remove(Object obj):删除集合中的obj元素。若删除成功,返回true。否则,返回false
30 boolean b4 = coll.remove("BB");
31 System.out.println(b4);
32
33 }
1 public void collection3() {
2 Collection coll = new ArrayList();
3 coll.add(123);
4 coll.add(new String("AA"));
5 coll.add(new Date());
6 coll.add("BB");
7 coll.add(new Person("MM", 23));
8
9 Collection coll1 = new ArrayList();
10 coll1.add(123);
11 coll1.add(new String("AA"));
12 // 10.removeAll(Collection coll):从当前集合中删除包含在coll中的元素。
13 coll.removeAll(coll1);
14 System.out.println(coll);
15 //11.equals(Object obj):判断集合中的所有元素是否完全相同
16 Collection coll2 = new ArrayList();
17 coll2.add(123);
18 coll2.add(new String("AA1"));
19 System.out.println(coll1.equals(coll2));
20 //12.hashCode():
21 System.out.println(coll.hashCode());
22 System.out.println();
23 //13.toArray() :将集合转化为数组
24 Object[] obj = coll.toArray();
25 for(int i = 0;i < obj.length;i++){
26 System.out.println(obj[i]);
27 }
28 System.out.println();
29 //14.iterator():返回一个Iterator接口实现类的对象,进而实现集合的遍历!
30 Iterator iterator = coll.iterator();
31 //方式一:不用
32 /*System.out.println(iterator.next());
33 System.out.println(iterator.next());
34 System.out.println(iterator.next());*/
35 //方式二:不用
36 // for(int i = 0;i < coll.size();i++){
37 // System.out.println(iterator.next());
38 // }
39 //方式三:使用
40 while(iterator.hasNext()){
41 System.out.println(iterator.next());
42 }
43 }
1 @Test
2 public void test(){
3 String[] str = new String[]{"AA","BB","DD"};
4 for(String s : str){
5 s = "MM";//此处的s是新定义的局部变量,其值的修改不会对str本身造成影响。
6 System.out.println(s);
7 }
8
9 for(int i = 0;i < str.length;i++){
10 System.out.println(str[i]);
11 }
12 }
13 @Test
14 public void testFor2(){
15 String[] str = new String[]{"AA","BB","DD"};
16 for(int i = 0;i < str.length;i++){
17 str[i] = i + "";
18 }
19
20 for(int i = 0;i < str.length;i++){
21 System.out.println(str[i]);
22 }
23 }
List接口的实现类之二:LinkedList
对于频繁的插入、删除元素的操作,建议使用LinkedList,效率较高
List接口的实现类之三:Vector
Vector大多数操作和ArrayList差不多,但是Vector是线程安全的,当插入、删除频繁的时候,使用LinkedList,Vector总是比ArrayList慢
Iterator和ListIterator的区别:
两者都有next()和hasNext(),可以实现向后遍历,但是ListIterator有previous()和hasPrevious()方法,即可以实现向前遍历
ListIterator可以定位当前位置,nextIndex()和previous()可以实现
ListIterator有add()方法,可以向list集合中添加数据
都可以实现删除操作,但是ListIterator可以实现对对象的修改,set()可以实现,Iterator仅能遍历,不能修改
Set集合不允许包含两个相同的元素,如果试图把两个相同的元素加入到同一个Set集合中,则添加操作失败
Set集合判断两个对象是否相等不是使用==,而是使用equals()方法
HashSet使用hash算法进行存储集合中的元素,因此有很好的存取和查找功能
HastSet的一下特点:
不能保证元素的顺序排列
HashSet不是线程安全的
集合元素可以是null
当向HashSet集合中添加一个元素时候,会调用hashCode()方法得到该对象的hashCode值,根据根据该值决定元素的存放位置
HashSet判断两个元素相等的的标准,两个对象的hashCode()是否相等,并且equals()方法是否相等
hashCode()方法::
如果元素的equals()方法返回true,但是他们的hashCode()值不同,hashSet会将他们存放在不同的位置,依然可以添加成功
对于存放在集合中的对象,对象的类一定要重写equals()和hashCode()方法,以实现对象的相等原则
Set实现类之二:LinkedHashSet
LinkedHashSset根据元素的hasCode值来决定元素的存储位置,但是它同时使用链表维护次序,这使得元素看起来是有序的
LinkedHashSet的插入性能要低于HashSet,但在迭代访问Set里面的元素是有很好的性能
LinkedHashSet不允许元素的重复
Set实现类之三:TreeSset
TreeSet是SortedSet的实现类,TreeSet可以保证元素处于排序状态
TreeSet两种排序方式:自然排序和定制排序,默认情况下,TreeSet采用自然排序
排序---自然排序
自然排序:TreeSet会调用集合元素的compareTo(Object object)方法来比较元素之间的大小关系,然后将元素按升序排列
如果试图把一个元素添加到TreeSet中,则该对象必须实现Comparable接口
实现Comparable接口必须实现compareTo(Object object),两个对象即通过这个方法进行比较
Comparable的典型实现
BigDecimal、BigInteger以及所有的数值类型对应的包装类型,按对应的数值大小进行比较
Character:按字符的Unicode值进行比较
Boolean:true对应的包装类实例大于false包装类对应的实例
String:按字符对应的Unicode值进行比较
Date、Time:后面的时间、日期比前面的时间、日期大
向TreeSet中添加一个元素,只有第一个不需要使用compareTo()方法,后面的都要调用该方法
因为只有相同类的两个实例才会比较大小,所以向TreeSet中添加的应该是同一个类的对象
对于TreeSet集合而言,它判断两个对象是否相等的唯一标准是两个对象通过compareTo方法的返回值相等
当需要把一个对象放入TreeSet中,重写对象对应的equals方法时候,应保证该方法与compareTo方法有一致的结果