1、 容器概述

容器:顾名思义就是存放物品的地方,在Java中,容器就是存放对象的一种类型。数组本质上也是一种容器,容器可以理解为一种类型数组,并且多了一些普通数组没有的功能,让人们在使用起来更方便。

java 的数据容器 java容器的使用_java 的数据容器


上图就是容器的继承树,可以实现不同的功能。

2、泛型

容器的实现必须使用泛型,这样才能让一个容器可以装不同的东西,就像一个杯子,它是一个容器,人们可以用它来装水,也可以用来装沙子,而不是某一种杯子只能装水,另一种杯子只能用来装沙子。在Java语言中水或者沙子就是类型,可以是你自己定义的类型,也可以是int String这样的基本类型。但是,现实中的杯子还可以装一半沙子一半水,在Java中这样是不行的,要装水只能全部装水,要装沙子就只能装沙子。
泛型的语法十分简单,先看代码:

public class testgeneric {

	public static void main(String[] args) {
		list<String> li=new list<>();
		li.set("abc");
		System.out.println(li.t);
	}

}
class list<T>{
	T t;
	public void set(T a) {
		t=a;
	}
}

T就是一种类型,我们在main函数实例化list时将String函数代替T,说白了就是将类型当作一个参数传入另一个类型中。容器的实现都使用了泛型。

常用方法

java 的数据容器 java容器的使用_Java_02


容器中的方法有很多,大家可以自己去查看。

常用容器

List:List是一个接口(可以看第一个图),有索引,内容可重复
eg: List a=new ArrayList<>();
常用的实现类有ArrayList、LinkedList、Vector
ArrayList查询效率高,增删效率低,线程不安全。底层的增删算法基本都是使用Arrays工具类实现的
LinkedList底层使用链表来实现,查询效率低,增删效率高,线程不安全
Vector线程安全,效率低,底层很多方法有线程锁,如果有多个向量共享某一个内容,可以考虑使用Vector
Map:Map也是一个接口,通过键值对来存放数据,“键对象”不能重复。键重复插入的话会将之前的覆盖掉
eg: Map<int ,String> a=new HashMap<>();
HashMap是最常用的Map实现类。不能实现排序,底层使用了哈希表,哈希表的基本结构是“数组+链表”。线程不安全,效率高,允许key或vale为null。
底层原理:
HashTable线程安全,效率低,不允许key或vale为null。方法使用上与HashMap一样。
TreeMap:需要用到排序的时候可以用,一般用HashMap,底层使用的红黑二叉树实现
Set:是的,Set也是一个接口,无序、不可重复。无序指Set中的元素没有索引,我们只能遍历查找;不可重复指不允许加入重复的元素。更确切地讲,新元素如果和Set中某个元素通过equals()方法对比为true,则不能加入;甚至,Set中也只能放入一个null元素,不能多个。
HashSet:往set中加入元素,本质就是把这个元素作为key加入到了内部的map中,这个map的value都是一个对象,由于map中key都是不可重复的,因此,Set天然具有“不可重复”的特性。
TreeSet:不想写了,不常用

补充

常用接口Comparable
用于TreeMap中自定义排序规则
代码如下:

class emp implements Comparable<emp>{
	int id;
	double salary;

	public emp(int id, double salary) {
		super();
		this.id = id;
		this.salary = salary;
	}
	
	@Override
	public int compareTo(emp o) {//1:此对象比o大,-1:o比此对象大,0:一样大
		if(this.salary>o.salary)
			return 1;
		else if(this.salary<o.salary)
			return -1;
		else {//下面的意思是如果salary一样则以id排序
			if(this.id>o.id)
				return 1;
			else if(this.id<o.id)
				return -1;
		}
		return 0;
	}
}

下面这段代码是排序的代码

Map<emp,String> p1=new TreeMap<>();
		p1.put(new emp(10,45.3), "zhangsan");
		p1.put(new emp(5, 30.2),"lisi");
		p1.put(new emp(5, 89.9),"wangwu");
		
		for(emp key:p1.keySet()) {
			System.out.println(key.id+"-----"+p1.get(key));
		}