import java.util.LinkedList;
public class fjhao {
public static void main(String[] args) {
Object obj1="a";
LinkedList list = new LinkedList();
list.add(obj1);
System.out.println(list);
System.out.println(list.contains("d"));
System.out.print(list.indexOf("d"));
}
解释一:
容器(Container)
Spring 提供容器功能,容器可以管理对象的生命周期、对象与对象之间的依赖关系,您可以使用一个配置文件(通常是XML),在上面定义好对象的名称、如何产生(Prototype 方式或Singleton 方式)、哪个对象产生之后必须设定成为某个对象的属性等,在启动容器之后,所有的对象都可以直接取用,不用编写任何一行程序代码来产生对象,或是建立对象与对象之间的依赖关系.
换个更直白点的说明方式:容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,现在容器都会自动帮您作好.
常用容器:WebSphere,WebLogic,Resin,Tomcat
----------------------------------
解释二:
容器类
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接口
HashMap类
HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key.,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap 的容量成比例.所以呢,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低.
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接口
除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历.
LinkedList类
LinkedList实现了List接口,允许null元素.此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部.这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque).
注意LinkedList没有同步方法.如果多个线程同时访问一个List,则必须自己实现访问同步.一种解决方法是在创建List时构造一个同步的List:
List list = Collections.synchronizedList(new LinkedList(...));
每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小.这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义.当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率.
Vector类
Vector非常类似ArrayList,但是Vector是同步的.由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,所以呢必须捕获该异常.
Stack 类
Set接口
很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素.
请注意:必须小心操作可变对象(Mutable Object).如果一个Set中的可变元素改变了自身状态导致Object.equals(Object)=true将导致一些问题.
Hashtable类
Hashtable继承Map接口,实现一个key-value映射的哈希表.任何非空(non-null)的对象都可作为key或者value.
添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数.
Hashtable numbers = new Hashtable();
numbers.put("one", new Integer(1));
Integer n = (Integer)numbers.get("two");
System.out.println("two = " + n);
如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个.
Hashtable是同步的.
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方法.
同步性
Vector是同步的.这个类中的一些方法保证了Vector中的对象是线程安全的.而ArrayList则是异步的,所以呢ArrayList中的对象并不是线程安全的.因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销.
数据增长
使用模式
在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示.但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置.为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作.这一切意味着什么呢?
这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以.如果是其他操作,你最好选择其他的集合操作类.比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的?O(1),但它在索引一个元素的使用缺比较慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作.LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销.
最后,在<
用到容器:列表 ListString
代码:
public?static?void?main(String[]?args)?{
ListString?list?=?new?ArrayListString();
list.add(String.valueOf((char)?i));
for?(String?str?:?list)?{
System.out.print(str?+?"?");
System.out.println();
System.out.print(list.get(i)?+?"?");
import javax.swing.*;
import java.awt.*;
public class TestTextArea extends JApplet{
public void init(){
setLayout(new FlowLayout());
setVisible(true);
Button b=new Button("清空");
add(t1);
add(b);
validate();
直接运行applet ,代码如上;
你的整个程序结构应该有点问题,建议把launchFrame()方法放入另外一个类中
所有的容器均可以调用父类设置布局管理器方法
setlayout(layoutmanager
mgr)
设置此容器的布局管理器.
方法名错误了public int hasCode() { 错误 少了一个h
应该覆盖public int hashCode() {方法.修改后执行正常.
以上就是土嘎嘎小编为大家整理的java容器代码相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!