集合框架简述(只是自己的一些认识)

集合框架包含的内容

在这里插入图片描述
java集合框架提供了一套性能优良、使用方便的接口和类,使用之前需要导包:java.util

Collection接口存储一组不唯一,无序的对象
List接口存储一组不唯一,有序(插入顺序)的对象
Set接口存储一组唯一,无序的对象
Map接口存储一组键值对象,提供key到value的映射

List接口的实现类

List
-----ArrayList
-----LinkedList
ArrayList实现了长度可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高(因为有下标)
LinkedList采用链表存储方式,插入、删除元素时效率比较高

ArrayList集合类

当我们有一个需求,元素的个数不确定,还需要遍历元素,存储的不再是单一的基本数据类型的时候,数组就显得软弱无力了,数组扩容就很麻烦了,更别说存储对象了。这时候就需要用到集合类

-----ArrayList类是List接口的一个具体实现类
-----ArrayList对象实现了可变大小的数组
-----随机访问和遍历元素时,可以提供更好的性能

ArrayList的常用方法
在这里插入图片描述
除此之外,Collection接口常用通用方法还有:clear(),isEmpty(),iterator(),toArray()。

LinkedList集合类

-----LinkedList类是List接口的一个具体实现类
-----LinkedList类用于创建链表数据结构(链表是一种通过元素节点逻辑关系排列起来的一种数据结构)
-----插入或者删除元素时,它提供更好的性能

LinkedList常用方法
在这里插入图片描述

Set接口

Set接口存储一组唯一,无序的对象
HashSet是Set接口常用的实现类
S特种存放对象的引用(存放的并不是对象本身,而是一个指向对象的内存地址)

Set set=new HashSet();
String s1=new String("java");
String s2=s1;
String s3=new String("JAVA");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());

HashSet类

HashSet是Set接口常用的实现类

HashSet的存储原理
1 如果HashSet中数组没有分配内存空间, 给数组分配内存空间。
2 获得向HashSet中添加的元素的哈希码,根据元素的hashcode方法获得哈希码。在经过一系列的算法,计算出该元素存储在HashSet的位置。
3 HashSet中查找该位置上是否有元素,如果该位置上没有元素,则此元素就看可以放到该位置上。
4 如果HashSet上的该位置有元素,比较两个元素的哈希码,如果两个元素的哈希码不同,则该元素就
存储到该位置的链表上。(在JDK1.8中,新增的元素在原来元素的下面)。
5 如果两个元素的哈希码相同,新增的元素调用equals方法和原来的元素进行比较,如果equals方法的返回值是false,两个元素不相等,则新的元素就存储到该位置上链表上。(在JDK1.8中,新增的元素在原来元素的下面)。
6 如果equals方法的返回值相同,则新增失败。
(HashSet 内部实现就是通过HashMap实现的)

迭代器Iterator

目前遍历集合,我们所拥有的手段都是通过for循环,现在我们还可以通过迭代器实现遍历(但是个人感觉foreach更加简单高效)
-----获取Iterator:Collection接口的iterator()方法
-----Iterator的方法
----------boolean hasNext():判断是否存在另一个可访问的元素
----------Object next():返回要访问的下一个元素

Iterator<Student> it = list.iterator();
		while(it.hasNext()){
			Student temp = it.next();
			System.out.println("学生的名字:"+temp.getName()+" === "+"学生的年龄:"+temp.getAge());
		}

增强for

for (Student temp : list) {
			System.out.println("学生的名字:"+temp.getName()+" === "+"学生的年龄:"+temp.getAge());
		}

Map接口

Map接口专门处理键值映射数据的存储,可以根据键(key)实现对值(value)的操作
-----最常用的实现类是HashMap

Map接口常用方法
在这里插入图片描述
遍历Map集合
方法1.通过迭代器Iterator实现遍历
方法2.增强for(foreach)
方法3.键值对

// 遍历hashMap
		// 方法一:增强for循环,循环的是hashMap的key集合(注意keySet方法返回的是set集合)(keySet()),将每个key值赋给Object
		// key,获得key值
		// 通过循环key集合和get(key)方法,将key传入参数,来获得value值,然后可以打印key和value值
		// it.next()方法,调用一次获得一次值
		for (Object key : hashMap.keySet()) {
			Object value = hashMap.get(key);
			System.out.println(key + "=========>" + value);
		}
		System.out.println("*****************************");
		// 方法二:iterator迭代器
		Iterator it = hashMap.keySet().iterator();
		while (it.hasNext()) {
			Object key = it.next();
			Object value = hashMap.get(key);
			System.out.println(key + "=========>" + value);
		}
		System.out.println("*****************************");
		// 方法三:键值对 Entry():Entry类型的集合 Entry类型保存的是键值对
		Set set= hashMap.entrySet();
		for (Object temp : set) {
			Entry entry = (Entry)temp;
			System.out.println(entry.getKey()+"------->"+entry.getValue());
		}

泛型集合

JDK5.0使用泛型改写了集合框架中的所有接口和类

泛型

将对象的类型作为参数,指定到其他类或者方法上,从而保证类型转换的安全性和稳定性(本质是参数化类型)

ArrayList<Student> list1 = new ArrayList<Student>();

就是泛型:其中的Student就是约束该集合存储的对象的类型,其他类型的对象不能存储进来

泛型集合可以约束集合内的二元素类型
典型泛型集合ArrayList、HashMap<K,V>
-----、<K,V>表示该泛型集合中的元素类型
-----泛型集合中的数据不再转换为Object

(除了指定了集合中的元素类型外,泛型集合和之前学习的集合的用法完全一样)

Collections算法类

(注意不是Collection接口)
Java集合框架将针对不同数据结构算法的实现都保存在工具类中
Collections类定义了一系列用于操作集合的静态方法

Collections类常用方法

Collections和collection不同,前者是集合的操作类,后者是集合接口
Collections提供的常用静态方法
-----sort():排序
-----binarySearch():查找
------max()\min():查找最大\最小值

Collections排序

Collections类可以对集合进行排序、查找和替换操作
实现一个类的对象之间比较大小,该类要实现Comparable接口(并重写compareTo()方法)

重写compareTo方法:

public class Student implements Comparable {
	private int num;
	private String name;
	private String sex;

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public Student() {
		super();
	}

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

	@Override
	public int compareTo(Object o) {
		Student stu = (Student) o;
		if (stu.getNum() > this.getNum()) {
			return -1;
		} else if (stu.getNum() == this.getNum()) {
			return 0;
		} else {
			return 1;
		}
	}

}

Collects类的排序操作

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

public class Test {
	public static void main(String[] args) {
		ArrayList list = new ArrayList<>();
		list.add("张三丰");
		list.add("杨过");
		list.add("郭靖");
		Collections.fill(list, "东方不败");
		for (Object object : list) {
			System.out.println(object);
		}
	}

	private static void method1() {
		Student s1 = new Student();
		s1.setNum(5);
		Student s2 = new Student();
		s2.setNum(2);
		Student s3 = new Student();
		s3.setNum(1);
		Student s4 = new Student();
		s4.setNum(4);
		ArrayList list = new ArrayList();
		list.add(s1);
		list.add(s2);
		list.add(s3);
		list.add(s4);
		System.out.println("----排序前----");
		for (Object object : list) {
			Student student = (Student)object;
			System.out.println(student.getNum());
		}
		System.out.println("----排序后----");
		//使用Collections类的sort()方法进行排序(根据重写方法进行排列)
		Collections.sort(list);
		for (Object object : list) {
			Student student = (Student)object;
			System.out.println(student.getNum());
		}
		//使用Collections中的binSearch()方法进行查找
		int index = Collections.binarySearch(list, s3);
		System.out.println("s3的索引值为:"+index);
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值