2024年Java最全新手小白学JAVA Set HashSet Map HashMap,java面试问项目中遇到的技术难点

本文详细介绍了Java面试中可能涉及的分布式技术、面试解析以及HashMap和Set接口的使用,包括数据结构的实践操作和面试常见问题。同时推荐了一线大厂的系统化学习资料。
摘要由CSDN通过智能技术生成

最后

分布式技术专题+面试解析+相关的手写和学习的笔记pdf

还有更多Java笔记分享如下:

image

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

//4.2想要遍历集合就需要获取集合的迭代器

Iterator it = keySet.iterator();

//4.3循环迭代集合中的所有元素

while(it.hasNext()){//判断是否有下一个元素可以迭代

Integer key = it.next();//拿到本轮循环中获取到的map的key

String value = map.get(key);

System.out.println(“{”+key+“,”+value+“}”);

}

/**方式二:

  • 遍历map集合,需要把map集合先转成set集合

  • 是把map中的一对键值对key&value作为一个Entry<K,V>整体放入set

  • 一对K,V就是一个Entry*/

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

//获取迭代器

Iterator<Map.Entry<Integer, String>> it2 = entrySet.iterator();

while(it2.hasNext()){//判断是否有下一个元素可迭代

//本轮遍历到的一个Entry对象

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

Integer key = entry.getKey();//获取Entry中的key

String value = entry.getValue();//获取Entry中的value

System.out.println(“{”+key+“,”+value+“}”);

}

}

}

在这里插入图片描述

2 HashMap

===============================================================================

2.1 前言


HashMap的键要同时重写hashCode()和equlas()

hashCode()用来判定二者的hash值是否相同,重写后根据属性生成

equlas()用来判断属性的值是否相同,重写后,根据属性判断

–equlas()判断数据如果相等,hashCode()必须相同

–equlas()判断数据如果不等,hashCode()尽量不同

2.2 HashMap的存储过程:


  1. HashMap的结构是数组+链表 或者 数组+红黑树 的形式

  2. HashMap底层的Entry[ ]数组,初始容量为16,加载因子是0.75f,扩容按约为2倍扩容

  3. 当存放数据时,会根据hash(key)%n算法来计算数据的存放位置,n就是数组的长度,其实也就是集合的容量

  4. 当计算到的位置之前没有存过数据的时候,会直接存放数据

  5. 当计算的位置,有数据时,会发生hash冲突/hash碰撞

解决的办法就是采用链表的结构,在数组中指定位置处以后元素之后插入新的元素

也就是说数组中的元素都是最早加入的节点

  1. 如果链表的长度>8且数组长度>64时,链表会转为红黑树,当链表的长度<6时,红黑树会重新恢复成链表

在这里插入图片描述

2.3 练习:获取HashMap的数据


创建包: cn.tedu.map

创建类: TestHashMap.java

package cn.tedu.collection;

import java.util.HashMap;

/*本类用于HashMap的练习/

public class TestHashMap {

public static void main(String[] args) {

//创建HashMap对象

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

/**

  • 源码摘抄:

  • static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

  • 初始容量为1<<4,相当于1*(2^4)=16

  • static final float DEFAULT_LOAD_FACTOR = 0.75f;

  • 默认的加载因子是0.75,也就是说存到75%开始扩容,按照2的次幂进行扩容

*/

/*

  • 达到容量的加载因子后,就会重新开辟空间,重新计算所有对象的存储位置,也叫做rehash

  • 设置初始容量与加载因子要讲求相对平衡,如果加载因子过低,则rehash过于频繁,影响性能

  • 如果初始容量设置太高或者加载因子设置太高,影响查询效率

*/

}

}

2.4 练习:字符串中字符统计


创建包: cn.tedu.map

创建类: TestMap.java

package cn.tedu.map;

import java.util.HashMap;

import java.util.Map;

import java.util.Scanner;

/*本类用于练习map案例:统计字符串中字符的个数

  • 需求效果:用户输入aabbbcc,输出:a=2,b=3,c=2*/

public class TestMap2 {

public static void main(String[] args) {

//1.接收用户输入的字符串

System.out.println(“请您输入要统计的字符串:”);

String input = new Scanner(System.in).nextLine();

//2.准备一个map集合,用来存放出现的字符Character与字符的个数Integer

//为什么字符类型Character作为map中的KEY?因为key不允许重复,而次数是可以重复的

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

//3.准备要存入map中的数据:K和V

//3.1 遍历用户输入的字符串,统计每个字符

for (int i = 0; i < input.length(); i++) {

//3.2获取本轮循环中遍历到的字符

char key = input.charAt(i);

//System.out.println(key);//打印查看每轮循环获取到的字符,没有问题

//3.2根据获取到的key拿到对应的value

Integer value = map.get(key);//根据字符,获取map中这个字符保存的次数

if(value == null){//之前这个字符没有出现过,次数还是Integer的默认值null

map.put(key,1);//没有出现过,次数就设置为1

}else {//value不是null走else

map.put(key,value+1);//之前这个字符出现过,次数变为之前的次数+1

}

}

System.out.println(“各个字符出现的次数为:”+map);

}

}

3 set接口

=============================================================================

在这里插入图片描述

3.1 概述


  1. Set是一个不包含重复数据的Collection

  2. Set集合中的数据是无序的(因为Set集合没有下标)

  3. Set集合中的元素不可以重复 – 常用来给数据去重

3.2 Set集合的特点


  1. 数据无序且数据不允许重复

  2. HashSet : 底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K,存入内部的HashMap中。当然K仍然不许重复。

  3. TreeSet : 底层是TreeMap,也是红黑树的形式,便于查找数据

3.3 常用方法


学习Collection接口中的方法即可

3.4 HashSet


3.4.1 概述

底层是哈希表,包装了HashMap,相当于向HashSet中存入数据时,会把数据作为K存入内部的HashMap中,其中K不允许重复,允许使用null.

在这里插入图片描述

在这里插入图片描述

3.5 练习: Set相关测试


创建包: cn.tedu.collection

创建类: TestSet.java

package cn.tedu.collection;

import java.util.Arrays;

import java.util.HashSet;

import java.util.Set;

/本类用于测试Set/

public class TestSet {

public static void main(String[] args) {

//1.创建对应的集合对象

Set set = new HashSet<>();

//2.存入数据

set.add(“紫霞仙子”);

set.add(“至尊宝”);

set.add(“蜘蛛精”);

set.add(“紫霞仙子”);

set.add(null);

/*1.set集合中的元素都是没有顺序的

  • 2.set集合中的元素不能重复

  • 3.set集合可以存null值,但是最多只有一个*/

System.out.println(set);//[蜘蛛精, null, 至尊宝, 紫霞仙子]

//3.常用方法测试

System.out.println(set.contains(“唐僧”));//false,判断是否包含指定元素

System.out.println(set.isEmpty());//false,判断是否为空

System.out.println(set.remove(null));//true,移除指定的元素

System.out.println(set);//[蜘蛛精, 至尊宝, 紫霞仙子]

System.out.println(set.size());//3,获取集合中元素的个数

System.out.println(Arrays.toString(set.toArray()));//[蜘蛛精, 至尊宝, 紫霞仙子],将集合转为数组

//4.1创建set2集合,并向集合中存入数据

Set set2 = new HashSet<>();

set2.add(“小兔纸”);

set2.add(“小脑斧”);

set2.add(“小海疼”);

set2.add(“小牛犊”);

System.out.println(set2);//[小兔纸, 小海疼, 小牛犊, 小脑斧]

System.out.println(set.addAll(set2));//将set2集合的所有元素添加到set集合中

System.out.println(set);//[蜘蛛精, 小兔纸, 小海疼, 至尊宝, 小牛犊, 小脑斧, 紫霞仙子]

System.out.println(set.containsAll(set2));//判断set2集合的所有元素是否都在set集合中

System.out.println(set.removeAll(set2));//删除set集合中属于set2集合的所有元素

System.out.println(set);//[蜘蛛精, 至尊宝, 紫霞仙子]

System.out.println(set.retainAll(set2));//只保留set集合中属于set和set2集合的公共元素

System.out.println(set);//[]

//5.集合的迭代

Iterator it = set2.iterator();//5.1获取集合的迭代器

while(it.hasNext()) {//5.2判断集合是否有下个元素

String s = it.next();//5.3如果有,进循环获取当前遍历到的元素

System.out.println(s);

}

}

}

3.6 练习: Set相关测试2


创建包: cn.tedu.collection

创建类: Student.java

package cn.tedu.collection;

import java.util.Objects;

//1.创建自定义引用类型Student

public class Student {

//2.创建属性

String name;//姓名

int id;//学号

//3.提供本类的全参构造

public Student(String name, int id) {

this.name = name;

this.id = id;

}

//3.2提供学生类的toString()

@Override

public String toString() {

return “Student{” +

最后

俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!

另外,给大家安排了一波学习面试资料:

image

image

以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

g toString() {

return “Student{” +

最后

俗话说,好学者临池学书,不过网络时代,对于大多数的我们来说,我倒是觉得学习意识的觉醒很重要,这是开始学习的转折点,比如看到对自己方向发展有用的信息,先收藏一波是一波,比如如果你觉得我这篇文章ok,先点赞收藏一波。这样,等真的沉下心来学习,不至于被找资料分散了心神。慢慢来,先从点赞收藏做起,加油吧!

另外,给大家安排了一波学习面试资料:

[外链图片转存中…(img-h6mdHHvk-1714891233119)]

[外链图片转存中…(img-ijsnuNdp-1714891233120)]

以上就是本文的全部内容,希望对大家的面试有所帮助,祝大家早日升职加薪迎娶白富美走上人生巅峰!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值