java 集合

数组

​ 1.相同类型的数据

​ 2.有长度限制

​ 3.使用时索引越界

集合:

集合是javaAPI提供的一种容器

容器:

程序运行过程中,可以临时存放数据的容器

集合和数组之间的区别有:

数组的长度是固定的,集合的长度是可变的

数组中存储的是同一类型的元素,集合中存储的数据可以是不同类型的

数组中可以存放基本类型数据或者对象,集合中只能存放对象(但是可以自动装箱)

数组是由JVM中现有的 类型+[] 组合而成的,除了一个length属性,还有从Object中继承过来的方法
之外,数组对象就调用不到其他属性和方法了

集合是由JavaAPI中的java.util包里面所提供的接口和实现类组成的,这里面定义并实现了很多方
法,可以使用集合对象直接调用这些方法,从而操作集合存放的数据

1.创建容器对象

2.向容器中存放数据

3.从容器中获取数据

java.util.*

接口 类

集合框架中主要有三个要素组成:

  1. 接口

整个集合框架的上层结构,都是用接口进行组织的。
接口中定义了集合中必须要有的基本方法。
通过接口还把集合划分成了几种不同的类型,每一种集合都有自己对应的接口。

  1. 实现类

对于上层使用接口划分好的集合种类,每种集合的接口都会有对应的实现类。
每一种接口的实现类很可能有多个,每个的实现方式也会各有不同。

  1. 数据结构

每个实现类都实现了接口中所定义的最基本的方法,例如对数据的存储、检索、操作等方法。
但是不同的实现类,它们存储数据的方式不同,也就是使用的数据结构不同。

Collection接口
Collection接口是单列集合类的父接口,这种集合可以将数据一个一个的存放到集合中。它有两个重要
的子接口,分别是 java.util.List 和 java.util.Set

Collection是父接口,其中定义了单列集合(List和Set)通用的一些方法,这些方法可用于操作所有的单列 集合对象。

Collection类型集合必须要有的基本的方法:(见javaAPI)

迭代器

为了能够方便的遍历集合中的每一个元素,API中提供了一个迭代器接口: java.util.Iterator
该接口可以很方便的迭代出集合中的元素。

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

public class CollTest {
	public static void main(String[] args) {
		Collection coll = new ArrayList();
		coll.add(1);
		coll.add("hello");
		coll.add("sdjjdisj");
		Iterator iter = coll.iterator();	
		for(;iter.hasNext();)
			System.out.println(iter.next());
		coll.clear();
	}
}

java.util.Collection 接口继承了 java.lang.Iterable 接口 java.lang.Iterable 接口中,定义了获取迭代器的方法:

public interface Iterable {

​ Iterator iterator();

}

所以, Collection 接口及其子接口中,都有一个获取迭代器对象的方法: Iterator iterator();

hasNext()——判断迭代器中是否还有下一个对象

next()——获取迭代器中下一个对象

foreach循环(jdk1.5以后)(实际上还是Iterable实现的)

for(变量类型 变量名 : 集合/数组){
	//操作变量
}

注意:这种方式只能用于遍历,不能对集合/数组中的元素进行修改

而且使用的集合必须是实现了Iterable这个接口的集合

数据结构

栈(先进后出)

JVM中的栈区中,main方法标注在最低端位置

队列(先进先出)

数组 (根据下标或索引存储数据,一组连续的空间)

查询快,插入/删除慢

链表(单向链表,双向链表)

查找慢,删除插入快

树(红黑树:查找插入效率都比较高)

二叉树中有一种叫做红黑树(Red/Black Tree),它最早被称为平衡二叉B树(symmetric binary Btrees),后来被称为红黑树。红黑树是一种特殊化的平衡二叉树,它可以在进行插入和删除的时候,如果左右子数的高度相差较大,
那么就通过特定操作(左旋、右旋)保持二叉查找树的平衡(动态平衡),从而获得较高的查找性能。
红黑树的每一个节点的左子树的所有数据都比自己小,而右子树的所有数据都比自己大,并且左右子树的高度近似
红黑树的约束:

  1. 根节点必须是黑色
  2. 其他节点可以是红色的或者黑色
  3. 叶子节点(特指null节点)是黑色的
  4. 每个红色节点的子节点都是黑色的
  5. 任何一个节点到其每一个叶子节点的所有路径上黑色节点数相同
    注意,红黑树的指定颜色的目的,是利用颜色值作为二叉树的平衡对称性的检查

哈希表

在JDK1.8之前是采用数组+链表进行实现

JDK1.8中,哈希表存储采用数组+链表+红黑树进行实现,当链表长度超过阈值(8)时,将链表转换为 红黑树

Collection

​ List

​ List是一种有序的集合
​ 例如,向集合中存储的元素顺序是8、2、5。那么集合中就是按照这个顺序进行存储的

​ List是一种带索引的集合
可以通过元素的下标索引,精确查找对应的元素数据

​ List是一种可以存放重复数据的集合
​ 可以把相同的数据,在List集合中多次保存

经常做插入删除操作的不建议用ArrayList)

Vector(线程安全的数组) LInkedList(链表)

Queue是队列接口 Deque是双端队列

Set 不能重复 无序列 没有索引(自动靠哈希值排序,对于插入的重复数据,只插入一次)

HashSet通过Hashmap实现,两者性能差不多

类/字符串插入set的情况要注意

HashSet中存储元素是无序的,主要因为它是靠对象的哈希值来确定元素在集合中的存储位置。

HashSet中元素不可重复,主要是靠对象的hashCode和equals方法来判断对象是否重复。

如果俩个对象的hashCode值相等,那么再使用equals判断是否俩对象是否相同, 如果俩个对象的hashCode值不同等,那么就不再使用equals进行判断了

java.util.Objects 是JDK1.7提供的一个对象的工具类,里面定义的一些静态方法,提供了操作对象的方法

例如,equals(Object a, Object b)方法可以判断俩个对象是否相等,当然也可以直接进行equals判断

例如,hash(Object… values)方法,可以根据若干个参数计算出一个哈希值,当然也可以自己设置哈希值

TreeSet是Set接口的子接口SortedSet的实现类

TreeSet可以将我们存进去的数据进行排序,排序的方式有俩种:

自然排序(如果一个类,实现了 java.lang.Comparable 接口,那么这个类的俩个对象就是可以比较大小的。)

public interface Comparable<T> {
	public int compareTo(T o);
}

数据排序的前提,一定是可以比较出数据的大小(数据类型相同)

compareTo方法使用说明: int result = o1.compareTo(o2);
result的值大于0,说明o1比o2大
result的值小于0,说明o1比o2小
result的值等于0,说明o1与o2相等

compareTo方法的放回结果,只关心正数、负数、零,不关心具体的值是多少

比较器排序(也称客户化排序)

直接导入Comparator类使用其中的compare方法(通常匿名内部类)

public int compare(Object o1,Object o2) {
}

然后在初始化set的时候放入Comparator类创建的对象

Comparator comparator = new Comparator() {

		@Override
		public int compare(Object o1,Object o2) {
				Student s1 = (Student) o1;
				Student s2 = (Student) o2;
				return s1.age > s2.age? 1 : (s1.age==s2.age? 0 : -1);
			}
		};
		
		Student stu1 = new Student("tom",20);
		Student stu2 = new Student("tom",20);
		Set<Student> set = new TreeSet<Student>(comparator);
		set.add(stu1);
		set.add(stu2);
}

Map

很多时候,我们会遇到成对出现的数据,例如,姓名和电话,身份证和人,IP和域名等等,这种成对出现,并且一一对应的数据关系,叫做映射。
java.util.Map<K, V> 接口,就是专门处理这种映射关系数据的集合类型。
Map类型集合与Collection类型集合,存储数据的形式不同:
在这里插入图片描述

Collection类型集合中,每次存一个数据。
Map类型集合中,每次需要存一对数据,key-value(键值对)
key值必须是唯一的,value值允许重复
键(key)和值(value)一一映射,一个key对应一个value
在Map中,通过key值(唯一的),可以快速的找到对应的value值

map——>Hashmap/TreeMap/HashTable/LinkHashmap

key值唯一也是通过hashcode和equals判断的

map集合里的add是put(K key,V value)(如果key存在,前面的value会被后面的value顶掉)

查找是否包含key——>containsKey() Value——>containsValues()

Map遍历

//返回Map集合中所有的key值
Set<K> keySet()
//返回Map集合中所有的value值
Collection<V> values()
//把Map集合中的的key-value封装成Entry类型对象,再存放到set集合中,并返回
Set<Map.Entry<K,V>> entrySet()

总结
集合:

需要临时存放数据

java.util

Collection

​ List

​ ArrayList 查找快,插入删除慢

​ LinkedList 插入删除快,查找慢

​ Vector 线程安全

​ Set (hashCode和equals判断两个对象是否相同)

​ HashSet

​ TreeSet 可以排序

​ 1.相同数据类型

​ 2.能进行自然排序 (能实现java.lang包下的

​ DataType implements Comparable {

​ compareTo(){}

​ }

​ 方法

​ )

​ 3.如果没有实现2的包,可以客户化排序

​ import java.util.Comparator;

​ Comparator comparator = new Comparator() { 。。。};

​ TreeSet o = new TreeSet(comparator);

Map(key-value键值对)

​ HashMap

​ TreeMap 可以排序

​ 1.key值排序

​ 2.key的数据类型最好一致

​ 3.自然排序

​ DataType implements java.lang.Comparable {

​ compareTo(){}

​ }

  1. new TreeMap(new Comparator){

    ​ compare(key1,key2);

    }

  2. HashTable x线程安全

  3. LinkHashMap 按自己的顺序放进去

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值