Day07 set集合与map集合
来源:互联网 发布:mcake 知乎 编辑:程序博客网 时间:2024/06/01 10:10
Set接口的特点
遍历集合对象的方式(三种):
转数组 ----- 迭代器 -------- 增强for
Set体系的集合:
A:无序 B:无索引 C:不允许重复
HashSet使用&唯一性原理
* 通过查看源码发现:
* HashSet的add()方法,首先会使用当前集合中的每一个元素和新添加的元素进行hash值比较,
* 如果hash值不一样,则直接添加新的元素
* 如果hash值一样,比较地址值或者使用equals方法进行比较
* 比较结果一样,则认为是重复不添加
* 所有的比较结果都不一样则添加
初步优化:
public int hashCode() {
return 1;
}
@Override
public boolean equals(Object obj) {
Student s = (Student)obj; //将object对象向下转型,才能获得子类的特有属性
if(this.age !=s.age){ //this.是对象的成员变量, s.是待比较的成员
returnfalse;
}
if(!this.name.equals(s.name) ){
returnfalse;
}
returntrue;
}
hashCode方法优化:
* 我们发现当hashCode方法永远返回整数1时,所有对象的hash值都是一样的,
* 有一些对象他的成员变量完全不同,但是他们还需要进行hash和equals方法的比较,
* 如果我们可以让成员变量不同的对象,他们的hash值也不同,这就可以减少一部分equals方法的比较
* 从而可以提高我们程序的效率
实现思路:
* 可以尝试着让hashCode方法的返回值和对象的成员变量有关 //return age;
* 可以让hashCode方法返回所有成员变量之和,returnage + name.hashCode();
* 让基本数据类型直接想加,然后引用数据类型获取hashCode方法返回值后再相加,(boolean不可以参与运算)
优化需要做到的就是当两个对象内容完全相同时,我们根本不想执行equals方法去比较,直接先用hash地址方法比较出他们的相同就可以避免再用equals方法去比较了,提高了比较效率.所以先优化hash算法,再完善equals的比较策略和内容.
然后再优化equals()
@Override
public boolean equals(Object obj) {
//提高效率 对象相同
if(this == obj) {
return true;
}
//提高健壮性 是否同一类型的对象
if(this.getClass() != obj.getClass()) {
return false;
}
最后我们发现直接快捷键生成的hash和equals方法设计的逻辑更缜密,我他妈还写个叽霸.
Collections(一个工具类)中的方法
* Collections:
* 面试题:Collection和Collections有什么区别?
* Collection是集合体系的最顶层,包含了集合体系的共性(其子类list和set类 )
* Collections是一个工具类,方法都是用于操作Collection
使用的格式:
Collections.swap(list,0,1);两索引处位置互换
Collections.sort(list);自然顺序进行排序
Collections.shuffle(list);傻否,随机置换
Collections.reverse(list);反转
Collections.fill(list, "android");列表的所有元素填充
Collections.copy(dest, src);
把源列表中的数据覆盖到目标列表
//注意:目标列表的长度至少等于源列表的长度
//创建源列表
int index = Collections.binarySearch(list,4);
使用二分查找法查找指定元素在指定列表的索引位置
HashMap集合
Map接口概述(双列顶层父接口)
需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
* Map的常用功能:
* 映射功能:将key映射到value,如果key存在,则覆盖value,并将原来的value返回
* map.put("ITCAST001","张三") ;
* 获取功能:
* map.get("ITCAST002")
* map.size()
* 判断功能:
* map.containsKey("ITCAST003") 判断指定key是否存在
; map.containsValue("王五") 判断指定的value是否存在
map.isEmpty()
* 删除功能:
* map.clear();
map.remove("ITCAST005") 根据指定的key删除对应关系,并返回key所对应的值,如果没有删除成功则返回null
* 遍历功能:
* Set<Map.Entry<K,V>> entrySet()
获取map集合中所有的key与所有的value:
* Set<K>keySet() keyset返回的是set集合,因为key不能重复与set特点吻合
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key);
}
* Collection<V>values() value返回的是collection的集合
Collection<String> values = map.values();
for (String value : values) {
System.out.println(value);
}
//创建Map对象
Map<String,String>map = newHashMap<String,String>();
Map的两种遍历方式
利用keySet()方法遍历
Set<String> keys = map.keySet();
for (String key : keys) {
Stringvalue = map.get(key);
System.out.println("key:" + key +"---" +"value:" + value);
}
利用entrySet()方法遍历
Set<Map.Entry<String,String>> entrys =map.entrySet();
for (Map.Entry<String, String> entry :entrys) {因为Entry是map的内部类,所以要在Entry前加Map.要明确Map.Entry<String, String>就是一个类
String key= entry.getKey(); //内部类对象entry中的getKey方法
Stringvalue = entry.getValue(); // 内部类对象entry类中的getValue方法
System.out.println("丈夫:" + key +"---" +"媳妇:" + value);
}
广义化得出第三种iterator方法
Set<Entry<String,String>> entrySet =map.entrySet();
Iterator<Entry<String,String>> ite = entrySet.iterator();
while(ite.hasNext()){
Entry<String,String> entry = ite.next();
String key =entry.getKey();
String value =entry.getValue();
System.out.println(key+"-----" +value);
其中不能使用
String key = ite.next().getKey();
String value = ite.next().getValue();
因为next指向下一个位置,会导致错误.
直接获取map中所有的value值,并遍历打印
Map<String ,String > map =new HashMap<String , String >();
map.put("ITCAST001","鹿晗");
map.put("ITCAST002","邓超");
map.put("ITCAST003","陈赫");
//直接获取map中所有的value值,并遍历打印
Collection<String > col =map.values();
for (Stringstring :col) {
System.out.println(string);
}
System.out.println(col);
可变参数
格式:
实参: 一个参数一个参数的传递
形参: 类型…变量名
注意
1.在可变参数之后不可以再追加参数
2.参数的数量定义, 可以给多个甚至也可以一个都不不给
主方法中:getSum(1,2,3,4);
Public static int getSum(int…num){
int sum =0;
for(int i = 0; i < num.length; i++){
sum+=num[i];
}
return sum;
}
Map中嵌套Map
学校Map
基础班 基础班学生Map
就业班 就业班学生Map
Map<String,Map<String,String>> itheima= new HashMap<String,Map<String,String>>();
Map<String,String> base = newHashMap<String,String>();
Map<String,String> job = newHashMap<String,String>();
Set<String> keys =itheima.keySet();//先获取所有的班级
for(String key : keys) {
System.out.println("班级名称:" + key); //输出班级名称
//根据班级获取对应的所有学生
Map<String,String>stus = itheima.get(key);
//获取所有学生的学号
Set<String>nums = stus.keySet();
for(String num : nums) {
//根据学号获取学生姓名
Stringname = stus.get(num);
System.out.println("学号:" + num + ",姓名:" + name);
}
}
作业补充;
Arrays.toString(arr2);的方法直接把数组转换成符串,可以拿来输出
集合回顾:
- Day07 set集合与map集合
- set 集合与 map集合
- List、Map与Set集合
- 集合:set 与 映射 map
- java 集合set与Map
- Java集合研究一:Set与Map
- Set,Map集合与数组互转
- List集合、Set集合、Map集合
- 集合,list,set,map
- Set、Map集合
- List、Set、Map集合
- colloection-map,set集合
- List、Set、Map集合
- 集合list,set,map
- Set,List,Map 集合
- 9.29 集合set与映射map 之map
- java、Set集合和Map集合
- List、Set集合Map集合的遍历
- 解决BMap is not defined?
- 区块链初识
- UNIX网络编程学习之一:socket的简介
- DAY2 模拟考试第三题 情书的代价
- Unity_FPS游戏_Xml文件读取流程_01
- Day07 set集合与map集合
- 针对多字段对单字段查询的解决方案
- Java任务超时处理
- 机器学习:L1与L2正则化项
- hbase GC时间过程导致进程挂掉问题
- C++之快速排序(3)---《那些奇怪的算法》
- vue入门
- DNS域传送漏洞
- [Codeforces]Round #435 (Div. 2)