仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 487|回复: 7
打印 上一主题 下一主题

[学习教程] 来看Java汇合进修(六) Vector具体先容(源码剖析)和利用示例

[复制链接]
莫相离 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:00:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
如果你学习的是市场营销,是销售,也许参加大课堂的学习会更合适,因为你的工作能力中有个基础就是搭建自己的人脉,
学完ArrayList和LinkedList以后,我们接着进修Vector。进修体例仍是和之前一样,先对Vector有个全体熟悉,然后再进修它的源码;最初再经由过程实例来学会利用它。
第1部分Vector先容
Vector简介
Vector是矢量行列,它是JDK1.0版本增加的类。承继于AbstractList,完成了List,RandomAccess,Cloneable这些接口。
Vector承继了AbstractList,完成了List;以是,它是一个行列,撑持相干的增加、删除、修正、遍历等功效。
Vector完成了RandmoAccess接口,即供应了随机会见功效。RandmoAccess是java顶用来被List完成,为List供应疾速会见功效的。在Vector中,我们便可以经由过程元素的序号疾速猎取元素对象;这就是疾速随机会见。
Vector完成了Cloneable接口,即完成clone()函数。它能被克隆。

和ArrayList分歧,Vector中的操纵是线程平安的;可是,Vector不撑持序列化,即没有完成java.io.Serializable接口。
Vector的承继干系
  1. java.lang.Object
  2. java.util.AbstractCollection<E>
  3. java.util.AbstractList<E>
  4. java.util.Vector<E>
  5. publicclassVector<E>
  6. extendsAbstractList<E>
  7. implementsList<E>,RandomAccess,Cloneable,java.io.Serializable{}
复制代码
Vector与Collection干系以下图:

Vector的机关函数
  1. Vector共有4个机关函数
  2. //默许机关函数
  3. Vector()
  4. //capacity是Vector的默许容量巨细。当因为增添数据招致容量增添时,每次容量会增添一倍。
  5. Vector(intcapacity)
  6. //capacity是Vector的默许容量巨细,capacityIncrement是每次Vector容量增添时的增量值。
  7. Vector(intcapacity,intcapacityIncrement)
  8. //创立一个包括collection的Vector
  9. Vector(Collection<?extendsE>collection)
复制代码
Vector的API
  1. synchronizedbooleanadd(Eobject)
  2. voidadd(intlocation,Eobject)
  3. synchronizedbooleanaddAll(Collection<?extendsE>collection)
  4. synchronizedbooleanaddAll(intlocation,Collection<?extendsE>collection)
  5. synchronizedvoidaddElement(Eobject)
  6. synchronizedintcapacity()
  7. voidclear()
  8. synchronizedObjectclone()
  9. booleancontains(Objectobject)
  10. synchronizedbooleancontainsAll(Collection<?>collection)
  11. synchronizedvoidcopyInto(Object[]elements)
  12. synchronizedEelementAt(intlocation)
  13. Enumeration<E>elements()
  14. synchronizedvoidensureCapacity(intminimumCapacity)
  15. synchronizedbooleanequals(Objectobject)
  16. synchronizedEfirstElement()
  17. Eget(intlocation)
  18. synchronizedinthashCode()
  19. synchronizedintindexOf(Objectobject,intlocation)
  20. intindexOf(Objectobject)
  21. synchronizedvoidinsertElementAt(Eobject,intlocation)
  22. synchronizedbooleanisEmpty()
  23. synchronizedElastElement()
  24. synchronizedintlastIndexOf(Objectobject,intlocation)
  25. synchronizedintlastIndexOf(Objectobject)
  26. synchronizedEremove(intlocation)
  27. booleanremove(Objectobject)
  28. synchronizedbooleanremoveAll(Collection<?>collection)
  29. synchronizedvoidremoveAllElements()
  30. synchronizedbooleanremoveElement(Objectobject)
  31. synchronizedvoidremoveElementAt(intlocation)
  32. synchronizedbooleanretainAll(Collection<?>collection)
  33. synchronizedEset(intlocation,Eobject)
  34. synchronizedvoidsetElementAt(Eobject,intlocation)
  35. synchronizedvoidsetSize(intlength)
  36. synchronizedintsize()
  37. synchronizedList<E>subList(intstart,intend)
  38. synchronized<T>T[]toArray(T[]contents)
  39. synchronizedObject[]toArray()
  40. synchronizedStringtoString()
  41. synchronizedvoidtrimToSize()
复制代码
检察本栏目更多出色内容:http://www.bianceng.cn/Programming/Java/
第2部分Vector源码剖析
为了更懂得Vector的道理,上面对Vector源码代码作出剖析。
  1. packagejava.util;
  2. publicclassVector<E>
  3. extendsAbstractList<E>
  4. implementsList<E>,RandomAccess,Cloneable,java.io.Serializable
  5. {
  6. //保留Vector中数据的数组
  7. protectedObject[]elementData;
  8. //实践数据的数目
  9. protectedintelementCount;
  10. //容量增加系数
  11. protectedintcapacityIncrement;
  12. //Vector的序列版本号
  13. privatestaticfinallongserialVersionUID=-2767605614048989439L;
  14. //Vector机关函数。默许容量是10。
  15. publicVector(){
  16. this(10);
  17. }
  18. //指定Vector容量巨细的机关函数
  19. publicVector(intinitialCapacity){
  20. this(initialCapacity,0);
  21. }
  22. //指定Vector"容量巨细"和"增加系数"的机关函数
  23. publicVector(intinitialCapacity,intcapacityIncrement){
  24. super();
  25. if(initialCapacity<0)
  26. thrownewIllegalArgumentException("IllegalCapacity:"+
  27. initialCapacity);
  28. //新建一个数组,数组容量是initialCapacity
  29. this.elementData=newObject[initialCapacity];
  30. //设置容量增加系数
  31. this.capacityIncrement=capacityIncrement;
  32. }
  33. //指定汇合的Vector机关函数。
  34. publicVector(Collection<?extendsE>c){
  35. //猎取“汇合(c)”的数组,并将其赋值给elementData
  36. elementData=c.toArray();
  37. //设置数组长度
  38. elementCount=elementData.length;
  39. //c.toArraymight(incorrectly)notreturnObject[](see6260652)
  40. if(elementData.getClass()!=Object[].class)
  41. elementData=Arrays.copyOf(elementData,elementCount,Object[].class);
  42. }
  43. //将数组Vector的全体元素都拷贝到数组anArray中
  44. publicsynchronizedvoidcopyInto(Object[]anArray){
  45. System.arraycopy(elementData,0,anArray,0,elementCount);
  46. }
  47. //将以后容量值设为=实践元素个数
  48. publicsynchronizedvoidtrimToSize(){
  49. modCount++;
  50. intoldCapacity=elementData.length;
  51. if(elementCount<oldCapacity){
  52. elementData=Arrays.copyOf(elementData,elementCount);
  53. }
  54. }
  55. //确认“Vector容量”的匡助函数
  56. privatevoidensureCapacityHelper(intminCapacity){
  57. intoldCapacity=elementData.length;
  58. //当Vector的容量不敷以包容以后的全体元素,增添容量巨细。
  59. //若容量增量系数>0(即capacityIncrement>0),则将容量增年夜当capacityIncrement
  60. //不然,将容量增年夜一倍。
  61. if(minCapacity>oldCapacity){
  62. Object[]oldData=elementData;
  63. intnewCapacity=(capacityIncrement>0)?
  64. (oldCapacity+capacityIncrement):(oldCapacity*2);
  65. if(newCapacity<minCapacity){
  66. newCapacity=minCapacity;
  67. }
  68. elementData=Arrays.copyOf(elementData,newCapacity);
  69. }
  70. }
  71. //断定Vector的容量。
  72. publicsynchronizedvoidensureCapacity(intminCapacity){
  73. //将Vector的改动统计数+1
  74. modCount++;
  75. ensureCapacityHelper(minCapacity);
  76. }
  77. //设置容量值为newSize
  78. publicsynchronizedvoidsetSize(intnewSize){
  79. modCount++;
  80. if(newSize>elementCount){
  81. //若"newSize年夜于Vector容量",则调剂Vector的巨细。
  82. ensureCapacityHelper(newSize);
  83. }else{
  84. //若"newSize小于/即是Vector容量",则将newSize地位入手下手的元素都设置为null
  85. for(inti=newSize;i<elementCount;i++){
  86. elementData[i]=null;
  87. }
  88. }
  89. elementCount=newSize;
  90. }
  91. //前往“Vector的总的容量”
  92. publicsynchronizedintcapacity(){
  93. returnelementData.length;
  94. }
  95. //前往“Vector的实践巨细”,即Vector中元素个数
  96. publicsynchronizedintsize(){
  97. returnelementCount;
  98. }
  99. //判别Vector是不是为空
  100. publicsynchronizedbooleanisEmpty(){
  101. returnelementCount==0;
  102. }
  103. //前往“Vector中全体元素对应的Enumeration”
  104. publicEnumeration<E>elements(){
  105. //经由过程匿名类完成Enumeration
  106. returnnewEnumeration<E>(){
  107. intcount=0;
  108. //是不是存鄙人一个元素
  109. publicbooleanhasMoreElements(){
  110. returncount<elementCount;
  111. }
  112. //猎取下一个元素
  113. publicEnextElement(){
  114. synchronized(Vector.this){
  115. if(count<elementCount){
  116. return(E)elementData[count++];
  117. }
  118. }
  119. thrownewNoSuchElementException("VectorEnumeration");
  120. }
  121. };
  122. }
  123. //前往Vector中是不是包括对象(o)
  124. publicbooleancontains(Objecto){
  125. returnindexOf(o,0)>=0;
  126. }
  127. //从index地位入手下手向后查找元素(o)。
  128. //若找到,则前往元素的索引值;不然,前往-1
  129. publicsynchronizedintindexOf(Objecto,intindex){
  130. if(o==null){
  131. //若查找元素为null,则正向找出null元素,并前往它对应的序号
  132. for(inti=index;i<elementCount;i++)
  133. if(elementData[i]==null)
  134. returni;
  135. }else{
  136. //若查找元素不为null,则正向找出该元素,并前往它对应的序号
  137. for(inti=index;i<elementCount;i++)
  138. if(o.equals(elementData[i]))
  139. returni;
  140. }
  141. return-1;
  142. }
  143. //查找并前往元素(o)在Vector中的索引值
  144. publicintindexOf(Objecto){
  145. returnindexOf(o,0);
  146. }
  147. //从后向前查找元素(o)。并前往元素的索引
  148. publicsynchronizedintlastIndexOf(Objecto){
  149. returnlastIndexOf(o,elementCount-1);
  150. }
  151. //从后向前查找元素(o)。入手下手地位是夙昔向后的第index个数;
  152. //若找到,则前往元素的“索引值”;不然,前往-1。
  153. publicsynchronizedintlastIndexOf(Objecto,intindex){
  154. if(index>=elementCount)
  155. thrownewIndexOutOfBoundsException(index+">="+elementCount);
  156. if(o==null){
  157. //若查找元素为null,则反向找出null元素,并前往它对应的序号
  158. for(inti=index;i>=0;i--)
  159. if(elementData[i]==null)
  160. returni;
  161. }else{
  162. //若查找元素不为null,则反向找出该元素,并前往它对应的序号
  163. for(inti=index;i>=0;i--)
  164. if(o.equals(elementData[i]))
  165. returni;
  166. }
  167. return-1;
  168. }
  169. //前往Vector中index地位的元素。
  170. //若index月结,则抛出非常
  171. publicsynchronizedEelementAt(intindex){
  172. if(index>=elementCount){
  173. thrownewArrayIndexOutOfBoundsException(index+">="+elementCount);
  174. }
  175. return(E)elementData[index];
  176. }
  177. //猎取Vector中的第一个元素。
  178. //若失利,则抛出非常!
  179. publicsynchronizedEfirstElement(){
  180. if(elementCount==0){
  181. thrownewNoSuchElementException();
  182. }
  183. return(E)elementData[0];
  184. }
  185. //猎取Vector中的最初一个元素。
  186. //若失利,则抛出非常!
  187. publicsynchronizedElastElement(){
  188. if(elementCount==0){
  189. thrownewNoSuchElementException();
  190. }
  191. return(E)elementData[elementCount-1];
  192. }
  193. //设置index地位的元素值为obj
  194. publicsynchronizedvoidsetElementAt(Eobj,intindex){
  195. if(index>=elementCount){
  196. thrownewArrayIndexOutOfBoundsException(index+">="+
  197. elementCount);
  198. }
  199. elementData[index]=obj;
  200. }
  201. //删除index地位的元素
  202. publicsynchronizedvoidremoveElementAt(intindex){
  203. modCount++;
  204. if(index>=elementCount){
  205. thrownewArrayIndexOutOfBoundsException(index+">="+
  206. elementCount);
  207. }elseif(index<0){
  208. thrownewArrayIndexOutOfBoundsException(index);
  209. }
  210. intj=elementCount-index-1;
  211. if(j>0){
  212. System.arraycopy(elementData,index+1,elementData,index,j);
  213. }
  214. elementCount--;
  215. elementData[elementCount]=null;/*toletgcdoitswork*/
  216. }
  217. //在index地位处拔出元素(obj)
  218. publicsynchronizedvoidinsertElementAt(Eobj,intindex){
  219. modCount++;
  220. if(index>elementCount){
  221. thrownewArrayIndexOutOfBoundsException(index
  222. +">"+elementCount);
  223. }
  224. ensureCapacityHelper(elementCount+1);
  225. System.arraycopy(elementData,index,elementData,index+1,elementCount-index);
  226. elementData[index]=obj;
  227. elementCount++;
  228. }
  229. //将“元素obj”增加到Vector开端
  230. publicsynchronizedvoidaddElement(Eobj){
  231. modCount++;
  232. ensureCapacityHelper(elementCount+1);
  233. elementData[elementCount++]=obj;
  234. }
  235. //在Vector中查找并删除元素obj。
  236. //乐成的话,前往true;不然,前往false。
  237. publicsynchronizedbooleanremoveElement(Objectobj){
  238. modCount++;
  239. inti=indexOf(obj);
  240. if(i>=0){
  241. removeElementAt(i);
  242. returntrue;
  243. }
  244. returnfalse;
  245. }
  246. //删除Vector中的全体元素
  247. publicsynchronizedvoidremoveAllElements(){
  248. modCount++;
  249. //将Vector中的全体元素设为null
  250. for(inti=0;i<elementCount;i++)
  251. elementData[i]=null;
  252. elementCount=0;
  253. }
  254. //克隆函数
  255. publicsynchronizedObjectclone(){
  256. try{
  257. Vector<E>v=(Vector<E>)super.clone();
  258. //将以后Vector的全体元素拷贝到v中
  259. v.elementData=Arrays.copyOf(elementData,elementCount);
  260. v.modCount=0;
  261. returnv;
  262. }catch(CloneNotSupportedExceptione){
  263. //thisshouldnthappen,sinceweareCloneable
  264. thrownewInternalError();
  265. }
  266. }
  267. //前往Object数组
  268. publicsynchronizedObject[]toArray(){
  269. returnArrays.copyOf(elementData,elementCount);
  270. }
  271. //前往Vector的模板数组。所谓模板数组,便可以将T设为恣意的数据范例
  272. publicsynchronized<T>T[]toArray(T[]a){
  273. //若数组a的巨细<Vector的元素个数;
  274. //则新建一个T[]数组,数组巨细是“Vector的元素个数”,并将“Vector”全体拷贝到新数组中
  275. if(a.length<elementCount)
  276. return(T[])Arrays.copyOf(elementData,elementCount,a.getClass());
  277. //若数组a的巨细>=Vector的元素个数;
  278. //则将Vector的全体元素都拷贝到数组a中。
  279. System.arraycopy(elementData,0,a,0,elementCount);
  280. if(a.length>elementCount)
  281. a[elementCount]=null;
  282. returna;
  283. }
  284. //猎取index地位的元素
  285. publicsynchronizedEget(intindex){
  286. if(index>=elementCount)
  287. thrownewArrayIndexOutOfBoundsException(index);
  288. return(E)elementData[index];
  289. }
  290. //设置index地位的值为element。并前往index地位的原始值
  291. publicsynchronizedEset(intindex,Eelement){
  292. if(index>=elementCount)
  293. thrownewArrayIndexOutOfBoundsException(index);
  294. ObjectoldValue=elementData[index];
  295. elementData[index]=element;
  296. return(E)oldValue;
  297. }
  298. //将“元素e”增加到Vector最初。
  299. publicsynchronizedbooleanadd(Ee){
  300. modCount++;
  301. ensureCapacityHelper(elementCount+1);
  302. elementData[elementCount++]=e;
  303. returntrue;
  304. }
  305. //删除Vector中的元素o
  306. publicbooleanremove(Objecto){
  307. returnremoveElement(o);
  308. }
  309. //在index地位增加元素element
  310. publicvoidadd(intindex,Eelement){
  311. insertElementAt(element,index);
  312. }
  313. //删除index地位的元素,并前往index地位的原始值
  314. publicsynchronizedEremove(intindex){
  315. modCount++;
  316. if(index>=elementCount)
  317. thrownewArrayIndexOutOfBoundsException(index);
  318. ObjectoldValue=elementData[index];
  319. intnumMoved=elementCount-index-1;
  320. if(numMoved>0)
  321. System.arraycopy(elementData,index+1,elementData,index,
  322. numMoved);
  323. elementData[--elementCount]=null;//Letgcdoitswork
  324. return(E)oldValue;
  325. }
  326. //清空Vector
  327. publicvoidclear(){
  328. removeAllElements();
  329. }
  330. //前往Vector是不是包括汇合c
  331. publicsynchronizedbooleancontainsAll(Collection<?>c){
  332. returnsuper.containsAll(c);
  333. }
  334. //将汇合c增加到Vector中
  335. publicsynchronizedbooleanaddAll(Collection<?extendsE>c){
  336. modCount++;
  337. Object[]a=c.toArray();
  338. intnumNew=a.length;
  339. ensureCapacityHelper(elementCount+numNew);
  340. //将汇合c的全体元素拷贝到数组elementData中
  341. System.arraycopy(a,0,elementData,elementCount,numNew);
  342. elementCount+=numNew;
  343. returnnumNew!=0;
  344. }
  345. //删除汇合c的全体元素
  346. publicsynchronizedbooleanremoveAll(Collection<?>c){
  347. returnsuper.removeAll(c);
  348. }
  349. //删除“非汇合c中的元素”
  350. publicsynchronizedbooleanretainAll(Collection<?>c){
  351. returnsuper.retainAll(c);
  352. }
  353. //从index地位入手下手,将汇合c增加到Vector中
  354. publicsynchronizedbooleanaddAll(intindex,Collection<?extendsE>c){
  355. modCount++;
  356. if(index<0||index>elementCount)
  357. thrownewArrayIndexOutOfBoundsException(index);
  358. Object[]a=c.toArray();
  359. intnumNew=a.length;
  360. ensureCapacityHelper(elementCount+numNew);
  361. intnumMoved=elementCount-index;
  362. if(numMoved>0)
  363. System.arraycopy(elementData,index,elementData,index+numNew,numMoved);
  364. System.arraycopy(a,0,elementData,index,numNew);
  365. elementCount+=numNew;
  366. returnnumNew!=0;
  367. }
  368. //前往两个对象是不是相称
  369. publicsynchronizedbooleanequals(Objecto){
  370. returnsuper.equals(o);
  371. }
  372. //盘算哈希值
  373. publicsynchronizedinthashCode(){
  374. returnsuper.hashCode();
  375. }
  376. //挪用父类的toString()
  377. publicsynchronizedStringtoString(){
  378. returnsuper.toString();
  379. }
  380. //猎取Vector中fromIndex(包含)到toIndex(不包含)的子集
  381. publicsynchronizedList<E>subList(intfromIndex,inttoIndex){
  382. returnCollections.synchronizedList(super.subList(fromIndex,toIndex),this);
  383. }
  384. //删除Vector中fromIndex到toIndex的元素
  385. protectedsynchronizedvoidremoveRange(intfromIndex,inttoIndex){
  386. modCount++;
  387. intnumMoved=elementCount-toIndex;
  388. System.arraycopy(elementData,toIndex,elementData,fromIndex,
  389. numMoved);
  390. //Letgcdoitswork
  391. intnewElementCount=elementCount-(toIndex-fromIndex);
  392. while(elementCount!=newElementCount)
  393. elementData[--elementCount]=null;
  394. }
  395. //java.io.Serializable的写进函数
  396. privatesynchronizedvoidwriteObject(java.io.ObjectOutputStreams)
  397. throwsjava.io.IOException{
  398. s.defaultWriteObject();
  399. }
  400. }
复制代码
总结:
(01)Vector实践上是经由过程一个数组往保留数据的。当我们机关Vecotr时;若利用默许机关函数,则Vector的默许容量巨细是10。
(02)当Vector容量不敷以包容全体元素时,Vector的容量会增添。若容量增添系数>0,则将容量的值增添“容量增添系数”;不然,将容量巨细增添一倍。
(03)Vector的克隆函数,便是将全体元素克隆到一个数组中。
<p>
IDE是好。java中的IDE更是百花齐放,你用jbuilder能说jbuilder赶不上vs吗?用eclipse,netbeans也很舒服啊。我就不明白“稍微差一些”那一些是从哪里差来的。
爱飞 该用户已被删除
沙发
发表于 2015-1-20 12:37:17 | 只看该作者
Java 编程语言的风格十分接近C、C++语言。
活着的死人 该用户已被删除
板凳
发表于 2015-1-29 07:09:31 | 只看该作者
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
蒙在股里 该用户已被删除
地板
发表于 2015-2-3 12:16:35 | 只看该作者
不过,每次的执行编译后的字节码需要消耗一定的时间,这同时也在一定程度上降低了 Java 程序的运行效率。
冷月葬花魂 该用户已被删除
5#
发表于 2015-2-26 11:33:23 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
乐观 该用户已被删除
6#
发表于 2015-3-8 14:20:06 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
金色的骷髅 该用户已被删除
7#
发表于 2015-3-16 01:12:24 | 只看该作者
至于JDBC,就不用我多说了,你如果用java编过存取数据库的程序,就应该很熟悉。还有,如果你要用Java编发送电子邮件的程序,你就得看看Javamail 了。
再见西城 该用户已被删除
8#
发表于 2015-3-22 18:12:46 | 只看该作者
是一种简化的C++语言 是一种安全的语言,具有阻绝计算机病毒传输的功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-28 15:31

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表