Java基础--小结

ArrayList和Vector和LinkedList的区别

ArrayList和Vector作为List接口的两个典型的子类,支持List所有的方法全部功能。

1:ArrayList和Vector类都是基于数组实现的,它们底层动态数组的拷贝(Arrays.copyof(Object[] arr,int len))来实现。当向它们添加元素超过该数组的长度时,它们的initCapacity会自动增加。
2:在实际开发过程中,程序员无须关心ArrayList和Vector的initCapacity,但如果向ArrayList和Vector集合中添加大量元素时,可以使用ensureCapacity(int initCapacity)方法一次性添加长度,从而提高性能。
3:如果我们已经知道ArrayList和Vector集合要保存多少个元素,可以直接指定数组的长度。它们两者在用法上几乎是一摸一样的,但是vector是一种古老的集合类,在jdk1.0就存在了,但是Java还没有提供系统的集合框架,索引Vector提供的一些方法名都非常的不合理。
例如:addElement(Object c),和现在的add(Object c)实际上是一样的,从jdk1.2以后提供了系统的集合框架体系,把Vector改为实现List接口,作为List的实现之一。
从而导致了很多方法的重复。
4:它们两者的显著区别是:
ArrayList是线程不安全的,当多个线程在访问同一个ArrayList集合时,会出现数据丢失和串行的问题。我们可以通过Collections的工具类实现同步,Vector是线程安全的,还提供了一个子类Stack(栈)是一种后进先出的机制。因为Stack是继承Vector性能较差,所以在开发过程中我们尽量少使用Stack去开发功能。可以使用ArrayQueue去实现和替代.

LinkedList类是List的链表集合,它除了了有集合的List的特征以外还有,可以根据索引来随机访问集合的元素,除此之外还现象了Dequ接口,可以当做双端队列来使用因此被当做栈,也可以当做队列来使用。
LinkedList作为集合,双端队列,栈的用法合成,作为集合它是一个非常强大的集合类。
LinkedList与ArrayList,ArrayQueue的实现机制完全不同,ArrayList,ArrayQueue内部都是使用数组来保存集合的元素。因此在随机访问集合元素时有较好的性能。而LinkedList内部已链表的形式保存集合元素,随机访问元素的性能较差,但是在插入,删除元素时性能比较出色,虽然Vector也是以数组的形式来存储集合元素,但是它实现了线程同步,所以各方面性能都比较差。
一般来说没有雨数组是以一块连续的内存区来保存所以的数组元素,所以数组随机访问上性能最好,而链表作为底层实现的集合在执行插入,删除上有较好性能,但在总体上来说ArrayList的性能比LinkedList的性能要好,因此在大部分时候都应该考虑ArrayList.

关于使用List的建议:
1:如果在遍历List集合上,建议使用ArrayList和Vector,因为LinkedList是链表实现的,他们采用的是Iterator的方式遍历集合元素。
2:如果在经常执行插入,删除操作来改变包含大量的数据的时候,考虑使用LinkedList.因为使用ArrayList可能需要经常重新分配内部数组的长度,性能较差。
3:除了Vector是线程安全,其他都是非线程安全的包括LinkedList,但是Vector又是历史遗留,不推荐使用,如果要保证线程安全都可以使用
Collections. Collections.synchronizedList(List list);


List+javabean方式存储展示对象

package test.java02;


public class Student {

	private String name;
	private int age;
	private String tel;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

}

package test.java02;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class ListDemo {
	//List+javabean--会额外添加类
	public static void main(String[] args) {
		Student s1 = new Student();
		s1.setName("ff");
		s1.setAge(12);
		s1.setTel("185");
		
		Student s2 = new Student();
		s2.setName("yy");
		s2.setAge(14);
		s2.setTel("186");
		
		//把对象装入数组
		List<Student> students = new ArrayList<Student>();
		students.add(s1);
		students.add(s2);
		
		//按年龄排序
		students.sort(new Comparator<Student>() {

			@Override
			public int compare(Student o1, Student o2) {
				int a = o1.getAge();
				int b = o2.getAge();
				if (a>b) {
					return -1;
				} else if(a<b){
					return 1;
				}else {
					return 0;//两个相同的情况就是0,代表不排序
				}
			}
		});
		
		for (Student student : students) {
			System.out.print(student.getName()+"=="+student.getAge()+"=="+student.getTel()+"\n");
		}
		
	}

}


List+HashMap方式存储展示对象

package test.java02;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;

public class HashMapDemo {
//	List+HashMap
	public static void main(String[] args) {
		HashMap<String, Object> ff = new HashMap<String, Object>();
		ff.put("name", "ff");
		ff.put("age", 12);
		ff.put("tel", "185");
		
		HashMap<String, Object> yy = new HashMap<String, Object>();
		yy.put("name", "yy");
		yy.put("age", 14);
		yy.put("tel", "186");
		
		
		List<HashMap<String, Object>> student = new ArrayList<HashMap<String,Object>>();
		student.add(ff);
		student.add(yy);
		
		student.sort(new Comparator<HashMap<String, Object>>() {

			@Override
			public int compare(HashMap<String, Object> o1,
					HashMap<String, Object> o2) {
				Integer a = (Integer) o1.get("age");
				Integer b = (Integer) o2.get("age");
				
				if (a>b) {
					return -1;
				}else if (a<b) {
					return 1;
				}else {
					return 0;//两个相同的情况就是0,代表不排序
				}
			}
		});
		
		for (HashMap<String, Object> hashMap : student) {
			System.out.print(hashMap.get("name")+"=="+hashMap.get("age")+"=="+hashMap.get("tel")+"\n");
		}
		
	}

}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值