java高级特性之集合概述

java中的集合概述

map 接口

总结

java集合学习

1 java中存储数据的方式 1 数组 (基本数据类型+引用数据类型)。2 集合(对象)

数组存储数据的缺点1:数组一旦创建,长度固定 2:数组不能直接确定有效元素的个数

java中的集合概述:

java集合接口:Collection 接口 和Map 接口

(Collection接口 表示不按照添加顺序存放对象的集合,而且集合内的元素可以重复即 无序可重复 集合,它是List,Set,Queue..接口的父接口)

Collection 接口

|–List接口 (存储有序的,可以重复的元素,equals()

|–ArrayList (主要实现类,线程不安全,效率高

|–LinkedList (适用于需要经常删除或者添加的情况

|–Vector (古老的list实现类,线程安全

|–Set 接口:无序的,不可以重复的元素,hashCode(),equals()

|–HashSet |–LinkedHashSet |–TreeSet

Map 接口 (具有映射关系”key-value”对(键值对) 的集合)

|–HashMap ,LinkedHashMap,TreeMap ,Hashtable(子类

Properties)

Collection useful method

1 add(Object obj):添加obj到当前集合

addAll(Connection c) 将c集合中的元素添加到当前集合

size() 返回集合中元素的个数

isEmpty()判断当前集合是否为空

2 remove(Object obj) 删除obj元素,先调用元素类的equals方法

判断当前集合中是否包含obj元素。

判断的标准:调用obj元素所在类的equals()方法进行判断。

要求:如果obj元素是我们自定义类的对象,那么要求自定义类需要重写equals()!

removeAll(Connection con) “差集” 删除con集合中与当前集合的交集

retainAll(Collection con):“交集”:返回当前集合与con集合共有元素,并将此元素的集合返回给当前集合

equals(Object obj):判断当前集合与obj元素是否equals()

要想返回true,必须obj也是一个集合,同时元素与当前集合中的元素都相同。

contains(Object obj) 判断当前集合中是否包含obj元素

containsAll(Connection con) 判断当前集合中是否包含coll集合中的所有元素。

hashCode()

3 iterator():返回一个实现了Iterator接口的类的对象。(该对象用来遍历 Collection集合的元素)

iterator.hasNext(),返回当前位置的下一个位置是否为null。

iterator.next():位置下移,然后返回 下移之后的元素。

toArray() 将集合转换成数组类型。

List list = Arrays.asList(new Objcet[]{…,…});

List 接口 useful method

List接口 存储 有序的,可以重复的元素, “动态”数组

增,add(Objctect obj)

删,remove(int index)

改,set(int index,Object obj)

查,get(int index)

插:add(int index,Object obj)

遍历:iterator()

Set接口

Set 接口 存储 无序的,不可重复的元素,没有额外添加父接口 Collection中的抽象方法。

|– HashSet (主要实现类)可以添加null

|–LinkedHashSet ,是HashSet的子类,遍历的时候可以按照添加时候的顺序,对于频繁遍历的时候使用。

|–TreeSet

Set接口集合:

1无序性 != 随机性,真正的无序性是指,元素在底层的存储的位置是无序的,HashSet集合底层也是数组,只不过其元素并不是按照添加进集合的顺序排列,而是由元素的哈希码值决定位置

2不可重复性,当向Set集合中添加相同元素的时候,后面的元素无法添加。

为了保证如上2点,要求:

添加进Set集合的元素的类型必须重写equals()和hashCode()方法,而且保证以上两个方法保持一致。

Set集合中的元素如何存储呢?

Set集合使用了哈希算法。先调用元素所在类的hashCode()方法,根据哈希码值指定元素的存储位置,在哈希码值相同的情况下,使用元素所在类的equals()方法比较,若元素相同,则不能添加进Set类型的集合。

【弦外话】一个类的hashColde方法和equals方法要求一致。a与b对象相等,那么其hashCode方法返回的哈希码值也要相同,这就要求我们重写的如上方法健壮

另外在向Set集合中添加元素的时候如果元素的码值相同,但是equals方法返回的是false,那么这个后进来的元素也可以添加。

同理如果俩元素equals方法返回true,但是hashCode方法返回的码值不同,那么后进来的元素也可以存储。

如上情况,就要去我们要重写健壮的equals方法和hashCode方法。

HashSet类 集合元素特点:无序和不可重复

LinkedHashSet类 集合元素:使用链表维护了元素添加进集合时候的顺序,所以在遍历集合的时候也是按照元素被添加进集合时候的顺序。

Set接口的主要实现类 HashSet:

1,HashSet类是Set接口的典型实现类,在使用Set接口的时候大多数都是在使用HashSet类。

2,HashSet类按照Hash算法来存储元素,因此具有很好的存取和查找的性能。

3,HashSet类的特点:

a:不能保证元素的排列顺序

b:HashSet不是线程安全的

c:集合元素可以是null

总结HashSet

当向 HashSet 集合中存入一个元素时,HashSet 会调用该对象的 hashCode() 方法来得到该对象的 hashCode 值,然后根据 hashCode 值决定该对象在 HashSet 中的存储位置。 HashSet 集合判断两个元素相等的标准:两个对象通过 hashCode() 方法比较相等,并且两个对象的 equals() 方法返回值也相等

LinkedHashSet 是 HashSet 的子类 LinkedHashSet 根据元素的 hashCode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这使得元素看起来是以插入顺序保存的。LinkedHashSet插入性能略低于 HashSet,但在迭代访问 Set 里的全部元素时有很好的性能。LinkedHashSet 不允许集合元素重复。TreeSet类

1,向TreeSet 类型的集合中添加元素必须是同一种类型的

2,可以按照元素的指定的顺序排列,像String 和基本数据类型按照从小到大的顺序排列

3,向集合中添加自定义类的对象时,自定义类需要实现Comparable 接口的唯一抽象方法(compareTo(Objcet obj))方法。

即:按照自定义类中重写的compareTo方法来进行排序。(自然排序)

TreeSet类中排序方式1自然排序,2指定排序。

1:自然排序:

1:向TreeSet集合中添加的元素a所在的类A,需要实现接口Comparable接口

2:类A重写Comparable接口的抽象方法compareTo(Object o)

3:保证compareTo方法和hashCode以及equals方法一致。

理解:

在向TreeSet类型的集合中添加元素的时候,首先调用其元素的compareTo()方法进行比较,一旦返回0,虽然仅仅是元素对象的某一个属性值相同,但是程序会认为这两个对象是同一个,故而后面一个元素不能添加进TreeSet类型的集合中。

因此我们应当保证元素类型的compareTo()方法 hashCode()以及equals()方法 一致!!!!

TreeSet类型集合 元素的排序方式二

1:创建一个实现了Comparator 接口的类的对象com,自然要重写其抽象方法compare(Object o1,Object o2)。

2:将如上对象 com 作为 形参 传递给TreeSet 的构造器

3:向TreeSet类型集合中添加 实现Comparator 接口的类中compare(Object o1, Object o2)方法中涉及的类 的对象。

同上的问题,compare方法也必须和hashCode 和 equals 方法保持一致。

针对以上TreeSet集合元素的两种排序方式:

当可以操作集合元素的类型的时候可以采用第一种排序方式,让元素类型实现comparable 接口即可。

若不能操作元素类型,可以采用第二种排序方式。使用TreeSet的有参构造器。其参数类型是Comparator,一般在方法使用内部类,构造实现了该接口的具体类。

Map接口

Map中数据存储特点

1,Map中数据存储的是Key—Value键值对

2,Map中所有的key是由Set存放,所有的key彼此不同。

key中的自定义的类需要重写hashCode和equals方法

3,Map中所有的values是由Collection存放的。

values中的自定义类需要重写equals方法。

4,一个key-value键值对构成一个entry。

所有的entry都是由set存放。entry的存储位置就是由entry中key的位置决定的。

|–HashMap,主要实现类,线程不安全,可以存储null

|–LinkedHashMap 用链表维护了Map集合中元素的个数

|–TreeMap,按照添加进Map集合中entry的key的指定属性来排序。要求key必须是同一个类 的对象 (自然排序&指定排序)

|–Hashtable 古老的实现类,线程安全,不可以存储null不建议使用

|–Properties:是Hashtable类的子类,通常用来处理属性文件,key和value都是String类型。

Map中的常用方法:

Object put(Object key,Object value):向Map中添加一个元素,若Map中key存在要添加的entry的key,则添加的entry替换已经存在的entry,并返回之前的entry中的value对象。

Object remove(Object key):按照指定的key删除此key-value

void putAll(Map t)

void clear():清空

Object get(Object key):获取指定key的value值。若无此key,则返回null

boolean containsKey(Object key): 是否包含指定的key

boolean containsValue(Object value) :是否包含指定的value

int size():返回集合的长度

boolean isEmpty()

boolean equals(Object obj)

Set keySet() 返回Map中的所有的key,类型为Set

Collection values(),返回Map中的所有的value,类型为Collecton

Set entrySet() 返回Map中的所有的Entry。类型为Set

Set entrySet = map.entrySet();//返回所有的键值对

for (Object o : entrySet) {

Map.Entry entry = (Map.Entry) o;//在没用泛型时,强转!!

System.out.println(entry.getKey() + “—->” + entry.getValue());

}

使用泛型对map的迭代

Map

时间: 2024-10-21 06:44:00

java高级特性之集合概述的相关文章

Java高级特性 第1节 集合框架和泛型

Java中,存储多个同类型的数据,可以用数组来实现,但数组有一些缺陷: 数组长度固定不变,布恩那个很好的适应元素数量动态变化的情况 可以通过数组.length获取数组长度,却无法直接获取数组中实际存储的元素个数 数组采用在内存中分配连续空间的方式存储,根据元素信息查找时的效率比较低,需要多次比较 Java提供了一套性能优良.使用方便的接口和类,他们都位于java.util包中. 一.Java中的集合 Java集合类主要由Map接口和Collection接口派生而来,Collection接口有两个

Java高级特性 第8节 网络编程技术

一.网络概述 1.网络的概念和分类 计算机网络是通过传输介质.通信设施和网络通信协议,把分散在不同地点的计算机设备互连起来,实现资源共享和数据传输的系统.网络编程就就是编写程序使联网的两个(或多个)设备(例如计算机)之间进行数据传输.Java语言对网络编程提供了良好的支持,通过其提供的接口我们可以很方便地进行网络编程.下面先对网络编程的一些基础知识进行介绍,最后给出使用Java语言进行网络编程的实例. 按照地理覆盖范围,计算机网络可以分为局域网(LAN).城域网(MAN).广域网(WAN). 2

Java高级特性 第11节 JUnit 3.x和JUnit 4.x测试框架

一.软件测试 1.软件测试的概念及分类 软件测试是使用人工或者自动手段来运行或测试某个系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别.它是帮助识别开发完成(中间或最终的版本)的计算机软件(整体或部分)的正确度 .完全度和质量的软件过程. 软件测试过程: 2.软件测试的分类 按是否关心软件内部结构和具体实现角度来分: 黑盒测试(Black-box Testing) 黑盒测试也称功能测试,测试中把被测的软件当成一个黑盒子,不关心盒子的内部结构是什么,只关心软件的输入

Java高级特性 第6节 注解(初步认识)

转自https://www.cnblogs.com/xdp-gacl/p/3622275.html的博客 一.认识注解 注解(Annotation)很重要,未来的开发模式都是基于注解的,JPA是基于注解的,Spring2.5以上都是基于注解的,Hibernate3.x以后也是基于注解的,现在的Struts2有一部分也是基于注解的了,注解是一种趋势,现在已经有不少的人开始用注解了,注解是JDK1.5之后才有的新特性 JDK1.5之后内部提供的三个注解 @Deprecated 意思是“废弃的,过时的

Java高级特性

1.HashMap与HashTable的区别: HashMap类是基于哈希表的 Map 接口的实现.它提供所有可选的映射操作,并允许使用 null 值和 null 键.但此类不保证映射的顺序,特别是它不保证该顺序恒久不变.Hashtable类实现一个哈希表,该哈希表将键映射到相应的值.任何非 null 对象都可以用作键或值.在Java集合框架中,有些类是线程同步安全的类,它们是Vector.Hashtable.Stack.enumeration.HashMap类是基于哈希表的 Map 接口的实现

Java 高级特性: Lambda 表达式

本文源代码上传到了码云,请点击 LambdaExpression 获取.Lambda 表达式是 java 8 的新特性,本文讲解了 lambda 表达式的所有知识.内容涉及到 lambda 表达式是什么, lambda 表达式用在何处,在 GUI 应用程序中使用 lambda 表达式,lambda 表达式语法,变量访问权限,目标类型,序列化,方法引用等.

java高级特性--注解,这也许是最简单易懂的文章了

博主在初学注解的时候看到网上的介绍大部分都是直接介绍用法或者功能,没有实际的应用场景,篇幅又很长导致学习的时候难以理解其意图,而且学完就忘QAQ.本篇文章中我将结合实际的应用场景尽可能由浅入深,平缓的介绍java注解. java注解是jdk1.5以后新出的特性,对于它的应用非常广泛,我们首先来看一下注解的应用,百度百科上这样说: 我们可以看到,注解的作用有三方面: 编写doc文档:这个就我们很常用的 @return 以及 @author,加了这些注解以后,就可以用jdk帮我们自动生成对应的API

Java高级特性——注解,这也许是最简单易懂的文章了

java注解是jdk1.5以后新出的特性,对于它的应用非常广泛,我们首先来看一下注解的应用,百度百科上这样说: 我们可以看到,注解的作用有三方面: 编写doc文档:这个就我们很常用的 @return 以及 @author,加了这些注解以后,就可以用jdk帮我们自动生成对应的API文档了 编译检查:这个也很常见 @Override,而且功能很强大,我将会在以后的文章中介绍 进行代码分析:这是本篇文章的重点.这个和编译检查一样也是一个强大的功能,但相比与编译检查由于其用到了反射,在性能上存在一些问题

Java高级特性—锁

1).synchronized 加同步格式: synchronized( 需要一个任意的对象(锁) ){ 代码块中放操作共享数据的代码. } synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.    如果一个代码块被synchronized修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,    等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况: 1)获取锁的线程执行完了该代码块,然后线程释