赞
踩
一、集合类
1. 概述
2. 集合类的框架
3. 参数化类型和泛型二、Collection 接口三、 集合 Collection 的方法
1. 第一类:针对单个元素的操作
2. 第二类:针对集合的操作(一次操作多个元素)三、集合元素的遍历
1. 第一种遍历方式: 将集合转化为数组
2. 第二种遍历方式: 通过迭代器遍历集合中的所有元素(集合专用)四、Iterator 接口 (迭代器)
1. 迭代器概述
2. Iterator 接口的抽象方法
3. 遍历的代码实现
4. 实现原理
5. 一个例题:遍历对象
6. 集合迭代中的转型五、增强for循环
1. 格式
2. 遍历数组
3. 遍历集合,存储自定义 Person 类型
//参数化类型//集合可以存储不同类型的对象ArrayList arrayList = new ArrayList<>();ArrayList a = new ArrayList<>();ArrayList b = new ArrayList<>();12345
只能存储对象,这只能作为区别,但并非集合的限制(存储基本数据类型我们有自动的装箱和拆箱机制)装箱: 可以直接将基本数据类型的值,赋值给其包装类的对象拆箱:可以直接把一个包装类对象,赋值给基本数据类型
ArrayList arrayList = new ArrayList<>();//java 自动装箱arrayList.add(1); //将基本数据类放入集合中1234
集合类的框架
Collecton:基本操作:增删改查List: 元素有序、元素可重复、有索引
ArrayList:顺序表、用数组实现、非线程安全
LinkedList:链表、双向链表实现、非线程安全
vetor:向量、数组实现、线程安全(很少用)Set: 元素无序、元素不可重复、没有索引
HashSet:哈希表实现
TreeSet: 红黑树实现
保证从语法层面,强制只能向一个集合中,放入一种具体类型的数据
Collection 层次结构中的根接口。Collection 表示一组对象,这些对象也称为 collection 的元素。
一些 collection 允许有重复的元素,而另一些则不允许。一些collection 是有序的,而另一些则是无序的。
JDK 不提供此接口的任何直接,实现:它提供更具体的子接口(如 Set 和 List)实现
Java中三种长度表现形式:数组.length 属性 返回值 int字符串.length() 方法,返回值 int集合.size() 方法, 返回值 int
集合对象中,已经覆盖了Object的toString方法,所以可以直接打印集合中的元素值
private static void function(){ //接口多态调用 Collection coll = new ArrayList(); coll.isEmpty(); coll.add("abc"); coll.add("money"); coll.add("itcast"); coll.add("itheima"); coll.add("money"); coll.add("123"); boolean b = coll.remove("money"); boolean b = coll.contains("itcast"); System.out.println(a.contains("lisi")); //返回fause coll.clear();}12345678910111213141516
public class CollectionDemo { public static void main(String[] args) { //创建第一个集合对象 Collection a = new ArrayList<>(); a.add("zs"); a.add("lisi"); a.add("wangwu"); //创建第二个集合对象 Collection b = new ArrayList<>(); b.add("zs"); b.add("lisi"); b.add("wangwu"); //boolean addAll(Collection c) //boolean result = a.addAll(b); //System.out.println(result); //b集合中的元素,复制了一份全部添加到a集合中 //System.out.println(a); //b集合本身没有任何变化 //System.out.println(b); //boolean removeAll(Collection c) // a.removeAll(b); // System.out.println(a); //boolean containsAll(Collection c) //System.out.println(a.containsAll(b)); //boolean retainAll(Collection c) System.out.println(a.retainAll(b)); System.out.println(a); System.out.println(b); //b集合没有任何变化 }}123456789101112131415161718192021222324252627282930313233343536
public class CollecitonDemo { public static void main(String[] args) { //第一步,得到一个集合对象 Collection a = new ArrayList(); Collection b = new ArrayList(); a.add("zs"); a.add("lisi"); a.add("wangwu"); a.add("zhaoliu"); //第一种遍历方式: 将集合转化为数组 Object[] objects = a.toArray(); for (int i = 0; i < objects.length; i++) { System.out.print(objects[i] + " "); } System.out.println(); }}1234567891011121314151617181920
Iterator 为什么不是定义成一个类,而是接口?
因为:功能上没什么问题,但是由于一旦把针对不同具体集合的生成迭代器的方法,放在一个类中,通常,各个不同的迭代器的方法,可能会有一些公共行为,被抽成一个方法。就会因为一些公共操作的存在,产生错综复杂的联系,形成 上帝类(God Class) 啥都管,很难维护
迭代器是一个接口,每一个具体的集合类都实现了 Iterator 接口,能够返回一个针对自己的存储结构的具体的 Iterator 接口的实现子类。
Iterator向上层的使用者,屏蔽了具体的底层集合类的实现细节,使用方法都一样
/*原理:Collection接口定义方法 Iterator iterator()ArrayList 重写方法 iterator(),返回了Iterator接口的实现类的对象使用 ArrayList 集合的对象Iterator it = array.iterator(),运行结果就是Iterator接口的实现类的对象it是接口的实现类对象,调用方法 hasNext 和 next 来实现集合元素迭代*/public class CollecitonDemo { public static void main(String[] args) { //第一步,得到一个集合对象 Collection a = new ArrayList(); Collection b = new ArrayList(); a.add("zs"); a.add("lisi"); a.add("wangwu"); a.add("zhaoliu"); //集合类专用的遍历方式 通过迭代器遍历集合中的所有元素 //调用集合的方法iterator()获取出 Iterator接口的实现类的对象 Iterator iterator = a.iterator(); //利用迭代器遍历 //迭代是反复内容,使用循环实现,循环的条件,集合中没元素, hasNext()返回了false //调用方法hasNext()判断集合中是否有元素 while(iterator.hasNext()) { //调用方法next()取出集合中的元素 System.out.println(iterator.next()); } //for循环迭代写法:// for (Iterator it2 = coll.iterator(); //it2.hasNext(); ) {// System.out.println(it2.next());// } //利用迭代器删除集合中的元素 //注意要执行,要把前面的注释掉,因为size已经在最后了 //迭代是反复内容,使用循环实现,循环的条件是集合中没元素, hasNext()返回了false while(iterator.hasNext()) { String s = iterator.next(); //if(1 == i) 和 if(i == 1) if("wangwu".equals(s)) { //从Collection中删除当前访问到的元素 iterator.remove(); } } System.out.println(a); Collection list = new LinkedList<>(); list.add("stu1"); list.add("stu2"); list.add("stu3"); list.add("stu4"); //利用迭代器,遍历LinkedList Iterator iterator1 = list.iterator(); while(iterator1.hasNext()) { System.out.println(iterator1.next()); } }}1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
4. 实现原理
/实现原理while(it.hasNext()) { System.out.println(it.next());}//cursor记录的索引值不等于集合的长度返回true,否则返回falsepublic boolean hasNext() { return cursor != size; //cursor初值为0}//next()方法作用://返回cursor指向的当前元素//cursor++public Object next() { int i = cursor; cursor = i + 1; return elementData[lastRet = i];}12345678910111213141516
public class Student { //成员属性 private String name; private int age; //构造方法 public Student(String name, int age) { this.name = name; this.age = age; } //get和set方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } //重写toString(),实现输出对象 @Override public String toString() { return "Student{" + "name='" + name + ''' + ", age=" + age + '}'; }}12345678910111213141516171819202122232425262728293031
public class IteratorExercise { public static void main(String[] args) { //初始化一个存放Student类对象的集合对象 Collection a = new ArrayList<>(); a.add(new Student("zs", 24)); a.add(new Student("lisi", 25)); a.add(new Student("wangwu", 26)); //System.out.println(a); //完成遍历 Iterator iterator = a.iterator(); while(iterator.hasNext()) { Student stu = iterator.next(); System.out.println(stu.getName() + " -- " + stu.getAge()); //以下做法是错误的,因为每调用一次next()方法 //cursor都会后移一位,就指向了下一个对象元素 //System.out.print(iterator.next().getName() + " -- " + iterator.next().getAge()); } }}123456789101112131415161718192021222324
//不指定存储的数据类,什么都存,就是 Object类型Collection coll = new ArrayList(); coll.add("abc");coll.add("aabbcc");coll.add("shitcast");//获取迭代器,也不能加<>Iterator it = coll.iterator();//由于元素被存放进集合后全部被提升为Object类型//当需要使用子类对象特有方法时,需要向下转型while (it.hasNext()) { String str = (String) it.next(); //获取的是Object类型 System.out.println(str.length());}//注意:如果集合中存放的是多个对象,这时进行向下转型会发生类型转换异常。123456789101112131415
//格式:for( 数据类型 变量名 : 数组或者集合 ){ System.out.println(变量);}1234
public static void function(){ int[] arr = {3,1,9,0}; for(int i : arr){ System.out.print(i+1+" "); } System.out.println(arr[0]); //输出 3 //输出:4 2 10 1 //遍历的时候,可以调用对象的方法 String[] str = {"abc","itcast","cn"}; for(String s : str){ System.out.println(s.length()); }}123456789101112131415
3. 遍历集合,存储自定义 Person 类型
public static void function(){ ArrayList array = new ArrayList(); array.add(new Person("a",20)); array.add(new Person("b",10)); for(Person p : array){ System.out.println(p);// System.out.println(p.toString()); }}
持续更新,点击关注一起成长!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。