集合
为什么要引入集合?
数组:
①只能存储一种类型的数据
②一旦初始化,长度固定。
③元素之间地址连续。
集合: 存储对象数据的容器
优点: 长度会发生变化,对象数据类型任意
————-Collection 集合的根接口
—————————-Set 无序不可重复
—————————-List 有序可重复
Collection方法:
增加
add(E e) 添加成功返回true,添加 失败返回false.
addAll(Collection c) 把一个集合 的元素添加到另外一个集合中去。
删除
clear()
remove(Object o)
removeAll(Collection c) //删除交集元素
retainAll(Collection c) //保留交集元素
查看
size()
判断
isEmpty()
contains(Object o)
containsAll(Collection<?> c)
迭代
toArray()
iterator()
注意 这里判断两个元素是否相同都是用对象的equals方法。输出的时候自然是用对象的toString方法,所以要添加自定义类的时候要重写对象的equals方法,一般重写了equals方法,也要重写Hashcode()方法。
但是equals方法并不是里面应用equals方法,只是一个java的规范。
重点学习一下两个迭代方法!
1、toArray()方法,返回一个Object[] 数组
从中取出的变量值能用Object变量接受,如果要用到其他类型的属性,则需要进行类型强转。
举个例子:
Collection c = new ArrayList();
c.add(new Person(110,"狗娃"));
c.add(new Person(119,"狗剩"));
c.add(new Person(120,"铁蛋"));
Object[] arr = c.toArray();
//需求: 把编号是110的人信息 输出。
for(int i = 0 ; i<arr.length ; i++){
Person p = (Person) arr[i]; //从Object数组中取出的元素只能使用Object类型声明变量接收,如果需要其他 的类型需要进行强制类型转换。
if(p.id==110){
System.out.println(p);
}
然后练笔写了一个模仿登录的小程序- -
class User{
String name;
String password;
public User(String name , String password){
this.name = name;
this.password= password;
}
}
public class ccc {
public static void main(String[] args) {
Scanner s= new Scanner(System.in);
Collection c = new ArrayList();
while(true){
System.out.println("请选择功能");
System.out.println("A注册 B登录");
String msg=s.next();
if(msg.equalsIgnoreCase("A")){
System.out.println("注册账号!请输入账号和密码:");
String a = s.next();
String b = s.next();
c.add(new User(a,b));
System.out.println("注册成功!");
}
else if(msg.equalsIgnoreCase("B")){
System.out.println("用户登录!请输入账号和密码:");
String a = s.next();
String b = s.next();
Object[] objbuf= c.toArray();
for(int i= 0; i<objbuf.length; i++){
User u =(User)objbuf[i];
if(a.equals(u.name)&&b.equals(u.password)){
System.out.println("登录成功啦!!");
break;
}
if(i==objbuf.length-1)
System.out.println("用户名或者密码错误,请重试!");
}
}
else{
System.out.println("输入有误,请重新输入");
}
}
}
}
可以看出要迭代出容器中的所有元素很麻烦。。。要用Object数组接受,然后迭代数组再强转。。。
引出一个迭代方法!!!
2、 Iterator();迭代方法!!
Iterator()方法: 返回一个迭代器。是一个接口类型
迭代器: 用于抓取集合中的元素 , 获取迭代器的时候,迭代器中有一个指针指向容器中的第一个元素
Collection c = new ArrayList();
Iterator it = c.iterator();
看到迭代器只有3个方法。
hasNext就不说了吧。。。显而易见。。
每次用next();方法就会抓取一个元素,但是容器中的元素并不会减少,如果抓完了。再抓,就会抛出一个NoSuchElementException异常
每次用remove()方法,就会删除上一次用next返回的元素!!
public static void main(String[] args) {
Collection c = new ArrayList();
c.add("周锦岚");
c.add("骆溢");
c.add("大白痴");
Iterator it = c.iterator(); //获取迭代器
System.out.println(it.next()); //获取第一个元素
System.out.println(it.next()); //获取第二个元素
System.out.println(c); //打印所有元素 验证next()不删除,只是移动指针
System.out.println(it.next()); //获取第三个元素
it.remove(); // 删除上一次用next返回的元素
System.out.println(c); // 再次打印所有元素,验证remove()删除了上一次next返回的元素
System.out.println(it.next()); // 抓取到头了,抛出异常
}
结果
周锦岚
骆溢
[周锦岚, 骆溢, 大白痴]
大白痴
[周锦岚, 骆溢]
Exception in thread "main" java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(ArrayList.java:854)
at cn.qqq.main(qqq.java:20)