六 Java 集合框架 Collection接口 ArrayList Set Map

本文介绍了Java集合框架中的Collection接口,重点讲解了ArrayList的遍历与removeAll方法,泛型在集合中的应用,Set的特点及contains方法的工作原理。此外,还详细探讨了Map接口,特别是HashMap的遍历、修改以及containsKey和containsValue的使用。
摘要由CSDN通过智能技术生成

一 集合

Java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象。

对象存入集合都会变成Object类型,取出时需要类型转换。

Java集合框架体系结构

根接口 子接口特点接口的实现类
CollectionList 排列有序,可重复(序列)

ArrayList 数组序列

LinkedList

QueueLinkedList 链表
Set元素无序,不可重复HashSet 哈希集
Map 

以<Key,Value>两个对象为一个映射去存储数据,这样一个映射就是一个Entry类(键值对)的实例。

Entry类是Map的一个内部类。

HashMap 哈希表
其他的几个主要成员如下:
Comparable接口   
Comparator接口   
Collections工具类   

二 Collection接口

ArrayList

ArrayList底层是由数组实现的。

方法参数备注
addAllCollection的一个实例Arrays.asList(数组名),可以将数组转换为List

遍历ArrayList

1. 未指定list中存放什么数据类型

public List courseLit;

public void getListObject() {
		for(Object a:courseLit) {
        //一个元素要存入到集合中去的时候,它的类型是被忽略了的,即集合只拿它当Ojbect用;要先进行类型转换
			Course c=(Course)a;
			System.out.println(c.id+" "+c.name);
		}
	}

2. 指定了list中的数据类型

public List<Course> courseLit;
public void getListValue() {
		
		for(Course a:courseLit) {
			System.out.println(a.id+" "+a.name);
		}
	}

3. 通过迭代器遍历li's't

	/**
	 *  通过迭代器来遍历List;
	 * 在Collection接口中定义了iterator()方法, 通过这个方法可以返回一个当前集合对象的迭代器,
	 * 然后通过这个迭代器去遍历当前集合中的每一个元素 
	 * 迭代器Iterator也是接口
	 * hasNext() 如果还有元素,就返回一个真值;next()方法取得具体的某个元素
	 * 
	 */
	public void testIterator() {
		//通过集合的iterator()方法,取得迭代器的实例
		Iterator it=courseLit.iterator();
	
		while(it.hasNext()) {
			Course c=(Course) it.next();
			System.out.println(c.id+" "+c.name);
		}
		
	}

removeAll

Course c[]= {courseLit.get(3),courseLit.get(4)};
courseLit.removeAll(Arrays.asList(c));

泛型

集合中的元素,可以是任意类型的对象(对象的引用),如果把某个对象放入集合,则会忽略它的类型,而把他当作Object处理,取出的时候,也是当作一个Object取出。

泛型规定了某个集合只能存放特定类型的对象,并且会在编译期间进行类型检查

  •  泛型集合中,可以存入泛型类型的对象实例以及泛型的子类型的对象实例。
  • 泛型集合中的限定类型不能使用基本数据类型
  • 可以通过使用包装类限定允许存入的基本数据类型

Set

Set中,添加某个对象,无论添加多少次,最终只会保留一个该对象(的引用),并且保留的是第一次添加的那一个。

contains方法

判断是否包含某个元素。

  • 当调用List的contains方法的时候,其实就相当于遍历list中的每一个元素,然后调用每个元素的equals(Object obj)方法,去跟contains方法中的参数进行比较,如果有一个元素的equals方法返回true值,则contains方法返回true值。
  • Object的hashCode()方法返回的是对象的哈希码的值,当调用HashSet类的contains方法的时候,先调用每一个元素的hashCode()方法来返回哈希码,如果哈希码的值相等的情况下,再调用equals(obj)方法去判断是否相等;只有这两个方法所返回的值都相等的情况下,才认为这个HashSet包含某个元素。
  • Eclipse可以自动生成equals()和hashCode()方法

重写equals方法

@Override
	public boolean equals(Object obj) {
		if (this == obj)// 同一个对象
			return true;
		if (obj == null)
			return false;
		if (!(obj instanceof Course))
			return false;
		Course course = (Course) obj;
		if (this.name == null) {
			if (course.name == null)
				return true;
			return false;
		}
		if (this.name.equals(course.name))
			return true;
		return false;
	}

//Eclipse自动生成的equals方法
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Course other = (Course) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (!(obj instanceof Course))
			return false;
		Course other = (Course) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

indexOf方法

取得某元素的索引位置(List)。

indexOf的实现机制:与contains方法类似,从序列的第0个位置开始,依次循环,调用每个元素的equals()方法, 去和参数对象进行比较,如果某个元素的equals方法返回值为true,则把该元素的索引位置作为结果返回。假如序列中有多个重复的元素,只返回该元素第一次出现时所在的位置。找不到时返回-1。

三 Map

Map提供了一种映射关系,其中的元素是以键值对(key-value)的形式存储的,能够根据key快速查找value.

  • Key和Value可以是任意类型的对象
  • Map中的键值对以Entry类型的对象实例形式存在

HashMap类

  • 基于哈希表实现
  • HashMap中的Entry对象是无序排列的
  • Key值和Value值均可为null,但一个HashMap只能有一个key值为null的映射(key值不可重复)

遍历Map

通过entrySet方法遍历

public Map<String,Student> students;

public void disStuEntry() {
		System.out.println("目前学生有:");
		Set<Entry<String, Student>> s=students.entrySet();//Entry也有泛型
		for (Entry<String, Student> entry : s) {
			System.out.println(entry.getKey()+" "+entry.getValue().name);
			
		}
	}

通过keySet遍历

public void getStu() {
		Set<String> st=students.keySet();//返回键的集合
		System.out.println("添加的学生如下:");
		for (String string : st) {
			System.out.println(students.get(string).name);
			
		}
	}

修改Map

用put方法修改Map中的已有映射

练习代码: https://www.imooc.com/article/309956

containsKey()判断是否包含某个key值
containsValue() 
  

 

containsKey

public Map<String, Student> students = new HashMap<String, Student>();
System.out.println(t.students.containsKey("1")); //比较的是key的值

containsValue

Value比较的是用equals()方法,如果只是想比较值相等,需要重写equals方法。

	public void testContains() {
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入要查询的姓名:");
		String name=sc.next();
		if(students.containsValue(new Student(null,name)))
//students的value是个Student类型,所以需要new一个Student对象;判断是否存在一个学生姓名为name的学生对象
			System.out.println("yese");
		else
			System.out.println("no");
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值