1.集合Collection:是指可以存储一组数据的数据结构,集合是一个接口,其定义了丰富的方法。
1.1List和Set:在实际的开发中,要将使用对象存储于特定的数据结构,java提供的容器为:集合。集合是一个接口,定义了集合的相关操作方法,其有两个子接口。:List和Set
比较两个子接口需要看看集合中的元素需不需要重复。
当集合中的元素可以重复时,使用List
元素是否可以重复,取决于equals比较的结果,因而要在类中重写equals方法
当集合中的元素不可以重复时,使用Set
1.2集合持有对象的饮用:集合中存储的都是引用类型元素,就是指集合中知道村对象的引用,而并非把元素对象本身存入在集合中,如图下:
:由上图得,集合中存储的对象的引用,即元素对象的地址
如下代码:
/*
* 集合持有对象的引用
*/
public void testRef(){
Collection<Cell>cells=new ArrayList<Cell>();
cells.add(new Cell(1,2));
Cell cell=new Cell(2,3);
cells.add(cell);
System.out.println(cell);
//输出结果:(2,3)
System.out.println(cells);
//输出结果:[(1,2), (2,3)]
cell.drop();
System.out.println(cells);
//输出结果:[1,2, 3,3]
}
有上述代码可知,当对象本身发生改变时,集合中因存储的是元素对象的引用,因此输出的集合也发生了改变
1.3add方法:指向集合中添加新元素,格式如下:
boolean add(E e):当向集合中添加元素成功时,返回true,否则返回false
代码如下:
/*
* 测试add方法
*/
@Test
public void testAdd(){
Collection<String> c=new ArrayList<String>();
c.add("a");
c.add("b");
c.add("c");
System.out.println(c);
//输出结果为:[a, b, c]
}
从输出结果可以知道,向集合c添加元素成功
1.4contains方法:判断给定的元素是否包含在集合中,若包含返回true,若不包含,返回false。格式如下:
boolean contains(Object o)
注意:集合中是否包含元素是根据每个元素的equals方法进行比较,因此要必须重写equals方法进行比较后的结果。代码如下
/*
* 测试contains方法
*/
@Test
public void testContains(){
Collection<Cell> c=new ArrayList<Cell>();
c.add(new Cell(1,2));
c.add(new Cell(1,3));
c.add(new Cell(2,2));
c.add(new Cell(2,3));
Cell cell=new Cell(1,3);
boolean blag=c.contains(cell);
System.out.println(blag);
//输出结果:true
}
由上述代码可以看出cell包含在集合中
1.5size、clear、isEmpty,
int size();该方法用于返回集合中元素的个数
void clear():该方法用于清空当前集合
boolean isEmpty():该方法用与判断集合是否不包含任何元素。若不包含任何元素,则返回true,否则false
代码如下:
/*
* 测试size、clear、isRmpty方法
*/
@Test
public void testSizeAndClearAndIsEmpty(){
Collection<String>c=new ArrayList<String>();
System.out.println(c.isEmpty());
//输出结果:true
c.add("java");
c.add("cpp");
c.add("php");
c.add("c#");
c.add("Object-c");
System.out.println("isEmpty:"+c.isEmpty()+" size:"+c.size());
//isEmpty:false size:5
c.clear();
System.out.println("isEmpty:"+c.isEmpty()+" size:"+c.size());
//isEmpty:true size:0
}
1.6 addAll和containsAll方法
addAll:是指对该方法传入一个集合,并将该集合中的所有元素添加到当期那集合中。格式如下:
boolean addAll(Collection< ? extends E> c):若给定集合由于调用而发生更改,则返回true
Boolean containsAll(Collection <>)
<pre name="code" class="java"> /*
* 用于测试addAll方法和containsAll方法
*/
@Test
public void testAddAllAndContainsAll(){
Collection<String>c1=new ArrayList<String>();
c1.add("java");
c1.add("cpp");
c1.add("php");
c1.add("c#");
c1.add("object-c");
System.out.println(c1);
//输出结果为:[java, cpp, php, c#, object-c]
Collection<String>c2=new HashSet<String>();
c2.addAll(c1);
System.out.println(c2);
//输出结果为:[c#, object-c, cpp, java, php]
Collection<String>c3=new ArrayList<String>();
c3.add("java");
c3.add("cpp");
System.out.println(c1.containsAll(c3));
//输出结果为:true
}
2.Iterator:迭代器,用于遍历集合中的所有元素。
2.1 hasNext、Next方法
迭代器定义方法:Iterator iterator()
迭代器Iterator是一个接口,迭代器在重写Collection的iterator方法,利用内部类提供了迭代器的实现
迭代器提供了同意遍历元素的集合方式,提供了遍历集合两个方法
boolean hasNext():判断集合中是否还有元素可以遍历
E next():返回迭代的下一个元素。代码如下:
/*
* 测试iterator的hasNext和Next方法
*/
@Test
public void testHasNextAndNext(){
Collection<String>c=new ArrayList<String>();
c.add("java");
c.add("cpp");
c.add("php");
c.add("c#");
c.add("object-c");
System.out.println(c);
//输出结果:[java, cpp, php, c#, object-c]
Iterator<String>it=c.iterator();
while(it.hasNext()){
String str=it.next();
System.out.print(str+" ");
//输出结果:java cpp php c# object-c
}
}
2.2 remove方法:使用迭代器遍历集合中时,不能通过集合的remove删除集合元素,否则会抛出异常,我们可以使用迭代器的remove方法,来删除next()迭代出的元素,如下代码:
<pre name="code" class="java">/*
* 测试Iterator的remove方法
*/
@Test
public void testRemove(){
Collection<String>c=new ArrayList<String>();
c.add("java");
c.add("cpp");
c.add("php");
c.add("c#");
c.add("object-c");
System.out.println(c);
//输出结果:[java, cpp, php, c#, object-c]
Iterator<String>it=c.iterator();
while(it.hasNext()){
String str=it.next();
if(str.indexOf("c")!=-1){
it.remove();
}
}
System.out.println(c);
//输出结果为:[java, php]
}
2.3增强型for循环:java5.0推出一个新的特性,称为增强for循环,也成为新循环,该循环不通用于传统循环工作,其只用于遍历集合或数组。
语法:for(元素类型 e:集合或数组){
循环体;
}
注意:新循环并非新的语法,而是在编译过程中,编译器会将新循环转换为迭代器模式,新循环的本质就是迭代器。代码如下:
/*
* 测试foreach方法
*/
@Test
public void testForeach(){
Collection<String>c=new ArrayList<String>();
c.add("java");
c.add("cpp");
c.add("php");
c.add("c#");
c.add("object-c");
System.out.println(c);
//输出结果:[java, cpp, php, c#, object-c]
for(String str:c){
System.out.print(str.toUpperCase()+" ");
}
//输出结果:JAVA CPP PHP C# OBJECT-C
}
3.泛型机制
泛型机制是java SE 5.0引入的特性,泛型的本质是参数化类型
在类、接口和方法中的定义过程中,所操作的类型被传入的参数指定。
java泛型机制广泛的运用于集合的框架中,所有的集合类型都带有泛型参数,这样就可以在创建集合中放入指定类型的元素。java编译器可以根据此进行类型检查。这样可以减少代码在运行时出现错误地可能性。