「java按比例分配」按比例分配类型
今天给各位分享java按比例分配的知识,其中也会对按比例分配类型进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
Java是什么?
简言之,Java环境可用来开发能在任何计算平台上运行的应用
软件。它实际上是一种非常基本且结构紧凑的技术,而它对World
Wide Web以及商业的总体影响已可同电子表格对PC机的影响相比
拟。
Java是巨大的推动力量
Java已用动态的交互应用软件使Web栩栩如生。它使开发人员
具有‘编写一次到处运行TM”的巨大能力。而且,借助其JavaAPI
及其编程语言上的Java虚拟机,它已产生一种分布信息的崭新模式。
这种模式叫做Java企业计算,正在帮助各企业以各种不同的方法取
得竞争优势。网管和控制已大大简化。软件分配基本上是免费的,
而且立即可实现。电子贸易已获得。占有成本大幅度降低。信息和
应用软件到处可存取。
Java建立在简单的前提基础上,即所有微处理器都应讲同一种
语言??所有内部采用芯片的产品都应能一起工作,无缝而方便地
共享信息。它已经改变企业和个人同Internet大交道的方式。现在,
它正在对消费类产品产生明显的影响,而且从总体上更加深刻地影
响企业计算。
借助Java,您可自由自在地使用您已拥有的硬件和软件。这是因
为Java是独立于平台的。它还可使您超越企业计算,使应用软件在便
携式计算机、信息亭、电视、蜂窝电话和其他大量设备上运行。
全世界的公司都已发现Java数不胜数的用途。所有用途可从其无
可比拟的能力,即提高可靠性、安全性和简化各种不同计算产品和
环境的能力中受益非浅,而且节省的时间和费用十分可观。
Java无处不在。它已拥有几百万个用户,其发展速度要快于在它
以前的其他任何一种计算机产品。它可位于任何地方,而且能到处运
行。Java正在迅速被用做传播信息的事实上标准,这是因为它既可给
企业,也可给最终用户带来似乎数不清的好处。
因此,请您仔细考察一下Java。它的优点是很容易发现的。
“Java正在进入企业、家庭和学校。
它正在象Internet本身一样成为普遍存在的技术。”
Oracle 公司董事长和首席执行官
Larru Ellison
“Java正在改变我们使用Internet的方法,改变我们
在公司内部存取信息的方法,甚至改变我们使用蜂窝
电话的方法。它正在从根本上改变制作信息、销售信息
和分配信息的方法。”
EarthWeb公司董事长和首席执行官
Jack Hidary
Java的来龙去脉
Sun公司一小组工程师聚集在一起,认真思考日常生活中的
数字系统??因为烤面包机、恒温器、游戏机和其他无数设备
都包含越来越复杂的CPU??以及他们如何能使这些数字系统
共享信息。
创造未来的计算
制造产品的人当然全都从不同的方面来考虑其设计,视他们
所使用的硬件平台、操作系统和应用软件而定。但是,如果您要
使这些产品中的一些产品一起工作,那怎么办?安全性、可靠性
和网络问题又这么样呢?
因此,Sun公司这些工程师把各种不同的产品折开来,然后又
把它们重新组装起来,其目标是要使这些不同的设备相互交谈。
他们把这些研究对象相互传来传去,并理解所有其他研究对象的
特性,以便使他们能更好地一起工作。这就把制造商的问题缩减
到最低程度,并使消费者能方便地进行集成。当传统的语言证明
是不适用时,工程师们就打算找到某种简单的现代新语言。于
是, Java应运而生。
人们很快发现,Java有可能超越工程师的想象。Java的魅力在
于它提供给开发人员和用户的简便性。开发人员拥有广大的用户基
础、平台独立性、降低的开发费用和始终如一的执行环境,而用户
则可 从生动的内容、即时软件和增大的安全性中受益。
但是,Java正是从置于World Wide Web那时起才真正起飞。Java
使全世界大为震动,因为它使Web页面栩栩如生,而且不久变得很明
显,Java拥有大得多的潜力。人们之所以采纳Java,是因为它有独特
的能力来编制和部署能在任何一个网络、任何一个操作系统上运行的
应用软件。分配软件的时间和费用实际上已不复存在,使得各公司可
把更多的资源用来开发其产品。而且,某些工业专家认为,Java可能
会改变软件销售模式,从固定价格改变为按使用量收费,这样做更有
利可图,而且可阻止非法盗版。
Java是一种网络计算的通用开放标准平台。这种平台可从电话一
直扩展到极端重要的应用,建立在您现有的硬件和软件体系结构基础
上,从而创造出一个全部联网的企业或者制造出超出的创新产品。
“由于Java具有可缩放性,因而我们可以把Java应用于小应
用软件或大应用软件,把它芯片组以及大型计算机和服务器,并
使它为各种不同的应用领域服务。”
三菱公司系统营销副总裁
Steve Hester
“借助Java,您可以用一种能最有效地使用的方式动态地分
发和分配交互式商务应用软件一一在需要运行应用软件的地方,
在需要运行应用软件的时候。”
Novell公司开发者服务部副总和总经理
Gary Mueller
Java扎下根来
在某种意义上,Java具体体现了Sun Microsystiems公司自其14年
前创建以来所追述的目标。当时,它创造了“网络就是计算机”这局名
言。它市基于Web的新网络计算模式的完美平台,因为它建立在各个
组织现有的硬件和软件体系结构基础上,能建立一个全部联网的企业。
Java是一个完整而全面的解决方案
Java远不止是一种编程语言,它是企业内外的完整计算环境,而
且万事齐备,从开发工具、操作系统、服务器软件和瘦/肥客户机一
直到网络管理工具、支持、培训、咨询和集成服务,一应俱全。Java
使用起来非常简单,部分原因是Sun提供一种全面统一的解决方案。
主要组成部分包括:
*Java开发工具和服务:有助于简化开发Java应用软件的产品和
服务
*JavaOS:一种结构紧凑的操作系统,可使Java应用软件在网络
计算机和蜂窝电话等设备上运行
*Java虚拟机:一层软件,嵌入Windows、Macintosh和UNIX等计
算机操作系统,或在这些操作系统上运行,从而使计算机能
运行Java应用软件
*Java API:标准软件界面,位于Java应用软件和数据库检索和
安全性等服务软件之间
*Java芯片:一系列为Java优化的为处理器
*Solstice WorkShop:Java启动的网络管理工具
*Java培训:一个由教师指导和基于多媒体的完整课程,教会编
程员如何开发Java应用软件,包括一个用来验证熟练程度的
认证计划
*JavaWorkShop支持:900号电话服务,可为Java WorkShop用户
(仅限美国用户)立即提供按需支持
这些产品依靠由Sun的核心技术和服务提供的基础,包括:
*Solaris操作系统
*Sikstuce企业管理系统
*WorkShop开发者工具
*SunSpectrum支持服务
*Internet咨询和集成服务
*Java和Internet教育服务
*ultra工作站和Ultra Enterprise服务器;Netra服务器
难怪大公司和日益增多的全球2000公司正在把Java计算用做系统以及
其终产品的主要方面。
“您不会把您自己锁住在任何一家公司的专有技术中。
开放意味着选择。而Java使您有选择余地。”
Java改变了什么
nbs
p; 十年前,几乎没有人想到,几个技术人员研发的一个“小语言”,会发展成如今的一个“生态圈”,这就是Java。
Java让互联网动了起来
“计算机语言的发展历史也是人们不断追求更高的模块化、抽象化和封装化的历史。近十年期间,很多编程语言,从出现到没落经过了一波又一波。像1970年代出现的Pascal,如今用的人已经不多了。”一位资深程序员告诉记者,“‘算法+数据结构=程序’几乎成为软件开发的惟一准则,结构化程序设计方法从计算机发展角度来看是自然而然的,但今天从抽象的角度来看,这种方法几乎可以说是一个‘时代错误’。实际上,软件开发的主要目的就是描述和反映现实世界,结构化程序设计方法并不符合这个思维方式。”
因此,抽象的过程应该是以现实世界的对象为中心的,于是面向对象的抽象方法就走到了前台,出现了Visual Basic、Delphi、C++以及Java等面向对象的编程语言,而互联网的勃兴,则给Java的成长带来了肥沃的土壤。
“Java诞生时并没有引起太多人的注意,它第一次让人们觉得惊艳是在一次网站演示上,但当时人们对Java还抱有很大的争议。”被誉为“Java之父”的SUN公司副总裁、软件部首席技术官James Gosling回忆起十几年前的情景不无感慨地说,“但Java的出现为当时的互联网增添了生机,它让那些静态的页面动了起来。”
而且,因为Java具有“只写一次,随处运行”的特点,从而引起了更多开发者的兴趣。
“我们可以不必再做重复性质的劳动了。”中国科学院软件研究所宋靖宇博士说,“此前,为了能够使程序在不同型号的硬件平台上运行,开发人员必须耗费大量的时间来一遍又一遍的编写代码,然而Java改变了这样的局面,只写一次就可以。”
由于看到Java在互联网时代的巨大作用,清华大学计算机系教授王克宏从1995年就开始跟踪Java的发展。
Java语言的优势似乎是与生俱来的,然而,仅有语言是不够的。
免费的Java创造了应用奇迹
“为了提高软件开发效率,任何编程语言都离不开相应的开发工具和程序库。”王克宏说。于是,SUN公司在1996年的1月23 日发布了JDK1.0,其中包括两个部分:运行环境和开发工具,运行环境包括五大部分:核心API、集成API、用户界面API、发布技术和Java虚拟机。
随着各种功能的完善与提炼,各种Java开发工具以及开发环境的丰富,Java不再是一种语言的代名词,它变成了一种开发平台。人们常常听到的J2EE(企业版)、J2ME(微型版)、J2SE(标准版)就是Java的三大核心平台。利用这三种不同的平台,人们可以来做不同行业的应用。
SUN公司大中华区总裁余宏德说:“Java经过十年的发展,已经得到了全球的公认,可以说,当今的电子时代是‘Java无处不在’,正是基于它一开始的技术公开性,Java已经变成全球最富有活力的技术社区之一。”
尽管,Java目前已经风靡全世界,但Java 到底给整个产业带来什么,除了Java程序员外,似乎没有人能具体感觉到。
SUN中国区市场经理马君海比喻说:“电灯的发明,使得有了现在庞大的电力产业;电话的发明,使得有了当今兴旺的电信产业;而Java的发明,则给软件产业带来了前所未有的改变。”
像一切新兴事物一样,Java的发展并不那么顺利,其坎坷起步的经历,可以从SUN首席执行官Scott McNealy在SUN的Java One大会上的一句话得知一二:“七八年前的Java One演说现在听起来真是寒碜,我们那时实在是太小看它了,我们根本不知道这项技术将会改变什么。”而且,由于开始就是基于开源的态度,当时很多人怀疑它是否能赚钱。
然而,今天的Java已经得到广泛应用。
据全球市场调查分析显示:已经有25亿部电子设备采用了Java技术,Java智能卡发行量已经达到10亿张,采用Java技术的手机达7亿多部,7亿台PC中应用了Java技术,140家电信运营商支持Java 技术,全球有超过450 万个Java开发人员,JCP(Java社区项目)已经有912家会员企业。
如果没有Java,SUN将会怎样
从1997年4月6日美国旧金山的第二届Java One大会,到今年的Java十周年盛事,本报目睹了Java 十年的风风雨雨,眼瞅着这个以“咖啡”命名的小小编程语言变成了一个平台,一个社团,一个生态系统。Java不仅发展了自己,也同时改变了它的缔造者。Java对SUN的改变是间接的、渐进式的,有时候甚至不为外人所道也。
与平台无关的Java旨在与“锁定用户的”Windows相抗衡,给人们更多的选择,但推动Java研发的却是家硬件公司――硬件公司与微软抗个什么衡?也许有人会拿IBM做类比――IBM也大量涉足软件。问题在于,IBM涉足软件的结果是把自己变成了一个软件和服务公司,而SUN的主业依然是服务器。表面上看,“纯软”的Java并没有给“偏硬”的SUN带来直接效益,反而树了个强大的敌人,这就是并不“软”的微软。
同时,尽管SUN对Java的投资巨大,却从没说过它从Java中获得过多少回报。因为使用Java程序和开发工具包是免费的,这让那些利用Java做第三方开发的ISV们赚了个钵满盆满,可是SUN得到了什么?当然,Java作为高级编程语言,它的注册和维护也能给SUN带来一定收入,但这是一个小头,有人比喻说:“SUN成了Java的管家,而不是主人。”
SUN大中华区市场总监李永起近日为记者揭开了Java与SUN的秘密:“如果SUN只是一个做服务器的公司,人们就不会对我们太感兴趣,但有了Java,就大不一样了,人们会跑过来与我们讨论Java,人们会说:‘哦,能研发出Java这么棒的编程语言的公司一定不同凡响!’况且,服务器的销售从来就不是孤立的,它体现为一个系统,Java在硬件销售中发挥了关键作用。”SUN用 Java来定位Web服务,发挥其多平台对话的特长,营造Web服务环境。
Internet让Java复活,Java则拯救了曾经陷入“偏硬”困境中的SUN。
SUN董事长麦克尼里认为:Java带来的益处从根本上讲是间接的。“但是,”他说,“想像一下,如果10年前SUN没有做Java,今天SUN将会在哪里?如果人们不写Java Web服务,他们会写.Net的程序,如果他们写.Net的程序,他们就不会为SUN的设备写程序。”
.NET不折不扣的对手
近年来,国内一批软件公司都采用Java技术开发了一批软件平台和产品,这两年Java在国内得到了迅速发展。不过,尽管看起来Java的队伍似乎很强大,但国内Java人才相对而言还是少得可怜。
“SUN在新加坡建立了Java高级培训中心,目前新加坡有5万名Java 人才,而新加坡全国只有380万人,即全国1.3%的是Java人才,如果按此比例,中国应有1700万名Java人才,而现在估计仅10到15万人。”王克宏教授在相关的报告中写道,“造成国内Java应用不多的原因是多方面的。”
“这两年SUN才开始在中国举办各种活动,而许多媒体对Java的不关注也是其中一个原因。”王克宏说。
“其实,鉴于Java出来时总给人阳春白雪的面孔,使得国内的许多编程者在熟悉了微软的开发平台后,很难转换过来是其中的一大部分原因。”宋靖宇博士说,“你不得不承认微软在开发工具上的人性化以及可视化设计是高超的。”
“在讨论 Java 的时候我们很容易将 Java 语言和 Java 平台混为一谈,与.NET 平台比较的过程中,也更多的是将Java平台和C#比较,或者将Java语言和.NET 平台做比较,在我个人的意识中,这是不够公正的。”上海大学博士刘锬对记者说,“Java既是一种语言,也是一种平台。”
说到微软的.NET,它从提出的开始就是立足平台,相对于 Java 提倡的“一次编写,到处运行”,.NET则提倡“一个平台,多种语言”,因为平台的统一性,因此在各个程序语言的兼容性和混合开发方面做得比Java 好,也因此有些微软的“粉丝”嘲笑Java是“一次编写,到处调试”。
“微软的C#是集合了C以及C++甚至Java的许多优点的结晶,在Windows平台上,似乎C#在运行速度上更胜一筹。”刘锬介绍说,“在任何一个平台上,我们直接交流的是实现Java语言运行的虚拟机,我们希望Java在虚拟机以及它的开发平台的研发上变得更易用、更人性化。”
“有对手总是一件不算坏的事情,这个世界不需要‘独孤求败’,商业规则也不允许‘独孤求败’的出现,因为那样会打破竞争格局的平衡,而Java和.NET这两个平台的纷争才刚刚开始。较量,有利于整个软件世界。SUN公司在商业模式的运作上甚至可以跟微软学习。”一网友这样说。
java常见gc算法有哪些
1:标记—清除 Mark-Sweep
过程:标记可回收对象,进行清除
缺点:标记和清除效率低,清除后会产生内存碎片
2:复制算法
过程:将内存划分为相等的两块,将存活的对象复制到另一块内存,把已经使用的内存清理掉
缺点:使用的内存变为了原来的一半
进化:将一块内存按8:1的比例分为一块Eden区(80%)和两块Survivor区(10%)
每次使用Eden和一块Survivor,回收时,将存活的对象一次性复制到另一块Survivor上,如果另一块Survivor空间不足,则使用分配担保机制存入老年代
3:标记—整理 Mark—Compact
过程:所有存活的对象向一端移动,然后清除掉边界以外的内存
4:分代收集算法
过程:将堆分为新生代和老年代,根据区域特点选用不同的收集算法,如果新生代朝生夕死,则采用复制算法,老年代采用标记清除,或标记整理
面试的话说出来这四种足够了
求助:java中怎么实现按比例随机分配
比如有十个糖果,按照2:3:5的比例分配给三个小孩
public class luck {
public static ListString candy = new ArrayListString();
public static ListString child1 = new ArrayListString();
public static ListString child2 = new ArrayListString();
public static ListString child3 = new ArrayListString();
// 2:3:5
public static void main(String[] args) {
candy.add("糖果1");
candy.add("糖果2");
candy.add("糖果3");
candy.add("糖果4");
candy.add("糖果5");
candy.add("糖果6");
candy.add("糖果7");
candy.add("糖果8");
candy.add("糖果9");
candy.add("糖果10");
int count = 10;
for (int i = 0; i 2; i++) {
int math = (int) (Math.random() * count);
child1.add(candy.get(math));
candy.remove(math);
count--;
}
for (int i = 0; i 3; i++) {
int math = (int) (Math.random() * count);
child2.add(candy.get(math));
candy.remove(math);
count--;
}
for (int i = 0; i 5; i++) {
int math = (int) (Math.random() * count);
child3.add(candy.get(math));
candy.remove(math);
count--;
}
System.out.println("child1的糖:");
for (int i = 0; i child1.size(); i++) {
System.out.println(child1.get(i));
}
System.out.println("child2的糖:");
for (int i = 0; i child2.size(); i++) {
System.out.println(child2.get(i));
}
System.out.println("child3的糖:");
for (int i = 0; i child3.size(); i++) {
System.out.println(child3.get(i));
}
}
}
输出结果:
child1的糖:
糖果6
糖果1
child2的糖:
糖果7
糖果2
糖果8
child3的糖:
糖果4
糖果3
糖果10
糖果5
糖果9
大学生如何高质量的度过假期?
我基本上从高考完的那个暑假开始,每个假期都在实习打工,可我现在回想起我的假期生活,还是有些遗憾的。希望仅以我的经验总结能够帮助大学生更好的度过假期。
1.高考完的假期
对于即将成为大学生,迎来新的大学生活来说,这个假期太宝贵了。可以和要好的朋友一起去旅游一次。
也可以利用这个假期,学一项技能,比如游泳,比如驾照。尤其是驾照,工作以后,很难有这样集中的时间段去练习。我是工作以后考的驾照。那段时间,每天早上四点多起来坐大巴去驾校,用了三个多月才学下来的。如果是暑假期间,学生身份还能打折,一个多月也就学完了。
学习一个自己感兴趣的技能,比如一支舞蹈,比如一首拿手的歌,这些会让你在军训、新生入学的时候,有才艺傍身,让人眼前一亮。
2 .大学寒暑假
可以提前联系比自己大一两级的师哥师姐,了解她们的学习、就业的动向,提前准备考研或者,也可以根据感兴趣的工作岗位,准备实习。专业相关的实习,可以让你更早的认清自己的职业选择。如果从事本行业,那么专业相关的实习经验,更能让你查漏补缺,为毕业入职的加分项。
3 .大学的小假期
平时的小的节假日,可以尝试兼职,兼职打工的过程中,能够更让你了解现实社会的商业规则,培养商业意识。
大学生涯4年,实际上并不长。大学里的课程不再像高中一样,每天排的满满当当的,相反。大学,给了学生们最宝贵的自由。一天的课程可能只上半天,剩下的时间,自由安排。所以大家对于剩余时间的安排和规划,就慢慢彰显了各自的差距。“凡事预则立不预则废”,每个人对于“高质量”的定义也不相同。你需要找到自己的节奏,按照自己的目标,做好提前规划, 才能在短时间内,拿到预期的结果,让大学生涯的假期变得高质量。
java中 List 与Set 的区别
复制的,但是比较详细,楼主看看吧:
ArrayList Vector LinkedList 区别与用法
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!
线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构。这些类均在java.util包中。本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
由Collection接口派生的两个接口是List和Set。
List接口
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。
和下面要提到的Set不同,List允许有相同的元素。
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
LinkedList类
LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。
注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...));
ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
Vector类
Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。
Stack 类
Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
Set接口
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。
很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素。
请注意:必须小心操作可变对象(Mutable Object)。如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题。
Map接口
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
Hashtable类
Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。
Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:
Hashtable numbers = new Hashtable();
numbers.put(“one”, new Integer(1));
numbers.put(“two”, new Integer(2));
numbers.put(“three”, new Integer(3));
要取出一个数,比如2,用相应的key:
Integer n = (Integer)numbers.get(“two”);
System.out.println(“two = ” + n);
由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。
如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。
Hashtable是同步的。
HashMap类
HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。
WeakHashMap类
WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。
总结
如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
同步性
Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。
数据增长
从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。
使用模式
在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?
这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的?O(1),但它在索引一个元素的使用缺比较慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。
最后,在《Practical Java》一书中Peter Haggar建议使用一个简单的数组(Array)来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。
关于java按比例分配和按比例分配类型的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-21,除非注明,否则均为
原创文章,转载请注明出处。