学习日志——2019/08/06

本文深入解析Java集合框架,包括Collection接口、List、Set、HashMap等核心类的特性与使用方法,探讨ArrayList、LinkedList的实现原理及HashSet、TreeSet的排序机制。

集合类

java.util包中提供了一些集合类,这些集合类称为容器。

集合类与数组的不同之处是数组长度是固定的,集合类的长度是可变的。

数组用来存放基本类型的数据,集合用来存放对象的引用。

在这里插入图片描述

Collection接口

在这里插入图片描述

构成Collection的单位称为元素

Collection接口通常不能直接使用,但该接口提供添加元素、删除元素、管理数据的方法

体系结构:

  •  	怎么学习?最顶层开始学习,因为最顶层包含了所有的共性
    
  •  	怎么使用?使用最底层,因为最底层就是具体的实现
    
package e5;

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

public class Muster {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Collection<String> list=new ArrayList<String>();	//实例化集合类对象
		//向集合添加元素
		list.add("a");		
		list.add("b");
		list.add("c");
		Iterator<String> it=list.iterator();//创建迭代器
		while(it.hasNext()) {		//判断是否有下一个元素
			String str=(String)it.next();
			System.out.println(str);
		}
	}

}

在这里插入图片描述

Iterator的next方法返回的是Object

List 集合

  • List接口

  • 重要方法
    get(int index):获得指定索引位置的元素

    set(int index,Object obj):将集合中指定索引位置的对象修改为指定的对象
    
  • 通过ArrayList 、LinkedList类实例化List集合,代码如下:

List<E> list=new ArrayList<E>();
List<E> list2=new LinkedList<E>();
package e5;

import java.util.ArrayList;
import java.util.List;

public class Gather {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List<String > list=new ArrayList<String>();
		list.add("a");
		list.add("b");
		list.add("c");
		int i=(int)(Math.random()*list.size());		//获得0~2之间的随机数
		System.out.println("随机获取数组中的元素:"+list.get(i));
		list.remove(2);
		System.out.println("将索引是2的元素从数组移除后,数组中的元素是:");
		for(int j=0;j<list.size();j++) {
		System.out.println(list.get(j));	
		}
	}

}

在这里插入图片描述

ArrayList类实现了可变数组,允许保存所有元素,包括null,并可以根据索引位置对集合进行快速的访问。

LinkedList类采用链表保存对象

与数组相同,集合的索引也是从0开始

Set集合

set 的构造有一个约束条件,传入的Collection对象不能有重复值,必须小心操作可变对象(Mutable Object ).
set接口常用的实现类

HashSet类实现Set接口,有哈希表支持。它不保证Set的迭代顺序,特别是它不保证该顺序是恒久不变的,此类允许使用null元素。
TreeSet类不仅实现了Set接口,还实现了java。util.SortedSet接口;Set集合在遍历 集合时按照自然顺序递增排序。
public class HashSetDemo2 {
	public static void main(String[] args) {
		//创建集合对象
		HashSet<Student> hs = new HashSet<Student>();
		//创建元素对象
		Student s = new Student("zhangsan",18);
		Student s2 = new Student("lisi",19);
		Student s3 = new Student("lisi",19);
//添加元素对象
		hs.add(s);
		hs.add(s2);
		hs.add(s3);
		//遍历集合对象
		for (Student student : hs) {
			System.out.println(student);
		}
		 
	}
		 
}

 package com.itheima_01;

import java.util.HashSet;

/*
 *	使用HashSet存储自定义对象并遍历 	
 *	通过查看源码发现:
 *				HashSet的add()方法,首先会使用当前集合中的每一个元素和新添加的元素进行hash值比较,
 *				如果hash值不一样,则直接添加新的元素
 *				如果hash值一样,比较地址值或者使用equals方法进行比较
 *				比较结果一样,则认为是重复不添加
 *				所有的比较结果都不一样则添加

 */
public class HashSetDemo2 {
	public static void main(String[] args) {
		//创建集合对象
		HashSet<Student> hs = new HashSet<Student>();
		//创建元素对象
		Student s = new Student("zhangsan",18);
		Student s2 = new Student("lisi",19);
		Student s3 = new Student("lisi",19);
		//添加元素对象
		hs.add(s);
		hs.add(s2);
		hs.add(s3);
		//遍历集合对象
		for (Student student : hs) {
			System.out.println(student);
		}
		 
	}
		 
}

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

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

	@Override
	public boolean equals(Object obj) {
		//System.out.println("-------------------");
		Student s = (Student)obj;//向下转型,可以获取子类特有成员
		
		//比较年龄是否相等,如果不等则返回false
		if(this.age != s.age) {
			return false;
		}
	
		//比较姓名是否相等,如果不等则返回false
		if(!this.name.equals(s.name)) {
			return false;
		}
		
		//默认返回true,说明两个学生是相等的
		return true;
	}
	
	@Override
	public int hashCode() {
		return 1;
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值