随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题。
本文先从 HashMap 的遍历方法讲起,然后再从性能、原理以及安全性等方面,来分析 HashMap 各种遍历方式的优势与不足,本文主要内容如下图所示:
HashMap 遍历
HashMap
2024年10月10日
随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题。
本文先从 HashMap 的遍历方法讲起,然后再从性能、原理以及安全性等方面,来分析 HashMap 各种遍历方式的优势与不足,本文主要内容如下图所示:
HashMap
2024年10月10日
JavaScript作为Web开发的核心语言之一,其功能强大且灵活多变。随着ES6(ECMAScript 2015)及其后续版本的推出,JavaScript引入了许多新特性,极大地提升了开发者的生产力。本文将探讨ES中关于对象属性、Set、Map以及对象拷贝的相关技术和实践,旨在帮助开发者更好地理解和应用这些新特性。
2024年10月10日
StatefulSet是k8s中有状态应用管理的标准实现,今天就一起来了解下其背后设计的场景与原理,从而了解其适用范围与场景
首先介绍有状态应用里面的需要考虑的一些基础的事情,然后在下一章我们再去看statefulSet的关键实现
在日常开发的应用中,通常可以分为两大类:有状态与无状态,比如web服务通常都是无状态的,web应用数据主要来自后端存储、缓存等中间件,而本身并不保存数; 而诸如redis、es等其数据也是应用自身的一部分,由此可以看出有状态应用本身会包含两部分:应用与数据
2024年10月10日
list和set的区别:
1、List和Set都是接口继承于Collection接口。
2、最大的不同就是List是可以重复的。而Set是不能重复的。(注意:元素虽然无放入顺序,但是元素在set 中的位置是有该元素的3、HashCode决定的,其位置其实是固定的)
3、List接口有三个实现类:LinkedList,ArrayList,Vector ,Set接口有两个实现类:HashSet(底层由HashMap实现),LinkedHashSet
2024年10月10日
Java 基础知识点
1. 阐述
对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多。理由是:entrySet方法一次拿到所有key和value的集合;而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率。那么实际情况如何呢?
为了解遍历性能的真实差距,包括在遍历key+value、遍历key、遍历value等不同场景下的差异,我试着进行了一些对比测试。
2024年10月10日
在Python中,集合(set)是一个无序的不重复元素集。集合用于存储唯一元素,这意味着集合中的所有元素都是唯一的,没有两个元素可以相同。集合是可变的,你可以在创建后添加或删除元素。
2024年10月10日
本文已收录《面试题精选》系列,Gitee 开源地址:https://gitee.com/mydb/interview
HashMap 的遍历方法有很多种,不同的 JDK 版本有不同的写法,其中 JDK 8 就提供了 3 种 HashMap 的遍历方法,并且一举打破了之前遍历方法“很臃肿”的尴尬。
2024年10月10日
文件在各级文件夹中查找可以利用递归实现,也可以通过链表实现:
运行效果:
附一个全盘查找指定类型文件的批处理文件:
@echo off setlocal enabledelayedexpansion echo. >c:\virus.txt color 3a echo. set /a n = 0 set /p b=输入查找文件扩展名: if /i "%b%"=="" cls && goto fh echo 系统正在查找文件,请耐心等候...... echo. ::for %%a in (F E D C) do ( for %%a in (E) do ( cd /d %%a:\ for /r %%b in (*.%b%) do ( if exist "%%b" ( echo %%b echo %%b>>c:\virus.txt set /a n+=1 echo 现查到%b%文件个数:!n! ) ) ) type c:\virus.txt | find /i "\" && goto no echo. echo 文件内容没找到! del c:\virus.txt>nul 2>nul echo. pause exit :no ::cls echo. echo 文件查找完毕并记录在c:\virus.txt中 ! echo 现查到%b%文件总的个数:!n! echo. echo 是否打开文本查看记录 ? echo. echo 选择" Y "查看。 选择" N "退出。 echo. set /p Choice=Y/N: IF /I '%Choice:~0,1%'=='y' goto A IF /I '%Choice:~0,1%'=='n' goto B pause exit :A start c:\virus.txt exit pause :b exit
2024年10月10日
枚举是C语言中的一种基本数据类型,它可以用来声明一组常数(静态常量)。当一个变量有几个固定的可取值时就可以将其定义为枚举类型。枚举可以将变量值直接列出,使用时变量值只限于列举出的值范围内。很简单的例子就是日历中每周都有固定的7天,那么我们在定义星期的时候就可以用枚举。
枚举通过关键词enum来定义枚举类型,在枚举中声明该枚举类型的变量并使用该变量存储枚举元素的数值。基础类型表示该枚举中定义的所有枚举数值,枚举可以声明 byte、sbyte、short、ushort、int、uint、long 或 ulong 等基础类型,如果没有声明基础类型则默认为int类型。枚举成员是该枚举类型的常量,所以枚举成员不能具有相同的变量名。如果枚举成员没有赋值则默认第一个枚举成员值为0,往后的枚举成员值会依次顺序加1。
2024年10月10日
stl 常用遍历算法(for_each transform)
示例代码(结论在结尾!!!!)
#include<iostream>
using namespace std;
#include"vector"
#include"map"
#include"string"
#include"list"
#include"set"
#include"functional"
#include"iterator"//输出流迭代器
void printV(vector<int> &v)
{
for (vector<int>::iterator it = v.begin(); it != v.end(); it++);//用迭代器的方式打印出来
{
cout << *it << endl;
}
}
void printList(list<int> &v)
{
for (list<int>::iterator it = v.begin(); it != v.end(); it++);//用迭代器的方式打印出来
{
cout << *it << endl;
}
}
void showElem(int &n)
{
cout << n << " ";
}
class CMyShow
{
public:
CMyShow()
{
num = 0;
}
void operator()(int &n)
{
num++;
cout << n << " ";
}
void printNum()
{
cout << "num:" << num << endl;
}
protected:
private:
int num;
};
void main11_foreach()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
printV(v1);
cout << endl;
//函数对象 回调函数入口
for_each(v1.begin(), v1.end(), showElem);
cout << endl;
for_each(v1.begin(), v1.end(), CMyShow());
cout << endl;
CMyShow mya;
CMyShow my1=for_each(v1.begin(), v1.end(), mya);//初始化
my1.printNum();//打印出来了调用次数
mya.printNum();//mya my1是二个不同的对象
my1 = for_each(v1.begin(), v1.end(), mya);//给my1赋值
my1.printNum();
}
int increase(int i)
{
return i + 100;
}
void main22_transform()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
printV(v1);
cout << endl;
//使用回调函数
transform(v1.begin(), v1.end(), v1.begin(), increase);
printV(v1);
cout << endl;
//使用预定义的函数对象
transform(v1.begin(), v1.end(), v1.begin(), negate<int>());
printV(v1);
cout << endl;
//transform使用函数适配器
list<int> mylist;
mylist.resize(v1.size());
transform(v1.begin(), v1.end(), mylist.begin(), bind2nd(multiplies<int>(), 10));//第一个参数来着容器,第2个参数来自10
printList(mylist);
cout << endl;
//也可以把原酸结果直接输出到屏幕
transform(v1.begin(), v1.end(), ostream_iterator<int>(cout, " "), negate<int>());
cout << endl;
}
void main33_foreach_pk_transform()
{
vector<int> v1;
v1.push_back(1);
v1.push_back(3);
v1.push_back(5);
vector<int> v2;
for_each(v1.begin(), v1.end(), showElem);
transform(v2.begin(), v2.end(), v2.begin(), showElem);
}
void main()
{
main33_foreach_pk_transform();
main22_transform();
main11_foreach();
cout << "hello..." << endl;
system("pause");
return;
}