`
qiemengdao
  • 浏览: 272775 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java容器类分析之List、ArrayList、Vector

阅读更多

 

Java容器类分析之ListArrayListVector

List是接口,声明了各个方法,不多说。且看ArrayList类。


ArrayList类的成员变量有Object[] elementDataint size;其中elementData数组用来存储加入到ArrayList的对象,size为列表中实际的对象数目。ArrayList类不是线程安全的。

VectorArrayList的实现基本相同,只是Vector类是线程安全的,其方法都带有synchronized关键字,如果不考虑线程同步的话,ArrayList性能要好一些。当前它们内部实现原理都是用到对象数组来实现,如果元素数目确定,直接用数组效率最高。

 

简单的用法:(后面是数据打印结果)

public class ListDemo {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<String> list = new ArrayList<String>();
		String[] strArr = new String[3];
		boolean ret = list.add("haha");
		list.add(new String("aa"));
		list.add(null); 
		System.out.println(list.size());//3
		System.out.println(ret);//true
		System.out.println(list);//[haha, aa, null]
		System.out.println(strArr);//[Ljava.lang.String;@1fee6fc
		System.out.println(strArr.getClass().getName());//[Ljava.lang.String;
		System.out.println(list.indexOf("aa"));//1
		System.out.println(list.indexOf(null));//2
		String str = list.set(1, "ee");
		System.out.println(str);//aa
		System.out.println(list);//[haha, ee, null]
		String remove = list.remove(0);
		System.out.println(remove);//haha
		System.out.println(list);//[ee, null]
		boolean result = list.remove("ff");
		System.out.println(result);//false
		result = list.remove("ee");
		System.out.println(result);//true
		System.out.println(list);//[null]
	}

}
 

 

public ArrayList() {
	this(10);
    }
 public ArrayList(int initialCapacity) {
	super();
        	if (initialCapacity < 0)
           		 throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
	this.elementData = new Object[initialCapacity];
    }
   public boolean add(E e) {
	ensureCapacity(size + 1);  // Increments modCount!!
	elementData[size++] = e;
	return true;
    }



/*移除指定位置元素,注意每次移除数据都会将数组中后面数据移动来填充数组*/
 public E remove(int index) {
	RangeCheck(index);

	modCount++;
	E oldValue = (E) elementData[index];

	int numMoved = size - index - 1;
	if (numMoved > 0)
	    System.arraycopy(elementData, index+1, elementData, index,
			     numMoved);
	elementData[--size] = null; // index后面数据依次往前移动,将最后一个位置赋值为0,让gc来回收空间。
	return oldValue;
    }

public void ensureCapacity(int minCapacity) {
	modCount++;//这个变量不用管。
	int oldCapacity = elementData.length; //初始时设定的数组长度
	if (minCapacity > oldCapacity) {    //如果数组对象数目>初始数组长度,则需要扩容。
	    Object oldData[] = elementData;
	    int newCapacity = (oldCapacity * 3)/2 + 1; //新的容量大小
    	    if (newCapacity < minCapacity)
		newCapacity = minCapacity;
	 /*该方法会创建一个新的对象数组,然后调用  System.arraycopy(original, 0, copy, 0,
                Math.min(original.length, newLength));方法将源数组数据拷贝到新数组中。引用更新,指	向新的对象数组。*/
            	   elementData = Arrays.copyOf(elementData, newCapacity); 
	}
    }

/*将对象数组削减到当前元素数目大小,减少存储空间*/   
public void trimToSize() { 
	modCount++;
	int oldCapacity = elementData.length;
	if (size < oldCapacity) {
            elementData = Arrays.copyOf(elementData, size);
	}
    }

/*查找对象首次出现的位置,若没有找到,返回-1。由
代码可知,可以在list中加入null对象,并查找到。*/
 public int indexOf(Object o) {
	if (o == null) {
	    for (int i = 0; i < size; i++)
		if (elementData[i]==null)
		    return i;
	} else {
	    for (int i = 0; i < size; i++)
		if (o.equals(elementData[i]))
		    return i;
	}
	return -1;
    }

/*替换指定位置的元素值,返回该位置中old值*/
public E set(int index, E element) {
	RangeCheck(index); //检查范围
	E oldValue = (E) elementData[index];
	elementData[index] = element;
	return oldValue;
    }

/*返回指定位置的值*/
public E get(int index) {
	RangeCheck(index);

	return (E) elementData[index];
    }

 private void RangeCheck(int index) {
	if (index >= size)
	    throw new IndexOutOfBoundsException(
		"Index: "+index+", Size: "+size);
    }
  public int size() {
	return size;
    }

    public boolean isEmpty() {
	return size == 0;
    }
  
 

 

分享到:
评论

相关推荐

    Java容器类List、ArrayList、Vector及map、HashTable应用

    List、ArrayList、Vector及map、HashTable、HashMap的区别与用法 使用容器排序 Vector由于使用了synchronized方法(线程安全)

    Java 容器类的解析及对比

    该资源为本人面试前整理的Java容器类的资料,分析描述了Collection、List、ArrayList、Vector及map、HashTable、HashMap区别,可用来复习。

    java并发包&线程池原理分析&锁的深度化

    同步容器类 Vector与ArrayList区别 1.ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经...

    Java 最常见的 208 道面试题:第二模块答案

    18. java 容器都有哪些? 19. Collection 和 Collections 有什么区别? 20. List、 Set、 Map 之间的区别是什么? 21. HashMap 和 Hashtable 有什么区别? 22. 如何决定使用 HashMap 还是 TreeMap? 23. 说一下 ...

    Java 基础核心总结 +经典算法大全.rar

    ArrayList Vector LinkedList 类Stack HashSet TreeSet LinkedHashSet 类 PriorityQueue HashMap TreeMap 类 LinkedHashMap 类 Hashtable 类IdentityHashMap 类WeakHashMap 类 Collections 类集合实现类特征图 泛形 ...

    Java容器详解

    1.什么是容器在Java当中,有一个类专门用来存放其它类的对象,这个类就叫做容器,它就是将若干性质相同或相近的类对象组合在一起而形成的一个整体。2.常用的Java1.List有序的collection(也称为序列)。此接口的用户...

    JavaSE 笔试 精华

    Collection List LinkedList ArrayList Vector Stack Set HashSet Map HashMap Dictionary Hashtable Comparetor 2. Vector和ArrayList、LinkedList区别? Hashtable 和 HashMap之间的区别 LinkedList内部以链表...

    java面试宝典

    42、一个“.java”源文件中是否可以包含多个类(不是内部类)?有什么限制? 12 43、说出一些常用的类,包,接口,请各举5 个。 12 44、Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类?是否可以...

    Java ArrayList源码剖析

     ArrayList实现了List接口,是顺序容器,即元素存放的数据与放进去的顺序相同,允许放入null元素,底层通过数组实现。除该类未实现同步外,其余跟Vector大致相同。每个ArrayList都有一个容量(capacity),表示...

    java基础案例与开发详解案例源码全

    11.3.1 实现类ArrayList277 11.3.2 实现类LinkedList279 11.3.3 实现类Vector281 11.4 Map接口283 11.4.1 实现类HashMap284 11.4.2 实现类LinkedHashMap285 11.4.3 实现类TreeMap286 11.4.4 实现类Properties287 ...

    java 面试题 总结

     Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符...

    疯狂JAVA讲义

    7.4.2 ArrayList和Vector实现类 264 7.4.3 固定长度的List 266 7.5 Queue接口 266 7.5.1 LinkedList实现类 266 7.5.2 PriorityQueue实现类 269 7.6 Map 270 7.6.1 HashMap和Hashtable实现类 271 7.6.2 ...

    JAVA面试题最全集

    一个“.java”原文件中是否可以包括多个类(不是内部类)? 53.掌握内部类和接口的概念 54.StringTokenizer类的使用 55.数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? ...

    大数据开发成长之路——Java基础(四)

    List被AbstractList实现,然后分为3个子类,ArrayList,LinkedList和VectorList List是一种有序链表,本身是一个泛型接口,元素可以重复,可以是 null 包含以下方法: 遍历List // for循环 List list = ...; for...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    史上最全java面试,103项重点知识,带目录

    27. ArrayList 和 Vector 的区别是什么? 11 28. Array 和 ArrayList 有何区别? 12 29. 在 Queue 中 poll()和 remove()有什么区别? 12 30. 哪些集合类是线程安全的? 12 31. 迭代器 Iterator 是什么? 12 32. ...

    超级有影响力霸气的Java面试题大全文档

     Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符...

    Java面试宝典-经典

    1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 7 2、Java有没有goto? 7 3、说说&和&&的区别。 8 4、在JAVA中如何跳出当前的多重嵌套循环? 8 5、switch语句能否作用在byte上,能否作用在...

Global site tag (gtag.js) - Google Analytics