集合泛型

本文详细介绍了Java集合框架中的泛型概念及其在ArrayList、LinkedList、HashSet、TreeSet等集合类中的应用。泛型提供了类型安全性,使得在编译阶段就能检测到类型错误,避免了运行时的强制类型转换。同时,文章还讨论了泛型类、泛型方法、泛型接口以及泛型通配符的使用,并给出了示例代码。此外,还涵盖了Map接口及其实现类HashMap、Hashtable、TreeMap和LinkedHashMap的特点和遍历方式。
摘要由CSDN通过智能技术生成

1.集合的概述

2.Collection

3.List

4.Vertor

5.Stack

6.ArrayList

7.LinkedList

8.Set

9.HashSet

10.TreeSet

11.泛型

12.Map

13.HashMap

14.Hashtable

15.TreeMap

16.LinkedHashMap

 

一、集合的概述

1.集合的概念

        集合有时候也称为容器,它可以将系列元素组合成一个单元,用于存储、提取、管理数据。

        集合是存储对象最常用的一种方式。

        集合可以存储任意类型的对象,而且长度可变。在程序中有可能无法预知先知道多少个对象,那么用数组来装对象的话,长度不好定义,而集合解决了这样的问题。

2.集合和数组的比较

        相同点:数组和集合类都是存储数据的容器

        不同点:

        1.存储内容不同

        数组既可以存放基本数据类型,也可以存放引用数据类型;集合只能存储引用数据类型,如果要存放基本数据类型,封装成包装类。

        数组只能存储定义的数据类型;集合可以存储多种的类型

        2.存储数量不同

        数组的长度是不可变的,一旦大小确定就无法增删;集合的长度是可变的,是一个可以伸缩的容器

        3.方法不同

        数组中只有Object中定义的方法以及一个length属性;集合中有太多太多的方法。

        集合类的特点:用于存储对象,长度是可变的,可以存储不同类型的对象

3.集合家族

        集合的的分类

        单列集合:每个元素都是一个单独的个体  value

        双列集合:每个操作都是针对一对数据进行操作,一对数据作为一个单位。Key--value

        单列集合的体系

        Collection:单列集合的顶层接口

             |--List:有序的子接口

                    |--ArrayList:数组、顺序存储

                    |--LinkedList:链表、链式存储

                    |--Vector:被Arraylist取代

             |--Set:无序的子接口

                    |--HashSet:哈希存储

                    |--TreeSet:二叉树存储

        双列集合的体系

            Map:双列集合的顶层接口

                     |--HashMap:哈希存储

                     |--TreeMap:二叉树存储

二、Collection

1.概述

        单列集合的顶层接口。接口不能创建对象,随便找个一个子类已实现的对象,调用接口的方法。

        学习Collection中的共性方法,多个容器在不断向上抽取就出现了该体系。发现Collection接口中具有容器具有的共性方法。查阅API时,就可以直接看该接口中的方法。并创建其子类对象对集合进行基本应用。当要使用集合对象中特有的方法,查看子类具体内容。

2.常用方法

boolean

add(E e) 

确保此集合包含指定的元素(可选操作)。

boolean

remove(Object o) 

从该集合中删除指定元素的单个实例(如果存在)(可选操作)。

void

clear() 

从此集合中删除所有元素(可选操作)。

boolean

isEmpty() 

如果此集合不包含元素,则返回 true 。

boolean

contains(Object o) 

如果此集合包含指定的元素,则返回 true 。

int

size() 

返回此集合中的元素数。

      代码示例

import java.util.ArrayList;
import java.util.Collection;
class Test1 {
	public static void main(String[] args) {
		Collection c = new ArrayList();

		//添加
		c.add(111);
		c.add("222");
		c.add("abc");
		c.add("zxc");
		System.out.println(c);//[111, 222, abc, zxc]

		//删除
		c.remove(111);
		System.out.println(c);//[222, abc, zxc]

		//元素个数
		System.out.println(c.size());//3

		//判断是否为空
		System.out.println(c.isEmpty());//false

		//判断是否包含该元素
		System.out.println(c.contains("zxc"));//true

		//清空所有元素
		System.out.println(c.clear());
		System.out.println(c.isEmpty());//true

	}
}

boolean

addAll(Collection<? extends E> c) 

将指定集合中的所有元素添加到此集合(可选操作)。

boolean

containsAll(Collection<?> c) 

如果此集合包含指定 集合中的所有元素,则返回true。

boolean

removeAll(Collection<?> c) 

删除指定集合中包含的所有此集合的元素(可选操作)。

boolean

retainAll(Collection<?> c) 

仅保留此集合中包含在指定集合中的元素(可选操作)。

      代码示例

import java.util.ArrayList;
import java.util.Collection;
class Test1 {
	public static void main(String[] args) {
		Collection c1 = new ArrayList();

		c1.add("123");
		c1.add("abc");
		c1.add(120);
		c1.add("aaa");
		c1.add("bbb");
		c1.add("ccc");
		System.out.println(c1);//[123, abc, 120, aaa, bbb, ccc]

		//将集合2中的元素全部添加到集合1中
		Collection c2 = new ArrayList();
		c2.add("111");
		c2.add("222");
		c2.add("333");
		c1.addAll(c2);
		System.out.println(c1);//[123, abc, 120, aaa, bbb, ccc, 111, 222, 333]

		//判断一个集合1是否包含集合3中的所有数据
		Collection c3 = new ArrayList();
		c3.add("123");
		c3.add("abc");
		System.out.println(c1.containsAll(c3));//true

		//删除集合1中包含集合3中的所有元素
		System.out.println(c1);//[123, abc, 120, aaa, bbb, ccc, 111, 222, 333]
		c1.removeAll(c3);
		System.out.println(c3);//[123, abc]
		System.out.println(c1);//[120, aaa, bbb, ccc, 111, 222, 333]
		
		//仅保留集合1中包含集合2中的元素
		System.out.println(c2);//[111, 222, 333]
		c1.retainAll(c2);
		System.out.println(c1);//[111, 222, 333]
		
	}
}

3.自定义类的对象在集合中的操作

      练习:定义一个Person类,完成在Collection中的增删改查操作。

import java.util.ArrayList;
import java.util.Collection;
class Test1 {
	public static void main(String[] args) {
		Collection c = new ArrayList();
		Person p1 = new Person(1,"小一",11);
		Person p2 = new Person(2,"小二",22);
		Person p3 = new Person(3,"小三",33);
	
		c.add(p1);
		c.add(p2);
		c.add(p3);
		System.out.println(c);//[id:1,name:小一,age:11, id:2,name:小二,age:22, id:3,name:小三,age:33]
	
		c.remove(p3);
		System.out.println(c);//[id:1,name:小一,age:11, id:2,name:小二,age:22]

		System.out.println(c.size());//2
		c.clear();
		System.out.println(c.size());//0

	}
}

class Person{
	private int id;
	private String name;
	private int age;
	public Person(){
	}
	public Person(int id, String name, int age) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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;
	}
	public String toString(){
		return "id:"+id+",name:"+name+",age:"+age;
	}
}

4.遍历

      (1)集合转成数组,然后再对数组进行遍历。

       代码示例

import java.util.ArrayList;
import java.util.Collection;
public class Test1 {
	public static void main(String[] args) {
		
		Collection c = new ArrayList();
		c.add(new Person("小一",11));
		c.add(new Person("小二",22));
		c.add(new Person("小三",33));
		c.add(new Person("小四",44));
		c.add(new Person("小五",55));

		Object[] obj = c.toArray();
		for(int i=0;i<obj.length;i++){
			Person p = (Person)obj[i];
			System.out.println(p);
		}

	}
}
class Person {
	private String name;
	private int age;
	
	public Person() {
		super();
	}

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

	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 "Person [name=" + name + ", age=" + age + "]";
	}		
}

     (2)使用迭代器

Iterator<E>

iterator() 

返回此集合中的元素的迭代器。

boolean

hasNext() 

如果迭代具有更多元素,则返回 true 。

E

next() 

返回迭代中的下一个元素。

     注:hasNext判断是否有下一个元素;next获取下一个元素,还会移动迭代器的位置。

    代码示例

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Test1 {
	public static void main(String[] args) {
		
		Collection c = new ArrayList();
		c.add(new Person("小一",11));
		c.add(new Person("小二",22));
		c.add(new Person("小三",33));
		c.add(new Person("小四",44));
		c.add(new Person("小五",55));

		Iterator iterator = c.iterator();//获取迭代器
		//System.out.println(iterator.hasNext());//true
		//System.out.println(iterator.next());//Person [name=小一, age=11]
		
		while(iterator.hasNext()){
			Person p = (Person)iterator.next();
			System.out.println(p);
		}
	}
}
class Person {
	private String name;
	private int age;
	
	public Person() {
		super();
	}

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

	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 "Person [name=" + name + ", age=" + age + "]";
	}		
}

      (3)高级for循环底层就是迭代器。

       代码示例

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Test1 {
	public static void main(String[] args) {
		
		Collection c = new ArrayList();
		c.add(new Person("小一",11));
		c.add(new Person("小二",22));
		c.add(new Person("小三",33));
		c.add(new Person("小四",44));
		c.add(new Person("小五",55));

		Object[] objs = c.toArray();
		for(Object obj : objs){
			Person p = (Person) obj;
			System.out.println(p);
		}
	}
}
class Person {
	private String name;
	private int age;
	
	public Person() {
		super();
	}

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

	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 "Person [name=" + name + ", age=" + age + "]";
	}		
}

5.Collections-扩展

static <T> void

fill(List<? super T> list, T obj) 

用指定的元素代替指定列表的所有元素。

static <T> int

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值