为了账号安全,请及时绑定邮箱和手机立即绑定

关于以Set集合为第二参数的foreach(第一参数:第二参数)


foreach结构中(第一参数:第二参数),第二参数应该为第一参数的数组,例如第一参数为int时,第二参数为int[];第一参数为float时,第二参数为float[];我看到课程中老师写到for(Entry:Set),for(String:Set)这样两种不同的结构,因此我想问问Set的类型是随着其元素的类型的不同而不同的吗?例如元素为String类型,那么Set为String数组,元素为Entry类型,那么Set为Entry数组,是这样吗?

正在回答

3 回答

大体意思应该是这样的。 set是集合不是数组。我在 想可不可以for(Set:Set) 有一个 Set集合里面装的是不同的Set集合。

3 回复 有任何疑惑可以回复我~
#1

慕粉2304285705 提问者

非常感谢!
2016-12-28 回复 有任何疑惑可以回复我~

更准确的说法是:Set中元素为String类型,那么引用parm1为String类型,Set中元素为Entry类型,那么引用parm1为Entry类型。而实际上引用parm1可以是Set中元素的父类型和实现的接口类型。

因为ForEach(parm1:parm2)本质上是迭代器。以使用迭代器遍历EntrySet为例

Set<Entry<String,String>>entrySet=studentMap.entrySet();

Entry<String,String>>iter=entrySet.iterator();
while(iter.hasnext()){
Entry<String,String>entry=iter.next();//迭代器中这一步可以对应foreach中--parm1:param2
//这里的entry是可以写成其父类型的,赋值时的向上造型
}

ForEach循环语句判断循环的条件是iter.hasnext(),

parm1(Entry<String,String>entry)是接受iter.next()对象的引用。parm1的类型可以是iter.next()对象的父类型或者实现的接口类型,但是由于泛型集合的约束和向上造型带来的多态性。  我们习惯把parm1和parm2中元素的类型保持一致。下面演示parm1是父类型,如下:

public class sonTest extends superTest{           
                                                  
public static void main(String[] args) {      
    // TODO Auto-generated method stub        
    Set<sonTest>sonSet=new HashSet<sonTest>();
    for(int i=0;i<10;i++){                    
    sonSet.add(new sonTest());            
    }                                         
    for(superTest T:sonSet){ }  //编译器没有报错,所以可以使用iter.next()对象的父类型或者实现的接口类型                                      
    }                                             
}                                                 
class superTest {}

回答不易,没有积分也希望能多多支持。说了这么多,其实就一句,foreach()是迭代器。

2 回复 有任何疑惑可以回复我~

是这样的。循环出来的类型要和循环的类型基本保持一致。

1 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

关于以Set集合为第二参数的foreach(第一参数:第二参数)

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信