一、数组和集合的区别与联系
package com.fish.collection; /* 数组: 存储同一种数据类型的集合容器. 数组的特点: 1. 只能存储同一种数据类型的数据。 2. 一旦初始化,长度固定。 3. 数组中的元素与元素之间的内存地址是连续的。 注意: Object类型的数组可以存储任意类型的数据。 需求: 收集班级同学的兴趣爱好。 数组存储兴趣爱好: String[] arr= new String[1000]; */ public class Demo1 { public static void main(String[] args) { Object[] arr = new Object[10]; arr[1] = "abc"; arr[2] = 'a'; arr[3] = 12; } }
二、集合方法
package com.fish.collection; import java.util.ArrayList; import java.util.Collection; /* 集合:集合是存储对象数据的集合容器。 集合比数组的优势: 1. 集合可以存储任意类型的对象数据,数组只能存储同一种数据类型的数据。 2. 集合的长度是会发生变化的,数组的长度是固定的。 -------| Collection 单例集合的跟接口。 ----------| List 如果是实现了List接口的集合类,具备的特点: 有序,可重复。 ----------| Set 如果是实现了Set接口的集合类,具备特点: 无序,不可重复。 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() */ public class Demo2 { public static void main(String[] args) { Collection c = new ArrayList(); c.add("张三"); c.add("李四"); c.add("王五"); System.out.println("添加成功吗?"+c.add("赵六")); //创建集合 Collection c2 = new ArrayList(); c2.add("张三"); c2.add("李四"); c2.add("王朝"); c.addAll(c2); // 把c2的元素的添加到c集合 中去。 [张三, 李四, 王五, 赵六, 张三, 李四, 王朝] /* 删除方法: c.clear(); //clear()清空集合中的元素 System.out.println("删除成功吗?"+c.remove("张三")); // remove 指定集合中的元素删除,删除成功返回true,删除失败返回false. c.removeAll(c2); //删除c集合中与c2的交集元素。c2集合不会发生变化 c.retainAll(c2); //保留c集合与c2的交集元素,其他的元素一并删除。c2集合不会发生变化 */ System.out.println("查看元素个数:"+c.size()); System.out.println("集合的元素:"+ c); } }
package com.fish.collection; import java.util.ArrayList; import java.util.Collection; /* 判断 isEmpty() contains(Object o) containsAll(Collection<?> c) */ class Person{ int id; String name; public Person(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "{编号:"+this.id+" 姓名:"+ this.name+"}"; } @Override public boolean equals(Object obj) { Person p = (Person)obj; return this.id == p.id ; } //java规范: 一般重写equlas方法我们都会重写hashCode方法的。 @Override public int hashCode() { return this.id; } } class Dog{ } public class Demo3 { public static void main(String[] args) { /*Collection c = new ArrayList(); c.add("张三"); c.add("李四"); c.add("王五"); System.out.println("判断集合是否为空元素:"+ c.isEmpty()); System.out.println("判断集合中是否存在指定的元素:"+ c.contains("赵六"));*/ //集合添加自定义的元素 Collection c = new ArrayList(); c.add(new Person(110,"狗娃")); c.add(new Person(119,"狗剩")); c.add(new Person(120,"铁蛋")); Collection c2 = new ArrayList(); c2.add(new Person(110,"狗娃")); c2.add(new Person(119,"狗剩")); c2.add(new Person(104,"陈狗剩")); System.out.println("c集合有包含c2集合中的所有元素吗?"+ c.containsAll(c2)); //调用的是传入对象的equal方法 //如果在现实生活中,只要***编号一致,那么就为同一个人。 System.out.println("存在该元素吗?"+c.contains(new Person(120,"陈铁蛋"))); // 其实contains方法内部是依赖于equals方法进行比较的。 System.out.println("集合的元素:"+ c); } }
package com.fish.collection; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; /* 迭代 toArray() 把集合中的元素全部 存储到一个Object的数组中返回。 */ public class Demo4 { public static void main(String[] args) { /*Collection c = new ArrayList(); c.add("张三"); c.add("李四"); c.add("王五"); Object[] arr = c.toArray(); //把集合中的元素全部 存储到一个Object的数组中返回。 System.out.println("数组的元素:"+Arrays.toString(arr));*/ 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); } } } }
package com.fish.collection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /* ------| Collection 单例集合的根接口 ----------| List 如果是实现了 List接口的集合类,该集合类具备 的特点: 有序、可重复。 ----------| Set 如果是实现了Set接口的集合类,该集合具备的特点: 无序,不可 重复。 Collection---迭代的方法: toArray() iterator() 迭代器的作用:就是用于抓取集合中的元素。 迭代器的方法: hasNext() 问是否有元素可遍历。如果有元素可以遍历,返回true,否则返回false 。 next() 获取元素... remove() 移除迭代器最后一次返回 的元素。 NoSuchElementException 没有元素的异常。 出现的原因: 没有元素可以被迭代了。。。 */ public class Demo5 { public static void main(String[] args) { Collection c = new ArrayList(); c.add("狗娃"); c.add("狗剩"); c.add("铁蛋"); c.add("美美"); /*//遍历集合的元素------>方式一: 可以使用toArray方法。 Object[] arr = c.toArray(); // toArray() 把集合 的元素存储到一个 Object的数组中 返回。 for(int i = 0 ; i<arr.length ; i++){ System.out.print(arr[i]+","); } //要求使用iterator迭代器遍历。 */ Iterator it = c.iterator(); //返回一个迭代器 疑问:iterator()方法返回的是一个接口类型,为什么接口又可以调用方法可以使用呢? iterator 实际 上返回的是iterator接口的实现类对象。 /* while(it.hasNext()){ // hasNext() 问是否有元素可以遍历。 System.out.println("元素:"+ it.next()); //获取元素 } */ /*it.next(); it.next(); it.remove(); //删除迭代器最后一次返回的元素。 */ //清空集合 的元素 while(it.hasNext()){ it.next(); it.remove(); } System.out.println("集合的元素:"+ c); } }
练习
package com.fish.collelction; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.Scanner; /* 作业2:使用集合实现注册登陆功能, 第一步: 提示用户选择功能, A(注册) B(登陆) 。 要求: 功能选择 的时候要忽略大小写。 注册: 1. 提示用户输入注册的账号(数字)与密码,如果输入账号已经存在集合中,提示用户重新输入。 注册完毕之后,把集合中的所有用户信息打印出来。(使用:toArrry()方法) 登陆: 提示用户输入登陆的账号与密码,如果账号与密码这个用户已经存在集合中,那么登陆成功,否则登陆失败。 */ //用户 class User{ int id; //账号 String password; //密码 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User(int id, String password) { this.id = id; this.password = password; } @Override public boolean equals(Object obj) { User user = (User)obj; return this.id==user.id; } @Override public String toString() { return "{ 账号:"+this.id+" 密码:"+this.password+"}"; } } public class Demo1 { static Scanner scanner = new Scanner(System.in); static Collection users = new ArrayList(); //使用该集合保存所有的用户信息.. public static void main(String[] args) { while(true){ System.out.println("请选择功能 A(注册 ) B(登陆)"); String option = scanner.next(); if("a".equalsIgnoreCase(option)){ reg(); }else if("b".equalsIgnoreCase(option)){ login(); }else{ System.out.println("你的选择有误,请重新输入"); } } } public static void login() { System.out.println("请输入账号:"); int id = scanner.nextInt(); System.out.println("请输入密码:"); String password = scanner.next(); //判断集合的用户是否存在该用户名与密码 //遍历集合的元素,查看是否存在该用户信息 boolean isLogin = false; //定义变量用于记录是否登陆成功的信息 , 默认是没有登陆成功的 Iterator it = users.iterator(); while(it.hasNext()){ User user = (User) it.next(); if(user.id==id&&user.password.equals(password)){ //存在该用户信息,登陆成功... isLogin = true; } } if(isLogin==true){ System.out.println("欢迎登陆..."); }else{ System.out.println("用户名或者密码错误,登陆失败..."); } } public static void reg() { //110 , 220 User user = null; while(true){ System.out.println("请输入账号:"); int id = scanner.nextInt(); //220 user = new User(id,null); if(users.contains(user)){ // contains底层依赖了equals方法。 //如果存在 System.out.println("该账号已经存在,请重新输入账号"); }else{ //不存在 break; } } System.out.println("请输入密码:"); String password = scanner.next(); user.setPassword(password); //把user对象保存到集合中 users.add(user); System.out.println("注册成功!"); System.out.println("当前注册的人员:"+users); } }
总结:
1、遍历一个容器判断元素释放满足某个条件的问题,一般都用标志位来解决
2、要回到前面的代码,要用到循环
3、每一个方法写一个功能,这样很清晰
package com.fish.collelction; interface Money{ public void makeMoney(); } class Worker implements Money{ @Override public void makeMoney() { System.out.println("工人在赚钱..."); } } class Student implements Money{ @Override public void makeMoney() { // TODO Auto-generated method stub } } public class Demo3 { public static void main(String[] args) { Money m = test(); m.makeMoney(); } public static Money test(){ #test方法的是一个接口,而不是一个具体的实现,这样的目的是为了后期维护方便 return new Worker(); } }
本文出自 “小鱼的博客” 博客,谢绝转载!