行业知识
学习大数据,所必需的java基础(6)
文章目录
- 集合
- Set集合介绍
- HashSet集合的介绍和使用
- LinkedHashSet的介绍以及使用
- 哈希值
- 哈希值的计算方式
- HashSet的存储去重的过程
- Map集合
- Map的介绍
- HashMap的介绍以及使用
- HashMap的两种遍历方式
- 方式1:获取key,然后再根据key获取value
- 方式2:同时获取key和value
- HashMap存储自定义对象
- Map的练习
- LinkedHashMap
- TreeSet
- TreeMap
- HashTable和Vector集合
- HashTable集合
- Vector集合
- Properties集合(属性值)
- List嵌套Map
- Map嵌套map
- 哈希表结构存储过程
- HashMap无参数构造方法的分析
- HashMap有参数的构造方法的分析
- tableSizeFor方法分析
- Node内部类的分析
- 存储元素的put方法源码
- putVal方法源码
- resize方法的扩充计算
- 确定元素存储的索引
- ��到重复哈希值的对象
集合
Set集合介绍
1.概述:set是一个接口,是Collection下的子接口
2.使用:
a.所用的方法和Collection接口中的方法一模一样
b.set接口中的方法并没有堆Collection中的方法进行任何的扩充
c.set以及下面所有的实现类集合相当是一个傀儡
因为所用的set集合底层都是依靠map集合实现的
HashSet集合的介绍和使用
1.概述:HashSet是Set接口的实现类对象
2.特点
a.元素无序
b.元素不可重复
c.无索引
d.线程不安全
3.数据结构:哈希表
jdk8之前: 哈希表 = 数组+链表
jdk8之后:哈希表 = 数组+链表+红黑树
方法
和Collection一模一样
import java.util.HashSet;import java.util.Iterator;public class test08 { public static void main(String[] args) { final HashSet set = new HashSet(); set.add("张三"); set.add("李四"); set.add("王五"); set.add("孙六"); System.out.println(set); Iterator iterator = set.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } System.out.println("======================="); for (String s : set) { System.out.println(s); } }}运行结果
LinkedHashSet的介绍以及使用
概述 LinkedHashSet extends HashSet
特点:
a.元素有序
b.元素布克重复
c.无索引
d.线程不安全
数据结构
哈希表+双向链表
使用 和HashSet一样
public static void main(String[] args) { final HashSet set = new HashSet(); set.add("张三"); set.add("李四"); set.add("王五"); set.add("孙六"); set.add("张三"); System.out.println(set); Iterator iterator = set.iterator(); while (iterator.hasNext()){ System.out.println(iterator.next()); } System.out.println("======================="); for (String s : set) { System.out.println(s); } }哈希值
概述 计算机计算出来的一个十进制数,我们可以理解为是对象的地址值
获取哈希值:Object类中的
int hashCode()
结论:
如果内容一样,哈希值一定一样
如果内容同不用,哈希值也有可能不一样
public class test10 { public static void main(String[] args) { String s1 = "abc"; String s2 = "abc"; System.out.println(s1.hashCode()); System.out.println(s2.hashCode()); System.out.println("=================="); String s3 = "通话"; String s4 = "重地"; System.out.println(s3.hashCode()); System.out.println(s4.hashCode()); }}运行结果
哈希值的计算方式
通过进入String的hashCode方法,查看相关的代码
public int hashCode() { int h = hash; if (h == 0 && value.length > 0) { char val[] = value; for (int i = 0; i从上述代码中看到31作为常量相乘,31是一个质数,因为31这个数可以尽可能的解决哈希碰撞问题
尽量的不出现,内容不一样,但是哈希值一样的问题
HashSet的存储去重的过程
1.计算元素的哈希值,比较元素哈希值
2.如果哈希值不一样,直接存
3.如果哈希值一样,再比较内容(equals)
4.如果哈希值不一样,内容一样,存
5.如果哈希值一样,内容一样,去重复,后面的会把前面的覆盖掉
Map集合
Map的介绍
概述:双列集合的顶级接口
组成部分
一个元素是有两部分构成
key = value ----- 键值对
HashMap的介绍以及使用
概述:是Map的实现类
特点:
a.元素无序
b.key唯一,value可重复
c.无索引
d.线程不安全
数据结构:哈希表
常用方法
V put(K key, V value) -> 存储元素
V remove(Object key) ->根据key删除对应的键值对
V get(Object key) -> 根据key获取对应的value
boolean containsKey(Object key) ->判断Map中是否包含指定的key
Collection values() -> 将Map中所有的value存储到Collection集合中
Set keySet() -> 将Map中所有的key获取出来存到Set集合中
Set entrySet() -> 获取Map中所有的键值对对象,放到set集合中
public class test { public static void main(String[] args) { final HashMap set = new HashMap(); //存储元素 set.put(0001,"李云龙"); set.put(0002,"丁伟"); set.put(0003,"孔捷"); System.out.println(set); //根据key删除对应的键值对 set.remove(0001); System.out.println(set); //根据key获取对应的Value System.out.println(set.get(2)); //判断map中是否含有指定的key System.out.println(set.containsKey(1)); }}注意 如果key重复了,后米的会把前面的覆盖掉,去重复过程和set一模一样
HashMap的两种遍历方式
方式1:获取key,然后再根据key获取value
Set keySet() ----- 将Map中所有的key获取出来存到Set集合中
public class test02 { public static void main(String[] args) { final HashMap hashMap = new HashMap(); hashMap.put(1,"李云龙"); hashMap.put(2,"丁伟"); hashMap.put(3,"孔捷"); /* * 先调用keySet方法,获取map中所有的key,存储到Set集合中 * 遍历Set集合,调用map中的get方法,根据key获取value * */ Set set = hashMap.keySet(); for (Integer key : set) { String value = (String) hashMap.get(key); System.out.println(key + "....." + value); } }}方式2:同时获取key和value
Set entrySet() — 获取Map中所有的键值对对象,放到set集合中
1.我们只需要获取到每个键值对的条目就行了
2.拿到条目,就能拿到条目上的key和value
3.记录key和value的条目, Map中的静态接口 — Map.Entry
Map.Entry中有两个方法
getKey() 获取key
getValue() 获取value
Set set1 = hashMap.entrySet(); for (Map.Entry integerObjectEntry : set1) { Integer key = integerObjectEntry.getKey(); String value = (String) integerObjectEntry.getValue(); System.out.println(key + "...." + value); }HashMap存储自定义对象
1.key存储自定义对象,value类型随意
2.需要key重写hashCode和equals方法
相关代码
public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); }}public class test03 { public static void main(String[] args) { HashMap hashMap = new HashMap(); hashMap.put(new Person("李云龙",18),"独立团"); hashMap.put(new Person("孔捷",26),"新一团"); hashMap.put(new Person("丁伟",26),"新二团"); System.out.println(hashMap); }}Map的练习
需求:用Map集合统计字符串中每一个字符出现的次数
步骤
1.创建Scanner对象,调用next方法录入字符串
2.创建HashMap集合,key为String用于存储字符串,value作为Integer用于存储字符对应的个数
3.遍历字符串,判断,集合中有没有该字符
4.如果没有,将该字符以及对用的1存到Map集合中
5.如果有,根据该字符获取对用的value,对value进行加一
6.将该字符以及对用的value值存进去
7.输出
public class test03 { public static void main(String[] args) { System.out.println("请输入字符串"); final Scanner scanner = new Scanner(System.in); String data = scanner.next(); final HashMap hashMap = new HashMap(); char[] chars = data.toCharArray(); for (char aChar : chars) { String achar = aChar + ""; if (!hashMap.containsKey(achar)){ hashMap.put(achar,1); }else { int value = hashMap.get(achar); value ++; hashMap.put(achar,value); } } System.out.println(hashMap); }}LinkedHashMap
概述 LinkedHashMap extends HashMap
特点:
a.有序
b.无索引
c.key唯一,value可重复
d.线程不安全
数据结构
哈希表+双向链表
用法:和HashMap一样
public class test04 { public static void main(String[] args) { final LinkedHashMap hashMap = new LinkedHashMap(); hashMap.put("001","李云龙"); hashMap.put("002","丁伟"); hashMap.put("003","孔捷"); System.out.println(hashMap); //使用keyset方式遍历 final Set set = hashMap.keySet(); for (String s : set) { final String s1 = hashMap.get(s); System.out.println(s+"...."+s1); } //使用entrySet方式遍历 final Set entries = hashMap.entrySet(); for (Map.Entry entry : entries) { System.out.println(entry.getKey()+ "...." +entry.getValue()); } }}TreeSet
1.概述:ThreeSet是Set接口的实现类
2.特点:
a.可以对元素进行排序
b.元素唯一
c.无索引
d.线程不安全
3.数据结构
红黑树
4.方法 和HashSet一样
构造
TreeSet() — 对元素进行自然排序 ---- ASCII
TreeSet(Comparator
上一篇:电脑服务器增加带宽怎么办?
下一篇:服务器怎么进入编辑器?