黑马程序员--Java基础学习笔记【集合-Map】

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

Map 接口

Map 接口定义的集合,又称查找表

Map 接口和 Collection 接口没关系

Map 集合派系,存储映射键值对

不允许重复的键,每个键最多映射 1 个值

根据内部数据结构不同,Map 接口有多种实现类:

常用的有内部为 hash 表实现的 HashMap 和内部为排序二叉树实现的 TreeMap

Map 接口和 Collection 接口的不同

Map 和 Collection 是独立的接口

Map 双列,存储键值对映射关系,键具有唯一性,每个键只能映射 1 个值

Collection 单列,存储对象的引用,其 Set 子接口的元素是唯一的

Map 的数据结构只针对键有效,跟值无关;Collection 的数据结构针对元素有效

Map 接口成员方法

V put(K key, V value)

// 将键值对存储到集合,返回值一般是 null,存储重复键返回被替换之前的值

V get(Object key) // 根据键获取值,如果不存在返回 null

V remove(Object key) // 移除指定键的映射关系,返回该键对应的值

void clear() // 清空集合

boolean containsKey(Object key) // 判断是否包含指定键的映射关系

boolean containsValue(Object value) // 判断是否包含指定值

boolean isEmpty() // 判断是否为空

int size() // 返回集合大小

Set<K> keySet() // 将 Map 集合中所有的键,存储到 Set 集合

Collection<V> values() // 将 Map 集合中的所有值,存储到 Collection 集合

Set<Map.Entry<K, V>> entrySet() // 将所有键值对存储到集合

Map 集合遍历

第一种方式 Set<K> keySet():适合开发使用,简单、代码量少

Map 接口中定义的方法keySet,将 Map 集合中所有的键存储到 Set 集合,迭代 Set 集合,获取出 Set 集合中存储的元素就是 Map 中的键,get() 根据键获取值。

  1. 1.  调用 Map 集合方法 keySet,将所有键存储到集合
  2. 2.  迭代 Set 集合,获取 Set 集合存储的对象
  3. 3.  Map 集合方法 get,传递键获取值

Set<String>set= map.keySet();

Iterator<String>iterator= set.iterator();

while (iterator.hasNext()) {

String key = (String) iterator.next();

Integer value = map.get(key);

System.out.println("value= " + value);

}

第二种方式Set<Map.Entry<K, V>> entrySet():适合面试考试

原理:存储键值对,键值对的映射关系也是一个对象,对象的描述是接口,是 Map 接口的内部接口 Entry 。Map 集合中,实现了这个内部接口 Entry,重写接口中的方法,可以让我们获取 Map 集合中的键值对。

Entry 的方法:K getKey(), V getValue()

  1. 1.  调用 Map 集合方法 entrySet,将所有键值对映射关系对象(即 Map.Entry 接口的实现类对象)存储到 Set 集合
  2. 2.  迭代 Set 集合,获取 Set 集合存储的对象(Map.Entry 接口的实现类对象)
  3. 3.  调用 Map.Entry 接口的方法 getKey, getValue 分别获取键和值

Set<Map.Entry<String,Integer>> set2= map.entrySet();

Iterator<Map.Entry<String,Integer>> iterator2= set2.iterator();

while (iterator2.hasNext()) {

Map.Entry<String, Integer> entry = (Map.Entry<String,Integer>) iterator2.next();

String key = entry.getKey();

Integer value = entry.getValue();

System.out.println("key= " + key + ", value= "+ value);

}

增强 for 循环遍历示例

package cn.itcast;

import java.util.HashMap;

import java.util.Map;

import java.util.Map.Entry;

import java.util.Set;

/*

* Map 接口和Iterable 没有关系不具有获取迭代器方法,

* 增强for不能直接遍历Map集合

* 但是可以间接遍历(遍历的是Set)

*/

public class MapForEach {

publicstatic void main(String[] args) {

Map<String,Integer> map = new HashMap<String, Integer>();

map.put("a",1);

map.put("b",2);

map.put("c",3);

Set<String>set = map.keySet();

for(String key : set) {

Integervalue = map.get(key);

System.out.println("value=" + value);

}

System.out.println("-------------------");

Set<Map.Entry<String,Integer>> set2 = map.entrySet();

for(Entry<String, Integer> entry : set2) {

Stringkey = entry.getKey();

Integervalue = entry.getValue();

System.out.println("key=" + key + ", value= " + value);

}

}

}

HashMap 类

底层数据结构,键是哈希表结构,保证键的唯一性

(存储自定义对象的键,需要重写 hashCode equals 方法)

允许存储 null 键值

存储速度快,线程不安全集合,运行速度快

LinkedHashMap 类继承 HashMap

基于链表和哈希表的实现,线程不安全集合

维护着一个双向循环链表,此链表定义了迭代顺序,通常是存放元素的顺序

有序 Map 集合,存储取出的顺序一致,具有可预知的迭代顺序

TreeMap 类

底层数据结构是红黑树(保证键的排序和唯一性)

对存储的键进行排序,自然排序和比较器排序

线程不安全集合运行速度快

  • 获取字符串中每个字母出现的次数

package cn.itcast;

import java.util.TreeMap;

/*

* 统计字符串中每个字母出现的次数

*

* 思路:

*  将字符串转成字符数组,遍历字符数组,

*  将每个字母及其出现的次数存进 Map 集合

*  遍历存储集合完成后,取出集合中的键值

*/

publicclassTreeMapTest {

publicstaticvoid main(String[] args) {

Stringstring= "wwwitcastcn";

// Map 集合存储字母及其出现的次数

TreeMap<Character,Integer> map= newTreeMap<Character, Integer>();

char[] arr = string.toCharArray();

for (charc : arr) {

// 获取字母已出现的次数并根据当前迭代情况修改

Integervalue= map.get(c);

if (value == null) {

map.put(c, 1);

}else{

map.put(c, ++value);

}

}

// 遍历集合中存储的键(即每个字母),获取相应的值(即字母出现的次数)

for (charkey : map.keySet()) {

Integervalue= map.get(key);

System.out.println(key + "(" + value + ")");

}

}

}

Hashtable 集合自身特性

底层数据结构是哈希表,保证键的唯一性

不允许存储 null 键值

线程安全集合,运行速度慢

Properties 类继承 Hashtable

底层数据结构是哈希表,线程安全集合

可以和IO流结合使用,实现数据持久性存储

存储和取出的代码和HashMap 完全一样

为什么没有泛型?固定集合存储的类型,属性列表中每个键、值都是字符串

setProperty(String key, String value) // 将键值对存储到集合

String getProperty(String key) // 根据键获取值

HashMap 和 Hashtable 的区别

二者都实现了 Map 接口,是将唯一键映射到特定的值上

HashMap:

线程不安全,运行速度快

没有排序,可以存储 null 键和多个 null 值

Hashtable:

线程安全,运行速度慢

不可以存储 null 键值

List, Set, Map 等接口是否都继承自 Collection 接口

List 和 Set 继承自 Collection接口,而 Map 不继承任何接口

java.util.Collections 类,集合操作的工具类

// 对集合中的元素进行自然顺序排序

//对自定义对象排序需要在类中实现 Coparable 接口并重写 compareTo 方法

Collections.sort(list);

// 返回一个比较器对象,逆转对象的自然顺序

Comparator<String>comparator= Collections.reverseOrder();

Collections.sort(list, comparator);

// 对集合中的元素的顺序进行反转

Collections.reverse(list);

// 二分法查找在集合中指定元素返回索引值

intindex = Collections.binarySearch(list, "itcast");

// 对集合中的元素随机排列

Collections.shuffle(list);

  • Sting[] <-->List

String[] strArr = {"www", ".itcat",".cn"};

List<String> list = Arrays.asList(strArr); // fixed-sizelist

for(String string : list) {

System.out.print(string + " "); // www .itcast .cn

}

// list.add(""); // UnsupportedOperationException

// java.util.Arrays$ArrayList

System.out.println(list.getClass().getName());

list.set(0, "3w"); // 可以修改元素

// 如果想要添加元素,可以用如下方式:

List<String> list1 = new ArrayList<String>();

list1.addAll(list);

System.out.println(list1); // [www, .itcast, .cn]

list1.add("0807JavaSE");

System.out.println(list1); // [www, .itcast, .cn, 0807JavaSE]

时间: 2024-10-14 06:50:09

黑马程序员--Java基础学习笔记【集合-Map】的相关文章

黑马程序员--java基础学习笔记5

黑马程序员--java基础学习笔记6 一.笔记内容概述: 数组-第二种定义格式.数组-常见操作-遍历-最值-选择排序-冒泡排序-排序位置置换代码提取.数组-排序的性能问题.数组-常见功能-查找-折半查找.进制转换-查表法-整合. 二.常用内容介绍: 1.数组初始化的三种方式: int[] arr = new int[3]; int[] arr = new int[]{1,2,3}; int[] arr = {1,2,3}; 2.查表法: 如果数据中出现了对应关系,而且对应关系的一方是有序的数字编

黑马程序员--Java基础学习笔记【集合-Set】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- Set 接口特点: 不允许存储重复元素,无序集合:存储取出没有顺序(不保证迭代顺序),没有索引 Set接口方法,和父接口Collection抽象方法完全一样 Set接口存储对象并迭代,找实现类HashSet集合 HashSet 如何保证元素唯一? Set里的元素是不能重复的,使用 equals() 方法和 hashCode() 方法来区分重复与否.覆盖 equals() 方法.hashCode

黑马程序员--Java基础学习笔记【单例设计模式、网络编程、反射】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 设计模式分类: 创建模式:是对类的实例化过程的抽象化,又分为类创建模式和对象创建模式 类创建模式:工厂方法模式 对象-:简单工厂(静态工厂方法)模式.抽象工厂模式.单例模式.建造模式- 结构模式:描述如何将类或者对象结合在一起形成更大的结构 适配器模式.缺省模式.合成模式.装饰模式(包装模式).门面模式- 行为模式:对不同的对象之间划分责任和算法的抽象化 不变模式.策略模式.迭代子模式.命令模

黑马程序员--Java基础学习笔记【序列化、多线程】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 序列化流与反序列化流 ObjectOutputStream 对象输出流 writeObject(Object obj) 可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中 ObjectInputStream对象输入流 readObject(Objectobj) 从源输入流中读取字节序列,反序列化为一个对象并返回 序列化:将数据分解成字节流,以便存储在文件中或在网络上传输

黑马程序员--Java基础学习笔记【正则表达式、常用API】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 正则表达式 正则表达式的组成规则 java.util.regex.Pattern 常见组成规则 字符集合 [abc] a.b.c中任意一个字符 [^abc] 除了a.b.c的任意字符 [a-z] a-z中的任意一个字符 [a-zA-Z0-9] a-z.A-Z.0-9中任意一个字符 [a-z&&[^bc]] a-z中除了b和c以外的任意一个字符 预定义字符集 .任意一个字符 \d 任意一个

黑马程序员--java基础学习笔记8

 一.笔记内容概述: 面向对象(数组工具对象建立-文档注释-单例设计模式&内存图解).继承.单继承和多重继承. 二.常用内容介绍: 1.继承的好处:提高了代码的复用性;让类与类之间产生了关系;开发最终的核心内容:不断地创建对象,使用对象,并维护着对象之间的关系. 2.什么时候使用继承? 当类与类之间存在着所属关系的时候,就定义继承;java不直接支持多继承,因为多个父类中如果有相同成员时,就会出现调用的不确定性;java中通过多实现implements的方式来间接体现多继承; 3.如何学习一

黑马程序员--Java基础学习笔记【异常处理】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 异常 异常就是Java程序在运行过程中出现的导致程序无法正常运行的错误. Java 中异常继承体系,顶层的类 java.lang.Throwable java.lang.Exception 所有异常的超类 RuntimeException 运行时异常可以不处理 非RuntimeExceptioin非运行时异常必须捕获处理 java.lang.Error 所有错误的超类 异常处理机制 当程序中抛

黑马程序员--java基础学习笔记6

一.笔记内容概述: 面向对象(概述&举例).类与对象的之间的关系.类与对象体现&细节.对象的内存体现.成员变量和局部变量的区别.类类型参数.匿名对象.基本数据类型参数传递图解.引用数据类型参数传递图解.封装&代码示例.面向对象(封装&思想).二维数组&定义方式&内存图解&另一种定义方式&应用场景. 二.常用内容介绍: 1.面向对象的特征: a.封装:将具体动作封装起来,方便调用,提高了代码的复用性和安全性. b.继承:继承某个类后,可以直接调

黑马程序员--Java基础学习笔记【IO流-字节流、转换流】

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- IO 流 常用基类 字节流 InputStreamOutputStream 常用方法 int read() // 读取一个字节,以 int 形式返回 intread(byte[] b) // 读取最多数组长度个字节并存入该数组,返回实际读取字节 void write(int d) // 写出一个字节 voidwrite(byte[] d) // 将给定字节数组中的所有字节全部写出 void w