『壹』 java中List、Set、Map接口之间的区别和联系
List 用于遍历一个数组时效率最高;比如在循环显示所有信息时经常用到;
Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象;虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是Set和List的根本区别。 Map 就是键值对map(键,值),键是Sting 类型 值是Object (对象类型),所以在知道某条信息的一项时查询其他项就用该方法,效率最高!(以上个人见解!)
详细:数组和其它容器的区别主要有三方面:效率,类型,和保存基本类型的能力.在Java中,数组是一种效率很高的存储和随机访问对象引用序列的方式.数组是一 个简单的线性序列,因此访问速度很快,但也损失了其它一些特性.创建一个数组对象后,大小就固定了,如果空间不够,通常是再创建一个数组,然后把旧数组中 的所有引用移到新数组中.数组可可以保存基本类型,容器不行.
容器类不以具体的类型来处理对象,而是将所有的对象都以Object类型来处理,所以我们可以只创建一个容器,任意的Java对象都可以放进去.容器类可 以使用包装类(Integer,Double等),以便把基本类型放入其中. List Set Map 都可以自动调整容量,数组不能.
Collection表示一组对象,这些对象也称为collection的元素。一些 collection允许有重复的元素,而另一些则不允许。一些collection是有序的,而另一些则是无序的。JDK中不提供此接口的任何直接实 现,它提供更具体的子接口(如 Set 和 List)实现.
Map 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射一个值.Map 接口提供三种collection视图,允许以键集、值集合或键值映射关系集的形式查看某个映射的内容。某些映射实现可明确保证其顺序,如 TreeMap(有序) 类;某些映射实现则不保证顺序,如 HashMap(无序) 类。Map可以像数组那样扩展成多维数组,只要把每个值也做成一个Map就行了.
Collection和Map是Java容器中的两种基本类型. 区别在于容器中每个位置保存的元素个数.Collection每个位置只能保存一个元素,包括List和Set.其中List以进入的顺序保存一组元素; 而Set中的元素不能重复.ArrayList是一种List,HashSet是一种Set,将元素添加入任意Collection都可以使用add() 方法.Map保存的是健值对.使用put()为Map添加元素,它需要一个健和一个值作参数.
ArrayList和LinkedList都实现了List接口,ArrayList底层由数组支持LinkedList由双向链表支持,因此,如果经常在表中插入或删除元素LinkedList比较适合,如果经常查询ArrayList比较适合.
Set的实现有TreeSet,HashSet,LinkedHashSet,HashSet查询速度最快,LinkedHashSet保持元素插入次序,TreeSet基于TreeMap,生成一个总是处于排序状态的Set.
Collection<--List<--Vector
Collection<--List<--ArrayList
Collection<--List<--LinkedList
Collection<--Set<--HashSet
Collection<--Set<--HashSet<--LinkedHashSet
Collection<--Set<--SortedSet<--TreeSet
Vector : 基于Array的List,其实就是封装了Array所不具备的一些功能方便我们使用,它不可能走入Array的限制。性能也就不可能超越Array。所以,在可能的情况下,我们要多运用Array。另外很重要的一点就是Vector“sychronized”的,这个也是Vector和ArrayList的唯一的区别。
ArrayList:同Vector一样是一个基于Array上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector优越一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。
LinkedList:LinkedList不同于前面两种List,它不是基于Array的,所以不受Array性能的限制。它每一个节点(Node)都包含两方面的内容:1.节点本身的数据(data);2.下一个节点的信息(nextNode)。所以当对LinkedList做添加,删除动作的时候就不用像基于Array的List一样,必须进行大量的数据移动。只要更改nextNode的相关信息就可以实现了。这就是LinkedList的优势。
List总结:
1. 所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-Value键值对。例如:[ tom,1,c ];
2. 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ];
3. 所有的List中可以有null元素,例如[ tom,null,1 ];
4. 基于Array的List(Vector,ArrayList)适合查询,而LinkedList(链表)适合添加,删除操作。
HashSet:虽然Set同List都实现了Collection接口,但是他们的实现方式却大不一样。List基本上都是以Array为基础。但是Set则是在HashMap的基础上来实现的,这个就是Set和List的根本区别。HashSet的存储方式是把HashMap中的Key作为Set的对应存储项。看看HashSet的add(Object obj)方法的实现就可以一目了然了。
public boolean add(Object obj)
{
return map.put(obj, PRESENT) == null;
}
这个也是为什么在Set中不能像在List中一样有重复的项的根本原因,因为HashMap的key是不能有重复的。
LinkedHashSet:HashSet的一个子类,一个链表。
TreeSet:SortedSet的子类,它不同于HashSet的根本就是TreeSet是有序的。它是通过SortedMap来实现的。
Set总结:
1. Set实现的基础是Map(HashMap);
2. Set中的元素是不能重复的,如果使用add(Object obj)方法添加已经存在的对象,则会覆盖前面的对象;
http://user.qzone.qq.com/530536333/blog/1283866146
List接口对Collection进行了简单的扩充,它的具体实现类常用的有ArrayList和LinkedList。你可以将任何东西放到一个List容器中,并在需要时从中取出。ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快,而LinkedList的内部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作。在具体应用时可以根据需要自由选择。前面说的Iterator只能对容器进行向前遍历,而ListIterator则继承了Iterator的思想,并提供了对List进行双向遍历的方法。
Set接口也是Collection的一种扩展,而与List不同的时,在Set中的对象元素不能重复,也就是说你不能把同样的东西两次放入同一个Set容器中。它的常用具体实现有HashSet和TreeSet类。HashSet能快速定位一个元素,但是你放到HashSet中的对象需要实现hashCode()方法,它使用了前面说过的哈希码的算法。而TreeSet则将放入其中的元素按序存放,这就要求你放入其中的对象是可排序的,这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口。有时多个类具有相同的排序算法,那就不需要在每分别重复定义相同的排序算法,只要实现Comparator接口即可。集合框架中还有两个很实用的公用类:Collections和Arrays。Collections提供了对一个Collection容器进行诸如排序、复制、查找和填充等一些非常有用的方法,Arrays则是对一个数组进行类似的操作。
Map是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求。你可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。Map有两种比较常用的实现:HashMap和TreeMap。HashMap也用到了哈希码的算法,以便快速查找一个键,TreeMap则是对键按序存放,因此它便有一些扩展的方法,比如firstKey(),lastKey()等,你还可以从TreeMap中指定一个范围以取得其子Map。键和值的关联很简单,用pub(Object key,Object value)方法即可将一个键与一个值对象相关联。用get(Object key)可得到与此key对象所对应的值对象。
『贰』 java中抽象类和接口的区别
抽象类是用来捕捉子类的抄通用特性的 。它不能被实例化,只能被用作子类的超类。抽象类是被用来创建继承层级里子类的模板。
接口是抽象方法的集合。如果一个类实现了某个接口,那么它就继承了这个接口的抽象方法。这就像契约模式,如果实现了这个接口,那么就必须确保使用这些方法。接口只是一种形式,接口自身不能做任何事情。
(2)java接口的性质扩展阅读:
抽象类往往用来表征对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
通常在编程语句中用 abstract 修饰的类是抽象类。在C++中,含有纯虚拟函数的类称为抽象类,它不能生成对象;在java中,含有抽象方法的类称为抽象类,同样不能生成对象。
抽象类是不完整的,它只能用作基类。在面向对象方法中,抽象类主要用来进行类型隐藏和充当全局变量的角色。
『叁』 java开发的项目中模块、包、类、接口的关系是什么
让我谈谈流程为导向,面向对象,这是两个思想流派,他们是能够实现的能力,使用该程序来完成一件事。
唯一的思维方式是不一样的。
面向过程的一件事,一个项目分解成一个函数的小功能。
面向对象的事情,作为一个小对象或这些对象之间的相互关系组成的一个小部分组成,构成了整个项目。
一切是一个面向对象的思想的对象,我,你,他也是。
“类”是一个抽象的对象,或进行了总结。例如,你可以为人类总结。
整体而言,类是抽象的虚拟对象是有生命的东西。
是一个类,我你他是对象。
一般的面向对象编程方法,设计一个类,然后创建一个这个类的对象。
经过这个对象的相关业务。
点:操作的对象,对象不要紧经营。
这里谈谈如何设计一个类,
类有一些封装的性质和功能。
面向过程的思想,程序通常是一个函数,这些函数的相互调用。
形成一个完整的方案来解决问题。其基本结构是:
函数()
{
......;
}
函数的两()
{
......;
}
......
主要功能()
{
......;
}
?
?
然而,在面向对象的思想是包在一起,形成一个类。
类
{
?函数A()
?{
?......;
?}
功能二()
?{
?......;
?}
?......
}
?
?
产生一个对象,那么这个类:从类的类名学生
方法是生成对象:学生S1;
在这里,s1是一个对象,它生产的对象可以是相关的操作。
操作方法,如:S1是函数();
等等。在这篇文章中的具体细节就不说了只说想。
这是普通的一点是,在具体实施过程中的类,然后生成一个对象,该对象来调用相关的操作。
如果在面向过程的功能封装成类,然后对象的操作。
A类包,它通常作为一个模块,其他类型的呼叫需要的时候。
类是一个抽象的,抽象的东西一些共同的特点,总结提出的公共部分的包一起。
包,已经上面说的,装在一个容器内的一些性质和功能。
在这里,我用一个游戏来解释:
假设我们想成为游戏内打怪的游戏类似,简单,怪不要打,只有玩的人。
他的血液不断减少,直至死亡。
所有的怪物在抽象的共同特点,所以我们得到了一个类:怪物
级怪物
{
??炭怪物名称;
?血液;
?怪物(怪物N,血列印)/ *构造函数* /
?{
怪物的名字吗?=怪物名称n;
?血=血N;
?}
毒打功能(?)
?{
?血液减少;
?}
?判断功能()
?{
?(血== 0)
?输出(“你赢了!”);
?}
?玩游戏()
?{
?(血> 0)
?{
?毒打函数();
??判断函数();
?}
?}
}
?
在这样一个怪物类属性的定义:怪物名称,血液和功能:结构殴打,确定
根据这种情况,可以产生一个对象。
一个类可以有任意数量的对象,区分这些对象,取决于构造函数。
让我们继续写我们的计划
主要的主要功能
无效的主要()
{
/ ******对象产生****** /?
?怪物怪物(“狼来了”,5000);
?怪物怪物(“老虎”,8000);
怪物怪物(“蛇”,3000);
开始我们的游戏?/ **为了几个对象** /
?怪物玩游戏();
?怪物玩游戏();
?怪物玩游戏();
}
?
然后主要的功能,我们已经建立了三个对象,它们共享一个类。
可以看到,类相当于一个组件,模块,我们需要建立它的对象,将是能够实现他的功率封装
可以。
这是面向对象的优点,可重复使用,不必每一个用于重写。
尽管如此,感觉,还是没有说明白,真的有点只能意味着说不出的感觉。
事实上,如果这本书,真正认真写了一些东西,他们可以理解,感到无形的。