没有第一种方式,Set是个接口,是不能够实例化(new)的,你只能实例化它的实现类,HashSet就是Set的一个实现类。第二种方式你也可以给它加,这叫泛型,就是限制这个类里只能传你指定的类型及其子类。由于Java所有对象的类是Object类,所以如果不写就默认是Object类,所有类的最顶级父类都是Object,所以传什么都可以,Set setTmp = new HashSet();和Set setTmp = new HashSet();两种方式是等价的。Java有八种基本数据类型,是不属于Object类的子类的,byte, short, int,long,char,double,float,boolean,对这八种类有他们各自的包装类,依次是Byte,Short,Integer,Long,Character,Double,Float,Boolean,这八个包装类是Object的子类,是可以作为Set的类型用的,也就是你可以写成Set 但是不能写成Set.