关于keySet()的疑问

问题描述

在Java中Set<T>是一个接口,但是在使用HashMap时,却有一个keySet()的方法,返回的是Set对象,而且Set<String>keySet=hm.keySet();能够通过编译,并运行,很是不理解,Set是接口,接口不是不能实例化么?以下是我的代码importjava.util.HashMap;importjava.util.Iterator;importjava.util.Set;publicclassMainActivity{publicstaticvoidmain(String[]args){HashMap<String,String>hm=newHashMap<String,String>();hm.put("张三","北京");hm.put("李四","天津");hm.put("王五","上海");Set<String>keySet=hm.keySet();Iterator<String>it=keySet.iterator();while(it.hasNext()){System.out.println(it.next());}}}

解决方案

解决方案二:
Set<String>keySet=hm.keySet();语句中hm.KeySet();返回的是一个实现Set接口的子类实例对象、keySet=hm.keySet();可理解为父类引用指向子类对象即是多态。
解决方案三:
keySet()函数返回了一个实现了Set接口的实例,该实例的真正实现类未开放。这个很正常啊
解决方案四:
这个实现Set的对象是什么类型?总得是一个什么Set的类对象吧,式HashSet还是其他的什么Set?
解决方案五:
hashMap.keySet()返回了一个hashSet对象hashSet不就是Set的一个实现类么?有类就有对象了啊
解决方案六:
你的接口只是一个引用,引用的对象HashSet是实例,调用的是实例中的方法。
解决方案七:
//java8/***打印map.->java8版本.**@parammaps*/privatestaticvoidshowMap(Map<Object,List<Grade>>maps){maps.forEach((key,value)->System.out.println(key));}/***打印map.java7版本.**@parammaps*/privatestaticvoidshowMap7(Map<Object,List<Grade>>maps){List<Grade>g=newArrayList<Grade>();for(Objecto:maps.keySet()){g=(List<Grade>)maps.get(o);for(inti=0;i<g.size();i++){System.out.println(g.get(i).getId()+"-->"+g.get(i).getName());}}}//listprivatestaticvoidsortArrayList(intsize){List<Integer>list=newArrayList<Integer>(size+5);Randomrandom=newRandom();for(inti=0;i<=size;i++){list.add(random.nextInt(100));}list.sort((o1,o2)->o1.compareTo(o2));list.forEach(System.out::println);}

解决方案八:
首先接口虽然不能被实例化,但可以声明该接口的变量,即Set<String>keySet;接口的变量必须引用实现了接口的类对象,即keySet=hm.keySet();剩下的就和1楼说的一样了。。。
解决方案九:
多态,同学看看相关知识
解决方案十:
接口的目的就是多种实现采用单一的调用方式,而调用者不需要知道各种实现的真正程序逻辑;对调用者来说每一个接口实例只是一个可以使用的按照其生命周期存在的方法集合。
解决方案十一:

解决方案十二:
引用1楼cacagege的回复:

Set<String>keySet=hm.keySet();语句中hm.KeySet();返回的是一个实现Set接口的子类实例对象、keySet=hm.keySet();可理解为父类引用指向子类对象即是多态。

+1
解决方案十三:
看楼主应该是刚接触java不多久吧,这就是对Set接口赋值为实现类的对象啊,hm.keySet()你可以理解为返回的是一个Hashset对象,Set<String>s=newHashSet<String>();此处hm.keySet()就是一个HashSet<String>对象,可以这样理解。
解决方案十四:
你debug一下,看看这个keySet(..)到底返回了什么?Seta=xxx;这个a只是一个引用,接口的引用可以指向任何实现了接口的类的实例,这也是实现多态的前提
解决方案十五:
LZ,接口是可以实例化的。接口和接口实现类的关系,往深了说,就是子类继承父类。父类对象完全可以初始化为子类内容。包括map也是接口,你的第一行代码:HashMap<String,String>hm=newHashMap<String,String>();,完全可以写成Map<String,String>hm=newHashMap<String,String>();可以试试看。keySet()这个方法能让你取出HashMap集合中所有的键,还有一个方法是entrySet(),能把一个集合中的关系都取出来。
解决方案:
引用3楼hanhaipianzhou的回复:

这个实现Set的对象是什么类型?总得是一个什么Set的类对象吧,式HashSet还是其他的什么Set?

可以看JDK的源码,你就知道是怎么实现的了。具体方法:
解决方案:
哦,之前没注意这个问题,返回为set虽然是接口,但是在keySet中返回的是set的子类实例,可以多态下

时间: 2024-10-31 08:15:37

关于keySet()的疑问的相关文章

java基础-学到java集合框架中对那个复写equals的疑问,求解答

问题描述 学到java集合框架中对那个复写equals的疑问,求解答 import java.util.*; class Student implements Comparable { private String name; private int age; Student(String name,int age) { this.name = name; this.age = age; } public int compareTo(Student s) { int num = new Inte

dreaweaver-关于网页边框使用的问题,新手有疑问

问题描述 关于网页边框使用的问题,新手有疑问 右下边框mp3,视频,图片--这个内嵌表格为什么不是在左上角开始,而是跑中间去了-求解 解决方案 td默认就是水平居中的,你要居上给td添加valign="top" <td width="760" valign="top"> 解决方案二: 新手使用python常见问题 解决方案三: 给table或者td写样式啊,实在不行就打开开发者工具看看居中的那个块元素在哪个位置.然后根据实际情况去加样

entryset方法-KeySet跟entrySet为什么会有两种不同的结果。。

问题描述 KeySet跟entrySet为什么会有两种不同的结果.. import java.util.*; class Student implements Comparable{ private String id; private String name; Student(String idString name) { this.id = id; this.name = name; } public String getId() { return id; } public String g

java中++a和a++ 在数组实现栈中的小疑问

问题描述 java中++a和a++ 在数组实现栈中的小疑问 package 数组实现栈; public class StackArray implements Stack { public static final int num = 1024;//数组默认容量 public int capacity;//数组实际容量 public Object s[];//对象数组 public int top = -1;//栈顶元素位置 //构建默认容量栈对象 public StackArray() { t

软件测试-linux代码覆盖率测试工具gcov的一些疑问?

问题描述 linux代码覆盖率测试工具gcov的一些疑问? 鄙人是做软件测试的,最近在使用gcov来检查代码覆盖率,我已经成功生成了一份关于touchscreen测试代码的gcov文件,但是领导说这不是他想要的...所以我想请教一下大家:1. 如果我想测试平台上的touchscreen模块,那么目的肯定是这样:首先我要看下我写的测试code是否存在多余的根本跑不到的代码,如果有,那我肯定要优化我的测试代码:其次,我肯定也要看我写的代码在linux kernel里面的覆盖情况,如果我写的测试代码在

php-ecshop获取端口的疑问

问题描述 ecshop获取端口的疑问 if (isset($_SERVER['SERVER_PORT'])) { $port = ':' . $_SERVER['SERVER_PORT']; if ((':80' == $port && 'http://' == $protocol) || (':443' == $port && ' https://' == $protocol)) { $port = ''; } } 其中 if ((':80' == $port &

汇编语言-汇编MOV的一点疑问!!!

问题描述 汇编MOV的一点疑问!!! DATA SEGMENT USE16 MES1 DB 'Please input:',0AH,0DH,'$' SD DB ? DATA ENDS 然后 MOV AH,1 INT 21H MOV SD,AL 然后就对SD进行操作了 想问下MOV的目的操作数可以是变量(SD)吗??不是只能是寄存器和存储器吗? 解决方案 MOV AH,1 INT 21H 是自动转入中断子程序的入口 通过上面两条指令,会把输入或者读取的字符放到AL中,所以是MOV SD,AL 解决

jvm-java锁竞争检测的疑问

问题描述 java锁竞争检测的疑问 看优化的书,上面提到现在JVM对锁进行了优化,有锁竞争,JVM底层先是自旋,再调用底层操作系统的锁,然后现在用看主动上下文切换,和被动上线文切换的差/NCPU*80000/频率 看是否大于百分之5,来判断是否有锁.上下文切换知道是多线程的运行导致,但是不明白主动上下切换,和被动上下文的切换的区别,以及这个公式有为什么这么来?希望懂的大牛解释下哈

openwrt luci-关于刚学习luci 界面修改时的疑问

问题描述 关于刚学习luci 界面修改时的疑问 1.通过cbi,将界面中的值修改后,会将其自动保存到相应的config中,其中的ui方式的实现方式,基本的工作流程是怎么样的? 比如说,我不想保存到etc/config下的配置文件中,想要保存到其他文件中具体该怎么做 2.entry 第一个参数path 的第三项或者之后几项的具体作用是什么, 比如说第三个参数如果我定义为"" 则无法形成我创建的界面,那我随便定义一个值,就能出现我的界面,那是否说第三个参数的值可以随我们定义,没有多大作用,