Java 集合框架(上)——Collection集合

目录

 

前言:

Java 集合框架

一、Collection接口概述:

二、Collection的功能概述:(成员方法)


前言:

学习来源网络,加上自己理解整理的知识,方法日后查看。

Java 集合框架

Java 2 中之前,Java 就提供了特设类。比如:Dictionary, Vector, Stack, 和 Properties 这些类用来存储和操作对象组。

虽然这些类都非常有用,但是它们缺少一个核心的,统一的主题。由于这个原因,使用 Vector 类的方式和使用 Properties 类的方式有着很大不同。

集合框架被设计成要满足以下几个目标。

  • 该框架必须是高性能的。基本集合(动态数组,链表,树,哈希表)的实现也必须是高效的。

  • 该框架允许不同类型的集合,以类似的方式工作,具有高度的互操作性。

  • 对一个集合的扩展和适应必须是简单的。

为此,整个集合框架就围绕一组标准接口而设计。你可以直接使用这些接口的标准实现,诸如: LinkedListHashSet, 和 TreeSet 等,除此之外你也可以通过这些接口实现自己的集合。

看了上面似懂非懂,再解释一下:

 集合的由来:
          我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我们就必须把这多个对象进行存储。而要想存储多个对象,就不能是一个基本的变量,而应该是一个容器类型的变量,在我们目前所学过的知识里面,有哪些是容器类型的呢?数组和StringBuffer。但是StringBuffer的结果是一个字符串,不一定满足我们的要求,所以我们只能选择数组,这就是对象数组。 而对象数组又不能适应变化的需求,因为数组的长度是固定的,这个时候,为了适应变化的需求,Java就提供了集合类供我们使用。
 
数组和集合的区别?
        A:长度区别
             数组的长度固定
             集合长度可变

         B:内容不同
              数组存储的是同一种类型的元素
              而集合可以存储不同类型的元素
          C:元素的数据类型问题    
              数组可以存储基本数据类型,也可以存储引用数据类型
              集合只能存储引用类型
  
刚说过集合是存储多个元的,但是呢,存储多个元素我们也是有不同需求的:比如说,我要这多个元素中不能有相同的元素,
再比如说,我要这多个元素按照某种规则排序一下。针对不同的需求,Java就提供了不同的集合类,这样呢,Java就提供了很多个集合类。这多个集合类的数据结构不同,结构不同不重要的,重要的是你要能够存储东西,并且还要能够使用这些东西,比如说判断,获取等。既然这样,那么,这多个集合类是有共性的内容的,我们把这些集合类的共性内容不断的向上提取,最终就能形成集合的继承体系结构。

一、Collection接口概述:

Collection 层次结构中 的根接口。 Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些 collection 是有序的,而另一些则是无序的。

二、Collection的功能概述:(成员方法)

1:添加功能
         boolean add(Object obj):添加一个元素
         boolean addAll(Collection c):添加一个集合的元素
2:  删除功能
        void clear():移除所有元素
          boolean remove(Object o):移除一个元素
          boolean removeAll(Collection c):移除一个集合的元素(是一个还是所有)
  3:  判断功能
          boolean contains(Object o):判断集合中是否包含指定的元素
          boolean containsAll(Collection c):判断集合中是否包含指定的集合元素(是一个还是所有)
          boolean isEmpty():判断集合是否为空
  4: 获取功能
          Iterator<E> iterator()(重点)
  5: 长度功能
          int size():元素的个数
          面试题:数组有没有length()方法呢?字符串有没有length()方法呢?集合有没有length()方法呢?
  6: 交集功能
          boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?
  7:把集合转换为数组
          Object[] toArray()

查看API如下:

  • Collection集合的基本功能测试代码演示如下:(从上到下按顺序测试)
  1. boolean add(E e)
  2. boolean remove(Object o)
  3. void clear()
  4. boolean contains(Object o)
  5. boolean isEmpty()
  6. int size()
package cn.wen;

import java.util.ArrayList;
import java.util.Collection;

public class CollectionDome1 {
	public static void main(String[] args) {
		// 测试不带All的方法
		
		//创建集合对象
		//Collection c = new Collection();	//错误,因为接口不能实例化
		Collection c = new ArrayList();
		
		//1、boolean add(Object obj):添加一个元素
		//System.out.println("add:"+c.add("hello"));	//调用ArrayList里的add方法
		//修改如下
		c.add("hello");
		c.add("world");
		c.add("Java");
		
		//2、 void clear():移除所有元素
		//c.clear();
		
		//3、 boolean remove(Object o):移除一个元素
		// System.out.println("remove:" + c.remove("hello"));
		// System.out.println("remove:" + c.remove("javaee"));
		
		//4、 boolean contains(Object o):判断集合中是否包含指定的元素
		//System.out.println("contains:"+c.contains("hello"));
		// System.out.println("contains:"+c.contains("android"));
		
		//5、 boolean isEmpty():判断集合是否为空
		// System.out.println("isEmpty:"+c.isEmpty());
		
		//6、int size():元素的个数
		System.out.println("size:"+c.size());
		
		System.out.println("c:" + c);
	}
}
  • Collection集合的高级功能测试,代码演示如下:
  1. boolean addAll(Collection c)
  2. boolean removeAll(Collection c)
  3. boolean containsAll(Collection c)
  4. boolean retainAll(Collection c)
package cn.wen;

import java.util.ArrayList;
import java.util.Collection;

public class CollectionDome2 {
	public static void main(String[] args) {
		//创建集合1
		Collection c1 = new ArrayList();
		c1.add("a");
		c1.add("b");
		c1.add("c1");
		c1.add("d1");
		
		//创建集合2
		Collection c2 = new ArrayList();
		c2.add("a1");
		c2.add("b1");
		c2.add("c1");
		c2.add("d1");
		
		//1. boolean addAll(Collection c):添加一个集合的元素(重复元素也添加)
		//System.out.println("addAll:" + c1.addAll(c2)); 
		
		//2. boolean removeAll(Collection c):移除一个集合的元素(移除交集)
		//只要有一个元素被移除了,就返回true。
		//System.out.println("removeAll:"+c1.removeAll(c2));

		//3. boolean containsAll(Collection c):判断集合中是否包含指定的集合元素
		//只有包含所有的元素,才叫包含(可以理解为子集)
		//System.out.println("containsAll:"+c1.containsAll(c2));
				
		//4. boolean retainAll(Collection c):两个集合都有的元素?思考元素去哪了,返回的boolean又是什么意思呢?
		//假设有两个集合A,B。
		//A对B做交集,最终的结果保存在A中,B不变。(保存交集)
		//返回值表示的是A是否发生过改变。
		System.out.println("retainAll:"+c1.retainAll(c2));
		
		System.out.println("c1:" + c1);
		System.out.println("c2:" + c2);
	}
		
}
  • Object[] toArray()把集合转成数组,可以实现集合的遍历(集合遍历)

代码测试过程如下:

package cn.wen;

import java.util.ArrayList;
import java.util.Collection;

public class CollectionDome3 {
	public static void main(String[] args) {
		// 创建集合对象
		Collection c = new ArrayList();
		
		// 添加元素
		c.add("hello");    // Object obj = "hello"; 向上转型
		c.add("world");
		c.add("java");
		
		//遍历
		// Object[] toArray():把集合转成数组,可以实现集合的遍历
		Object[] objs = c.toArray();
		for (int x = 0; x < objs.length; x++) {
			//System.out.println(objs[x]);
			// 知道元素是字符串,在获取到元素的的同时,还想知道元素的长度。
			// System.out.println(objs[x] + "---" + objs[x].length());	//这里出错
			// 上面的实现不了,原因是Object中没有length()方法
			// 如果要想使用字符串的方法,就必须把元素还原成字符串
			
			// 向下转型
			String s = (String) objs[x];
			System.out.println(s + "-----" + s.length());	
		}
	}
}


 练习:用集合存储5个学生对象,并把学生对象进行遍历。
  

 分析:
 A:创建学生类
 B:创建集合对象
 C:创建学生对象
 D:把学生添加到集合
 E:把集合转成数组
 F:遍历数组

代码如下:

学生类:

package cn.wen;

public class Student {
	// 成员变量
	private String name;
	private int age;

	// 构造方法
	public Student() {
		super();
	}

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	// 成员方法
	// getXxx()/setXxx()
	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;
	}
}

测试类:

package cn.wen;

import java.util.ArrayList;
import java.util.Collection;

public class StudentDemo {
	public static void main(String[] args) {
		// 创建集合对象
		Collection c = new ArrayList();
		
		// 创建学习对象
		Student s1 = new Student("小明", 18);
		Student s2 = new Student("小东", 19);
		Student s3 = new Student("张三", 20);
		Student s4 = new Student("李四", 22);
		Student s5 = new Student("老王", 40);
		
		// 把学生添加到集合中
		c.add(s1);
		c.add(s2);
		c.add(s3);
		c.add(s4);
		c.add(s5);
		
		// 把集合转成数组
		Object[] objs = c.toArray();
		//遍历数组
		for (int x = 0; x < objs.length; x++) {
			 //System.out.println(objs[x]);	//输出地址
			
			Student s = (Student) objs[x];	//向下转型
			System.out.println(s.getName() + "-----" + s.getAge());
		}
		
	}
}
  • Iterator iterator()迭代器,集合的专用遍历方式

          1、Object next():  获取元素,并移动到下一个位置。

                    NoSuchElementException:没有这样的元素,因为你已经找到最后了。
          2、boolean hasNext():  如果仍有元素可以迭代,则返回 true。 

package cn.wen;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class IteratorDemo {
	public static void main(String[] args) {
		// 创建集合对象
		Collection c = new ArrayList();

		// 创建并添加元素
		// String s = "hello";
		// c.add(s);
		c.add("hello");
		c.add("world");
		c.add("java");

		// Iterator iterator():迭代器,集合的专用遍历方式
		Iterator it = c.iterator(); // 实际返回的肯定是子类对象,这里是多态

		// Object obj = it.next();
		// System.out.println(obj);
		// System.out.println(it.next());
		// System.out.println(it.next());
		// System.out.println(it.next());
		// System.out.println(it.next());
		// 最后一个不应该写,所以,应该在每次获取前,如果有一个判断就好
		// 判断是否有下一个元素,有就获取,没有就不搭理它

		// if (it.hasNext()) {
		// System.out.println(it.next());
		// }
		// if (it.hasNext()) {
		// System.out.println(it.next());
		// }
		// if (it.hasNext()) {
		// System.out.println(it.next());
		// }
		// if (it.hasNext()) {
		// System.out.println(it.next());
		// }
		// if (it.hasNext()) {
		// System.out.println(it.next());
		// }

		// 最终版代码
		while (it.hasNext()) {
			// System.out.println(it.next());
			String s = (String) it.next();
			System.out.println(s);
		}
	}
}

 练习:用集合存储5个学生对象,并把学生对象进行遍历。
  

 分析:
 A:创建学生类
 B:创建集合对象
 C:创建学生对象
 D:把学生添加到集合
 E:把集合转成数组
 F:遍历数组

学生类:

package cn.wen;

public class Student {
	// 成员变量
	private String name;
	private int age;

	// 构造方法
	public Student() {
		super();
	}

	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	// 成员方法
	// getXxx()/setXxx()
	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;
	}

	@Override
    //方法重写
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
}

测试类:

package cn.wen;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/*
 * 问题1:能用while循环写这个程序,我能不能用for循环呢?
 * 问题2:不要多次使用it.next()方法,因为每次使用都是访问一个对象。
 */
public class IteratorTest2 {
	public static void main(String[] args) {
		// 创建集合对象
		Collection c = new ArrayList();

		// 创建学生对象
		Student s1 = new Student("小明", 27);
		Student s2 = new Student("小东", 30);
		Student s3 = new Student("小亮", 33);
		Student s4 = new Student("小王", 25);
		Student s5 = new Student("小红", 22);

		// 把学生添加到集合中
		c.add(s1);
		c.add(s2);
		c.add(s3);
		c.add(s4);
		c.add(s5);

		// 遍历
		Iterator it = c.iterator();
		while (it.hasNext()) {
			Student s = (Student) it.next();
			System.out.println(s.getName() + "---" + s.getAge());

			// NoSuchElementException :不要多次使用it.next()方法(注意)
			// System.out.println(((Student) it.next()).getName() + "---"
			// + ((Student) it.next()).getAge());

		}
		// System.out.println("----------------------------------");

		// for循环改写
		// for(Iterator it = c.iterator();it.hasNext();) {
		// Student s = (Student) it.next();
		// System.out.println(s.getName() + "---" + s.getAge());
		// }
	}
}
发布了91 篇原创文章 · 获赞 16 · 访问量 1176

猜你喜欢

转载自blog.csdn.net/hewenqing1/article/details/103854431