仓酷云

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

[学习教程] JAVA网页编程之经由过程定制编程来最年夜化Java程序功能仓酷云

[复制链接]
山那边是海 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:33:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
java也能做一些底层语言开发做的事情(难度很高,不是java顶尖高手是做不来的),我们在开辟商用体系的时分,一般要让它满意良多功能需求,比方实行速率、资本占用等。在本篇文章中我们将经由过程几个例子来切磋定制编程在优化功能中的感化。只管编译器和最新的Java假造机供应了一些工具来完成程序的主动优化,不外要想真正取得最年夜功能的程序,除依托它们外,你另有需要在编程的时分利用奇妙的数据布局和针对特定成绩而计划的新优化算法。  考证办法先容
  在本篇文章中,我们将经由过程对照考证的体例来证实上述概念的准确性,我们将分离给出尺度的Java整数排序程序,另有依据特定内容举行定制化编程的排序程序,并对二者举行对照,对照了局以图形的体例直不雅的显现出来。
  本篇文章中触及到的一切考证示例都将运转屡次,取其均匀体现,从而最年夜限制削减因为不测的操纵体系举动酿成的了局差别。别的,一切测试都在一个自力的体系上运转,该体系上没有别的用户和别的运转的程序,以包管了局的正确性。为了削减野生毛病,测试了局被丈量程序间接输入到一个内部文件中,并由一个图形程序主动来依据这些数据天生对照图。联系关系程序同时也会反省并利用均匀测试了局,丢弃非常数据。总之,只管使测试了局可以客不雅实在的反应分歧程序的功能体现。
  高效编程
  一个程序实行的指令越少它运转的速率就越快,这个概念并不是笔者起首提出,也不具有争议性,这是在多年的盘算机迷信开展已证实的一个知识。不管你的程序利用甚么言语编写,它一般都合用这个准绳,固然利用Java和C++编写的程序也不破例,人们一般利用这两种编程言语来开辟年夜型、可晋级、疾速的散布式体系。
  从实践效果来看,要想乐成的完成一个运转最快、损耗资本起码的程序,一般请求我们利用一个通用言语(诸如Java或C++)并依据特定编程情况来手动来举行编程。与之绝对应的是,纯真依托设置一般的组件,不依据特定情况举行程序计划和完成,程序优化义务大概借助于现成的代码库或编纂器的主动优化功效,大概借助于JVM手艺中初级功效。切实其实,在良多情况下前面的做法大概也充足了,可是依托这类办法你编写出来的程序纷歧定具有最好的功能。从基本下去说,定制化的计划、编码和优化,再加上这些过程当中程序员的立异妙技,这些要素加起来将能够做出运转最快和扩大性最强的程序。
  一般排序VS计数排序
  上面我们将经由过程对照两种排序算法来考证下面的结论,个中一个是尺度的Java排序程序,另外一个则是依据详细情形定制化的排序程序。第一个例子是复杂的对n个正整数排序,数值在0到k之间。在Java中我们能够经由过程复杂的利用Collections(汇合)或Arrays(数组)类来完成这个目标,以下例所示:
1/**
2*利用Collections的sort办法来对输出的正整数举行排序
3*/
4publicArrayList<Integer>sortInts(ArrayList<Integer>inputSequence)
5{
6Collections.sort(inputSequence);
7returninputSequence;
8}/**
9
10
11*利用Arrays类来对一个整数数字举行排序
12
13*/
14publicint[]sortInts(int[]inputSequence)
15{
16Arrays.sort(inputSequence);
17returninputSequence;
18}   在Java文档中如许形貌Collections.sort程序:
  “该排序算法是一个经由修正的兼并排序算法(个中假如低子列表中的最高元素小于高子列表中的最低元素,则疏忽兼并)。此算法供应可包管的nlog(n)功能。此完成将指定列表转储到一个数组中,并对数组举行排序,在重置数组中响应地位处每一个元素的列表长进行迭代。这制止了因为试图对得当地位上的链接列表举行排序而发生的n2log(n)功能。”
  Collections.sort程序被计划能够撑持恣意元素范例,因而这个排序算法不克不及使用我们例子中专门针对正整数排序的一些特性。而Arrays.sort程序的文档形貌则显现它是一个更合适对整数举行排序的算法:
  “将特定的整数数组举行排序,失掉一个有序整数数组。该排序算法是一个经由调优的疾速排序法,改编自JonL.Bentley和M.DouglasMcIlroy合著的《EngineeringaSortFunction",Software-PracticeandExperience》Vol.23(11)P.1249-1265(November1993)。此算法在很多数据集上供应n*log(n)功能,这招致其他疾速排序会下降二次功能。
  这个Arrays.sort算法已针对整数排序举行了改善,与我们本例中的特定请求已更靠近了一步,因而它的效力要比Collections.sort更高一些。可是,O(nlogn)的功能仍然十分高,我们另有办法来改善它。
  如今,假如我们要专门针对正整数来计划一个最优化的排序程序,那末我们要记着整数范例具有以下特性:
  1、与实数或浮点数分歧的是,两个相邻整数之间没有别的整数。比方有两个整数a和b,假如a+1=b,那末你不成能再找到第三个整数x能满意a
  2、这些整数没有联系关系数据,它们不是元组(tuples)。因而在排序过程当中,一样巨细的元素能够不必反复排序历程,这能够进步效力。
  思索到我们输出序列具有以上两个特性,我们能够编写一个十分分歧的排序程序,计数排序的改善版,如Listing1所示。
  listing1
1/**
2*完成计数排序算法
3*/
4publicint[]countingSort(int[]inputSequence)
5{
6//取得最年夜值
7intmaxValue=-1;
8for(inti=0;i<inputSequence.length;i++)
9{
10intx=inputSequence;
11if(x>maxValue)
12{
13maxValue=x;
14}
15}
16
17//指定一个数组
18int[]counts=newint[maxValue+1];
19
20//盘算输出序列中每个数呈现的次数
21for(inti:inputSequence)
22{
23counts+=1;
24}
25
26//取得排序数字序列
27for(inti=0,j=0;i<=maxValue;i++)
28{
29intc=counts;
30for(intk=0;k<c;k++,j++)
31{
32inputSequence[j]=i;
33}
34}
35
36returninputSequence;
37}  上面我们来复杂对这个程序的算法举行先容,这个程序起首取得输出序列中最年夜的数值k,并以它为最年夜下标来创立一个数组(长度为k+1)。然后再次反省输出序列,并断定每个数值在序列中呈现的次数,并将其纪录在counts数组中响应下标地位。举个例子来讲,假如输出的数值序列是[3,1,4,7,1,4,0],那末我们将失掉一个长度为8的计数数组counts[],包括以下值[1,2,0,1,2,0,0,1]。最初程序依据计数数组来重写输出数列inputSequence。在这个例子中失掉的数值是[0,1,1,3,4,4,7]。
  从以上算法中我们能够分明为何这个算法不克不及用来对实数或浮点数举行排序;由于它们的输出序列中的最年夜数值不克不及告知我们要创立几长度的手艺数组,并且这个计数排序也不克不及用来对整数键值的元组举行排序,由于算法实行最初一步的时分,重写了最后的输出元素,损坏了元素的最后数值。
  这个改善版的计数排序算法对输出序列共举行了三次遍历:第一次是发明其最年夜值(即k),这个操纵的工夫庞大度是O(n)。它分派了一个最年夜下标为k的数组,只管这只是一个复杂的数组指定操纵,我们也以为它的工夫庞大度为O(k)。然后它第二次对输出数值举行遍历,来盘算分歧数值呈现的次数。最初它利用排序的序列来对掩盖原始输出序列,工夫庞大度为O(n)。因而这个算法总的工夫庞大度为O(n+k),空间庞大度为O(k).因而这个计数排序不单单与要排序的数值几有干系,还与个中最年夜数值巨细有干系。
  上面我们经由过程图形来对照三种排序程序的体现,分离取分歧数目、分歧最年夜输出数值的情形举行对照。
  显现了对0到100局限内的整数(k=100)举行排序的了局,输出序列个数在20000到1000000之间。


<br>  

  中对排序数值的巨细局限举行了扩展为0到10000(k=10000)。


<br>  

  最初,我们将k进步到1000000,对照了局如所示。


<br> 

  我们能够看到计数排序分明比Java库中利用的算法更疾速。也许复杂的整数排序不会有多年夜用途,上面我们对照对整数元组举行排序的分歧。
  一般排序VS鸽巢(Pigeon-Hole)排序
  接上去,我们放宽对输出序列的一个限定,同意输出元组作为输出数组的元素,这意味着我们必需在输出数列中保留元素的标识。在这个例子中,我们必要对n个有序整数对举行排序,个中整数对中的第一个值作为排序键(key)。整数对的第二个值被看作“相干数据”。
  在Listing2中我们显现了利用Collections和Arrays类怎样举行排序,从例子中我们看到了OrderedPair类,它包括两个整数,个中k是排序的键值。我们的排序程序所请求的接口是PigeonHoleable。
1publicinterfacePigeonHoleable
2{
3/**
4*Returnstheintegerkey
5*/
6intgetKey();
7}
8
9publicclassOrderedPairimplementsPigeonHoleable
10{
11privateintk;
12privateintx;
13
14publicOrderedPair(intk,intx)
15{
16this.k=k;
17this.x=x;
18}
19
20publicintgetKey()
21{
22returnk;
23}
24
25publicStringtoString()
26{
27return"("+k+","+x+")";
28}
29}  在Listing3中我们一样利用了Collections和Arrays类来对这些有序对举行排序,可是此次我们还利用了一个能够对照键值的对照器comparator。
  Listing3
1/**
2*SortsalistoforderedpairsusingjavaCollectionssort
3*/
4publicArrayList<PigeonHoleable>
5pairSort(ArrayList<PigeonHoleable>inputSequence)
6{
7Collections.sort(inputSequence,newComparator<PigeonHoleable>(){
8publicintcompare(PigeonHoleableo1,PigeonHoleableo2)
9{
10return(o1.getKey()-o2.getKey());
11}
12});
13
14returninputSequence;
15}
16
17/**
18*SortsanarrayofintegerspairsusingtheArraysclasssort
19*/
20publicPigeonHoleable[]
21pairSort(PigeonHoleable[]inputSequence)
22{
23Arrays.sort(inputSequence,newComparator<PigeonHoleable>(){
24publicintcompare(PigeonHoleableo1,PigeonHoleableo2)
25{
26return(o1.getKey()-o2.getKey());
27}
28});
29
30returninputSequence;
31}  在我们的定制程序中包括了鸽巢排序的改善,如Listing4所示。
1/**
2*Implementsthepigeon-holesortalgorithm,andmaintains
3*theidentityoftheelements,soitcandealwithothertypes
4*thanintegers.Thismeansthatwholerecordscanbesorted
5*effectively,withtheassociatedfieldsremainingwiththe
6*originalelement.Thisisastablesort.
7*/
8publicPigeonHoleable[]pigeonHoleSort(PigeonHoleable[]inputSequence)
9{
10//Findthemaximumvalue
11intmaxValue=-1;
12for(inti=0;i<inputSequence.length;i++)
13{
14intx=inputSequence.getKey();
15if(x>maxValue)
16{
17maxValue=x;
18}
19}
20
21//Allocateanarray,1foreachvalue
22int[]counts=newint[maxValue+1];
23
24//Counttheoccurencesofeachkeyvalue
25for(PigeonHoleableb:inputSequence)
26{
27counts[b.getKey()]+=1;
28}
29
30//Allocatearaggedarrayofarrays
31PigeonHoleable[][]slots=newPigeonHoleable[maxValue+1][];
32for(inti=0;i<counts.length;i++)
33{
34intsize=counts;
35if(size>0)
36{
37slots=newPigeonHoleable[size];
38}
39
40//Zerothecountsarrayaswegosowecanreusethem
41//forindexes
42counts=0;
43}
44
45//Nowspinthroughtheinputinsertingelementsdirectly
46//intothecorrectslots
47for(inti=0;i<inputSequence.length;i++)
48{
49PigeonHoleablebs=inputSequence;
50intk=bs.getKey();
51intj=counts[k]++;
52slots[k][j]=bs;
53}
54
55//Spinthroughre-insertingtheslotreferencesbackinto
56//theinputsequenceinthecorrectorder
57for(inti=0,j=0;i<=maxValue;i++)
58{
59intc=counts;
60for(intk=0;k<c;k++,j++)
61{
62inputSequence[j]=slots[k];
63}
64}
65
66returninputSequence;
67}  和后面我们所利用的计数排序一样,这个程序入手下手先查找输出序列中的最年夜键值,然后利用它来创立一个计数数组counts。这个输出数列然后再次被反省,在计数数组中响应地位再累加每个键值呈现的次数。接上去是与后面计数排序的分歧的地方,使用counts数组中的数值,我们创立一个元素为数组的数组slots,并将counts数组的一切值回零。如Figure1所示。
  Figure1
  然后程序对输出数列举行遍历,并间接将每个输出序列中元素的拔出到slots数组中,利用键值作为第一个索引,counts数组中的值作为第二个索引。在这个轮回中,counts数组被用于别的用途,来保留“下一个索引”。这就是为何每个counts数组的值要被回零的缘故原由。历程如Figure2所示。
  Figure2
  最初对这个二维数组的数组举行遍历,按按次读出每个指向,就失掉了我们要排序的了局。即,假如我们最后的输出序列是(3,6)(1,2)(4,8)(7,1)(1,5)(4,9)(0,4),则失掉排序的了局为(0,4)(1,2)(1,5)(3,6)(4,8)(4,9)(7,1)。
  这个鸽巢排序算法的完成共对原始序列举行了四次遍历,每次所必要的工夫庞大度为O(n).一旦发明最年夜值(k)后,第二次累加分歧数值呈现的次数,第三次则拔出指向到子数组中,最初将轮回读取子数组的指向到排序后的列表中。在空间方面,这个算法分派了两个数组,counts和slots,巨细均为k,别的slots中的每个子数组也分派空间,空间庞大度为O(n)。如许整体工夫庞大度和内存利用约为O(n+k)。和我们后面形貌的手艺排序一样,这个鸽巢排序是一个牢靠的排序,不但与排序元素数目有关,并且和输出元素中数值的巨细有关。
  如今,我们再次对三种排序办法经由过程图形来对照其功能,一样分离取分歧数目、分歧最年夜关头值的情形举行对照。
  中显现关头值巨细在0到100,排序元素数目在20000和1000000之间的工夫。
 

  中关头值局限在0到10000之间



<br>

  中关头值k=1000000


<br>  

  从中我们能够看到鸽巢排序在20000

  Java中Arrays对有序对的排序分明要功能低的多,而Collections排序则体现好一些,比Arrays排序快良多。可是它们两个都比鸽巢排序要慢的多,特别关于键值k对照小的情形下,鸽巢排序要比Arrays排序功能进步15到17倍,比Collections排序要进步12到13倍。当键值k变年夜的时分,功能进步倍数不再那末分明,约莫有3-4倍,缘故原由多是指定内存的工夫跟着k值的增年夜而变得十分耗时。
  经由过程事后分派需要内存来实行排序或重用的办法,另有大概进步这个排序算法的功能,不外这是不是可行要取决于要排序的元素的特性。
  结论
  考证本文概念的例子另有良多,本文只是枚举了个中两个。假如我们设定了一个最短实行工夫的功能请求,假如以为每个指令在必定工夫内被实行,那末具有起码指令的程序无疑将运转最快。大概有多个最优功能的程序和做个靠近最优功能的程序。
  这些最优功能程序能够完整经由过程手工编程完成,不外这多是不实际的;大概经由过程主动优化手艺,诸如优化编译器,来剖析程序并发生高效代码。主动优化手艺之前次要是剖析代码的静态布局,可是如今的Java情况也入手下手经由过程在实行的时分搜集统计数字来考证静态程序举动,比方利用诸如逃逸剖析(escapeanalysis),然后敏捷的静态从头编译实行代码。不管哪种情形,只要信息在程序中分明的暗示出来,大概能够经由过程对程序举动推理而取得,它们才能够被优化决议历程来利用。某些优化是不成能或不实际可以主动发生的,由于必要利用内容相干的特定常识,这些常识不成能分明的编写在程序中,不克不及从程序举动中推理而出。
  因而重申一下本文开首的概念:要想真正取得最年夜功能的程序,除依托主动优化手艺外,你另有需要在编程的时分利用奇妙的数据布局和针对特定成绩而计划的新优化算法。

java主要分三块,j2se:java的基础核心语言。j2me:java的微型模块,专门针对内存小,没有持续电源等小型设备。j2ee:java的企业模块,专门针对企业数据库服务器的连接维护。
谁可相欹 该用户已被删除
沙发
发表于 2015-1-21 10:09:13 | 只看该作者
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
柔情似水 该用户已被删除
板凳
发表于 2015-1-30 14:37:13 | 只看该作者
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
灵魂腐蚀 该用户已被删除
地板
发表于 2015-2-6 13:20:38 | 只看该作者
是一种语言,用以产生「小应用程序(Applet(s))
admin 该用户已被删除
5#
发表于 2015-2-10 01:12:47 | 只看该作者
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
莫相离 该用户已被删除
6#
发表于 2015-2-22 07:09:50 | 只看该作者
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
若相依 该用户已被删除
7#
发表于 2015-3-6 23:27:53 | 只看该作者
设计模式是高级程序员真正掌握面向对象核心思想的必修课。设计模式并不是一种具体"技术",它讲述的是思想,它不仅仅展示了接口或抽象类在实际案例中的灵活应用和智慧
山那边是海 该用户已被删除
8#
 楼主| 发表于 2015-3-8 13:19:19 | 只看该作者
Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台
透明 该用户已被删除
9#
发表于 2015-3-10 23:52:19 | 只看该作者
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
若天明 该用户已被删除
10#
发表于 2015-3-16 02:00:15 | 只看该作者
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
小魔女 该用户已被删除
11#
发表于 2015-3-17 06:10:14 | 只看该作者
J2SE开发桌面应用软件比起 VC,VB,DEPHI这些传统开发语言来说,优势好象并不明显。J2ME对于初学者来说,好象又有点深奥,而且一般开发者很难有开发环境。
只想知道 该用户已被删除
12#
发表于 2015-3-20 14:32:47 | 只看该作者
你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。
分手快乐 该用户已被删除
13#
发表于 2015-4-1 09:30:45 | 只看该作者
是一种使网页(Web Page)产生生动活泼画面的语言
简单生活 该用户已被删除
14#
发表于 2015-4-4 09:14:57 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
不帅 该用户已被删除
15#
发表于 2015-4-9 05:41:04 | 只看该作者
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
小女巫 该用户已被删除
16#
发表于 2015-4-10 18:51:41 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
爱飞 该用户已被删除
17#
发表于 2015-4-24 23:58:19 | 只看该作者
Java是一个纯的面向对象的程序设计语言,它继承了 C++语言面向对象技术的核心。Java舍弃了C ++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)
活着的死人 该用户已被删除
18#
发表于 2015-4-25 13:00:09 | 只看该作者
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
愤怒的大鸟 该用户已被删除
19#
发表于 2015-4-25 17:02:34 | 只看该作者
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-23 16:43

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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