黑马程序员--java基础之类集框架(一)
Collection--集合框架的父类接口
List--元素是有序的,可以重复,因为给体系有索引;特有方法:凡是可以操作角标的方法都是List特有的
ArrayList:底层使用的是数组结构。特点:查询速度快,增加删除慢,线程不同步,默认长度是10,超过10后新建一个长度为5的ArrayList
存储自定义的元素时需要复写equals方法;
LinkedList:底层使用的是链表结构。特点:查询速度慢,增加删除快,线程不同步。有特有的方法,带first和last的方法
Vector: 在1.0版本前使用的存储容器,在1.2以后几乎被ArrayList替代,该容器是线程同步的,效率不高。
特有方法:带element;有自己的迭代器Enumeration(相当于Iterator)称为枚举
Set--元素无序,但不可以重复
hashSet:数据结构式哈希表,线程是非同步的;
TreeSet:底层使用的是二叉树结构,可以对Set中的元素进行排序;compareTo方法return 1 ,0 ,-1;
有两种排序方式:一:在自定义类中实现Comperable接口并复写其中的comparTo方法;用的是默认的排序方式
二:重新定义一个比较器实现Comparator接口并复写其中的compare方法,定义需要的比较方式;
练习一:增删改查
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
class CollectionTest{ public static void main( String [] args){ ArrayList al = new ArrayList(); //集合的增删改查操作。 al.add( "java01" ); //1、add方法的参数类型是Object,以便接收任意类型对象 al.add( "java02" ); //2、集合里面存放的都是对象的引用地址 al.add( "java03" ); al.add( "java04" ); ArrayList al1 = new ArrayList(); al1.add( "java07" ); al1.add( "java08" ); al1.add( "java05" ); al1.add( "java06" ); sop(al); sop(al.size()); //al.retainAll(al1);取俩个集合中的交集,al中保留交集部分 sop(al); sop(al1); al.remove( "java02" ); //al.clear(); sop(al.contains( "java03" )); //判断是否包含该对象 sop(al.isEmpty()); //判断该集合是否为空 Iterator it = al.iterator();迭代器,取元素 while (it.hasNext()){ sop(it.next()); } for (Iterator it = al.iterator(); it.hasNext(); ){ sop(it.next()); } } public static void sop( Object obj){ System.out.println(obj); } } |
练习二:模拟一个队列或堆栈数据结构
提示:利用LinkedList中特有的方法addFirst()和removeFirst()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
class DuiLie{ private LinkedList link; DuiLie(){ link = new LinkedList(); } public void myAdd( Object obj){ link.addFirst(obj); } public Object myGet(){ return link.removeLast(); } public boolean myIsEmpty(){ return link.isEmpty(); } } class CollectionTest{ public static void main( String [] args){ DuiLie c = new DuiLie(); c.myAdd( "java01" ); c.myAdd( "java02" ); c.myAdd( "java03" ); c.myAdd( "java04" ); System.out.println(c); while (!c.myIsEmpty()){ System.out.println(c.myGet()); } } } |
练习三:将一个数组的重复元素删除
提示:1、需要新建一个列表存储删除后的数组
2、用迭代器遍历元素,取出元素后判断新数组中是否还有该元素(用contains()方法),如果没有,添加
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
class CollectionTest{ public static ArrayList delElement(ArrayList al){ ArrayList al1 = new ArrayList(); Iterator it = al.iterator(); while (it.hasNext()){ Object obj = it.next(); if (!al1.contains(obj)) al1.add(obj); } return al1; } public static void main( String [] args){ ArrayList al = new ArrayList(); al.add( "java01" ); al.add( "java01" ); al.add( "java03" ); al.add( "java05" ); al.add( "java03" ); al.add( "java02" ); System.out.println(al); System.out.println(delElement(al)); } } |
练习四:练习二的升级版,要求删除列表中重复的对象而非数组
提示:1、新建一个类1,定义属性。
注意:需要重新写equals方法,因为contains方法会自动调取Object类中的equals,此equals判断的是引用地址。
方法中先判断是否obj instanceof 类1,不是的话直接抛出false,是的话将obj向下转型成类1;
然后return this.name.equals(p.name) && this.age == p.age;
2、再建一个类2,此类中定义删除重复元素的方法,和练习二相同
3、主函数用iterator取元素时,it。next()是引用的地址值,需要向下转型后调用具体的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
class Person{ private String name; private int age; Person( String name, int age){ this .name = name; this .age = age; } public boolean equals( Object obj){ if (!(obj instanceof Person)) return false ; Person p = (Person)obj; return this .name.equals(p.name) && this .age == p.age; } public String getName(){ return name; } public int getAge(){ return age; } } class CollectionTest{ public static ArrayList delElement(ArrayList al){ ArrayList al1 = new ArrayList(); Iterator it = al.iterator(); while (it.hasNext()){ Object obj = it.next(); if (!al1.contains(obj)) al1.add(obj); } return al1; } public static void main( String [] args){ ArrayList al = new ArrayList(); al.add( new Person( "zhangsan01" , 21 )); al.add( new Person( "zhangsan01" , 21 )); al.add( new Person( "zhangsan02" , 22 )); al.add( new Person( "zhangsan03" , 23 )); al.add( new Person( "zhangsan03" , 23 )); al.add( new Person( "zhangsan04" , 24 )); ArrayList al1 = delElement(al); Iterator it = al1.iterator(); while (it.hasNext()){ Person p = (Person)it.next(); System.out.println(p.getName()+ "......" + p.getAge()); } } } |