Java从入门到精通 十四章 集合

java集合作为一种存储对象的容器,在平时开发中有着很重要的作用.说到java中存储数据的容器有以下几种,特意记录下(毕竟以前面试的时候考到过)。

Java中的数据存储容器

  1. 8中基础数据类型(只存储单个数据不算,容器是能存2个及以上的那种)
  2. String:String字符串算是一种(他是char字符数据 存储数据的容器)
  3. SrtingBuilder:而前面章节提到过得字符串生成器StringBuilder(是一种存储字符串的容器)
  4. 数组:同时由上面String字符串可以得出,数据类型是由数组拼接而成的数据都是数据容器,数组当然也是一种
  5. 集合:集合是用于存储对象的容器。可以包含各种数据类型。
  6. spring容器?web容器?堆?栈?方法区?队列?Docker容器?

Java中的集合
java中的集合分为Collection集合及Map集合.Collection是一个接口下面又分为List集合+Set接口,List和Set接口继承了Collection接口。List和Set接口 存在各自实现接口的实现类LinkedList+ArrayList.Set集合又分为HashSet集合及TreeSet集合(TreeSet接口不仅实现了Set接口,而且实现了SortedSet).

在这里插入图片描述
Collection接口

  1. add(E e) 向集合中添加对象
  2. remove(E e)删除集合中某个特定对象
  3. isEmpty() 判断当前集合是否为空
  4. size()获取集合的大小
  5. iterator() 返回当前集合返回的迭代器,用于遍历集合中的对象(这个需要多留意,平时遍历集合更多的使用forEach增强型循环,同时迭代器中有2个方法需要留意:hasNext() 判断当前迭代器是否存在下一个元素,存在返回true,不存在返回false.next()方法用于返回迭代器下一个元素)

在这里插入图片描述
总结有一点需要注意的是书中说迭代器next返回的类型是Object类型,需要显示向下造型,但通过观察Iterator.next()方法发现实际上利用了泛型特性,会返回迭代器存储的数据类型

List接口
List接口继承自Collection接口,不仅继承了Colection接口的5个方法,同时在此基础上也加了get(int index)获取指定位置的集合,set(int index,Object a)设置集合指定位置的对象.其他的一些如indexOf(Object)获取对象指定位置的方法/contain(Object)也要有所了解。继承了List接口的集合有LinkedList及ArrayList集合。上述2个集合都是有序且可重复的,对于null对象同样支持.通过List接口实现的2个集合类,我们能够发现ArrayList与LinkedList集合都继承了AbstractSequentialList.但是LinkdList集合相比ArrayList集合多实现了一个Deque接口(继承了Queue队列类),继承类由AbstractList改为AbstractSquentialList.所以LinkedList能够实现链表数据结构的集合。而ArrayList之所以能够随机访问效率上比LinkedList高,关键就在于实现接口中有一个RandomAccess接口(然后里面啥东西也没写,作用有点类似实现序列化接口的类).正式由于2个集合类继承与实现的不同,才得以在数据插入与读写性能上的差异.
在这里插入图片描述

LinkedList集合
LinkedList集合是基于链表结构实现的集合.所以在集合数据新增,删除性能方面上相比ArrayList可变长度数组性能上更有优势.但是相比随机访问的ArrayList上性能更低(这主要是ArrayList集合实现了RandomAccess接口,虽然这里面拿啥也没写~~哈哈).
在这里插入图片描述
ArrayList集合

在这里插入图片描述
ArrayList集合实现了可变长度的数组.同时由于实现RandomAccess接口,所以能够在随机访问效率上更高的特性。在继承方面AbstractList接口 相比LinkedList集合继承的AbstractSquentialList没有啥优势,毕竟你这里继承的是人家的爸爸,人家继承的是儿子。儿子不仅继承了爸爸的特性,而且还发展了拥有链表数据结构的特性.

在这里插入图片描述
需要注意的是由于List集合实现了有序和可重复集合,所以许多方法都有重载,比如上面例子中remove方法,Collection接口中remover(Object object)方法,而子类List中remover()则添加了根据下标位置删除对象的方法。同时List有序集合的下标也是从0开始的.

Set接口
Set接口同样是Collection接口下面的接口,但是存在着不可重复集的特性。如果存在重复的数据则覆盖的数据.Set接口实现的集合有HashSet以及TreeSet。HashSet集合类似HashMap实例.而TreeSet集合不仅继承了Set接口而且 实现了SortedSet接口。所以TreeSet集合默认按照升序排序排序。而HashSet则无法保证顺序不变。主要是由于HashSet由哈希支持。也就是根据哈希散列 生成一个偏移值.所以顺序无法保证.实际上Set集合用的比较少,平时用的也是在遍历不重复值如HashMap中的key使用到,其他情况下也有可能使用TreeMap实现Compartable比较器实现自定义排序,这样来遍历集合顺序.如果TreeMap集合中的类不实现Compartable则会编译报错Object cannot be cast to java.lang.Comparable
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
TreeSet集合方法

  1. first() 返回集合第一个对象
  2. last() 返回集合最后一个对象
  3. head(Object c)返回集合中在c对象之前的新集合.
  4. tail(Object c)返回集合中c对象之后的新集合.
  5. subSet(Object a,Object b)返回集合a与b之间的新集合.
package Gather;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class UpdateSu implements Comparable<Object> {
	String name;
	long id;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public long getId() {
		return id;
	}
	public void setId(long id) {
		this.id = id;
	}
	
	
	public UpdateSu(String name, long id) {
		super();
		this.name = name;
		this.id = id;
	}
	
	public String toString() {
		return "UpdateSu [name=" + name + ", id=" + id + "]";
	}
	public static void main(String[] args) {
		UpdateSu uSu1=new UpdateSu("张三", 01011);
		UpdateSu uSu2=new UpdateSu("李四", 01021);
		UpdateSu uSu3=new UpdateSu("赵武", 01051);
		UpdateSu uSu4=new UpdateSu("网六", 01012);
		Set<UpdateSu> set=new TreeSet<>();
		set.add(uSu1);
		set.add(uSu2);
		set.add(uSu3);
		set.add(uSu4);
		
		Iterator<UpdateSu> iterator=set.iterator();
		while (iterator.hasNext()) {
			UpdateSu updateSu = (UpdateSu) iterator.next();
			System.out.println(updateSu);
		}
	}
	

	public int compareTo(Object o) {
		UpdateSu o1=(UpdateSu) o;
		return  o1.getId()>id?1:(o1.getId()==id?0:-1);
	}

}

在这里插入图片描述
在写的时候容易吧java.util的Compartor与java.lang的Compartable搞混,需要特别注意.同时像这种TreeSet集合中不是基础数据类型。实现Comparttbale接口的compareTo比较方法用前面的返回正数,后面的返回负数原理.估计想基础类型封装类以及高精度计算类 都实现了java.lang的Compartable接口.一看还真是.就是有一点搞不明白Compartable与Compartor之间的区别在哪?除了一个java.util/java.lang之间的区别.另外还有一点就是是不是对象只有一个数据就不用实现Compartable接口就能放到TreeSet排序了.试试,好像还真是放入TreeSet集合的对象都必须实现Compartable接口,可能以前都是用的基础数据类型吧
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
通过上面的图片就能发现如果放入TreeSet集合的数据类型 没有实现Compartable接口,那么在编译的时候就会出现报错的情况.至于TreeSet集合中的几个返回新集合的api方法了解就好.

Map集合
map接口没有继承Collection接口,存储的数据结构是一个key对应一个value。实现map接口的集合有HashMap及TreeMap集合。一般来讲我们用到HashMap集合的情况更多。HashMap集合是通过散列技术进行处理,生成一个散列码的整数值,散列码通常作为偏移量,记录分配给内存区域的起始位置.从而确定存储对象在映射中存储位置.

Map接口中的方法

  1. put(Object c)集合中放入一个对象
  2. containKey(Object obj)判断集合中是否存在obj key值
  3. containValue(Object obj)判断集合中是否存在obj value值
  4. get(Object c)获取集合中key=c的值
  5. keySet()返回集合由key组成的Set集合(因为key值不能重复),同时Map集合中没有iterator迭代器返回,那是Collectio集合才有的.
  6. values()返回由value组成的Collection集合(因为value值可以重复)
    同时HashMap与TreeMap这名字的叫法与Set集合中的2个实现类集合优点类似.说白了无非就是集成AbstractSet与AbstractMap以及实现接口的区别.

TreeMap与HashMap之间的区别
TreeMap与TreeSet一样都实现了排序的接口SortedMap/SortedSet的区别,所以讲TreeMap与HashMap相比 是有顺序的,而HashMap是没顺序的。而前两天听朋友说HashMap的内部数据结构是链表结构+数组下标。所有HashMap在插入 删除上性能更好,而TreeMap由于默认实现了SortedMap接口,所以实际上都是拍好顺序的数据,就是不知道排序的规则是咋样的,要不要向TreeSet一样需要实现Compartable接口 自定义排序顺序,否则就会报错的情况 试下?仔细想了下应该不会出现TreeSet那种情况,主要是TreeSet不知道排序大小比较的关系。而TreeMap比较的东西就很明确那就是key,所以不需要实现Compartable比较器接口.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值