问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

java 运行容器问题

发布网友 发布时间:2022-05-26 15:42

我来回答

1个回答

热心网友 时间:2023-10-25 04:27

执行JAVA的应用程序  容器(Container)
容器可以管理对象的生命周期、对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称、如何产生(Prototype
方式或Singleton方式)、哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系。

换个更直白点的说明方式:容器是一个Java
所编写的程序,原先必须自行编写程序以管理对象关系,现在容器都会自动帮您作好。
常用容器
WebSphere,WebLogic,Resin,Tomcat

JAVA内部的容器类  Java容器类包含List、ArrayList、Vector及map、HashTable、HashMap

ArrayList和HashMap是异步的,Vector和HashTable是同步的,所以Vector和HashTable是线程安全的,而
ArrayList和HashMap并不是线程安全的。因为同步需要花费机器时间,所以Vector和HashTable的执行效率要低于
ArrayList和HashMap。
Collection
├List 接口
│├LinkedList 链表
│├ArrayList 顺序结构动态数组类
│└Vector 向量
│ └Stack 栈
└Set
Map
├Hashtable
├HashMap
└WeakHashMap List接口
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。

实现List接口的常用类
有LinkedList,ArrayList,Vector和Stack。
ArrayList类
ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。和LinkedList一样,ArrayList也是非同步的(unsynchronized)。

Map接口
请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。

HashMap类
HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null
value和nullkey。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load
factor过低。
Collection接口
Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。JavaSDK不提供直接继承自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。
Hashtable类
Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。
添加数据使用put(key,value),取出数据使用get(key),这两个基本操作的时间开销为常数。 Hashtable通过initial
capacity和loadfactor两个参数调整性能。通常缺省的load factor
0.75较好地实现了时间和空间的均衡。增大loadfactor可以节省空间但相应的查找时间将增大,这会影响像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和nullkey。,但是将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》一书中PeterHaggar建议使用一个简单的数组(Array)来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。
您已经评价过!好:5您已经评价过!不好:0您已经评价过!原创:0您已经评价过!非原创:5每①兲回答采纳率:20.9%2010-02-20 00:08
满意答案 好评率:100%1、容器:能装对象的东西。数组知道吧?int型的数组就可以装int型的数据。 而容器呢,可以装对象,以及所有的数据嘛~2、容器的使用一般不是通过接口来使用的,而是通过其实现类来使用。3、容器接口大致归纳为:list,set还有map。具体的实现类为:ArrayList,LinkedList,TreeSet,HashSet,HashMap,TreeMap等。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
金莎丽的淋浴房用完之后开门水会流出来吗? 老家里的开门式淋浴房总是漏水,装修新家想换个质量好点的淋浴房,淋浴房... 淋浴房为何开门不畅?门关不紧怎么办? appa是什么意思英语? ...觉得比较好奇吧。是什么意思?好奇吗。有微信,没聊过 和新认识的男生聊什么跟男生可聊的20个话题 农行用什么pos机有积分 POS机刷卡积分是什么意思? 一个简短的民间小说 小米9.11发布会什么时候可以重播 我国第一台电子计算机是哪一年制成的 魔法棒怎么制作(使用魔法的) 孩子厌学的原因有哪些?你家孩子上学痛苦吗? 冀东水泥校园招聘行程 我想学电脑请问怎么自学,还是报什么学习班? 我想自学计算机 应该如何去学呢一点思路都没有? 从编号为1-10的十张卡片中,任意抽取一张 10张卡片上分别写有1到10十个数字,任取3张,求 (1)最小数字为5的概率 (2)最大数字为5的概率 冀东水泥待遇怎么样 CAD怎样把文字直接写在命令窗口上? 怎样把想要的AUTOCAD中自定义命令让它显示在界面上 冬冬和妈妈到“肯德基”吃快餐,账单如下: 食品名称 香辣鸡翅 汉堡 儿童套餐 鸡肉卷 烤鸡翅 汉堡店里的厨师为什么知道什么套餐里有什么汉堡之类的东西 麦当劳的双层芝士汉堡多套餐少钱 赛尔号沙僧是什么系的? 赛尔号卷帘大将是谁? 汉堡店好听的套餐名字 赛尔号沙僧是谁?怎么获得? 赛尔号迪博威值得买吗?请给出理由!答案越详细本人越加分! 赛尔号冥王断空五封印打法,最好是平民 还有那个圣皇现在还能打什么boss 我国第一台电子技术诞生于哪一年 中国第一台电子管计算机于哪一年试制成功? JAVA中的容器怎么学? JAVA容器的执行JAVA的应用程序 java中顶级容器是干什么用的? 检察院向人大代表征求意见开场白 小学所有反义词 轻卡车辆防冻液多久换一次啊? 小学生反义词字词 阿玛迪斯战记的隐藏关怎么出? 4米2的江淮货车每跑100多公里要加3至4百毫升防冻液,为什么 我最想说的一件事300字三年级作文 第三代残疾如何发放 男生,亲热时就射精了,怎么会事 耐克帽子是在实体店买好还是网上买好 我是今年高考的学生,想考浙江传媒的播音主持(礼仪文化),不知好不好请现在在浙传的学姐学长们告告我情况 播音主持(礼仪文化) 浙江传媒学院播音主持(影视配音)和播音主持(礼仪文化) 世界上真的有叶罗丽娃娃店吗?你可以告诉我他的准确地址吗? 世界上有真正的叶罗丽娃娃店吗