JAVA学习【7】集合框架与Arraylist、Linkedlist、HashSet的基本用法

参考:http://blog.csdn.net/liulin_good/article/details/6213815


具有相同性质的一类东西称为集合,JAVA中集合是一些具有相同数据类型的数据。

集合框架是为表示和操作集合而规定的一种统一的标准的体系结构,JAVA中集合框架是存储、查找、排序这些相同类型数据的接口、类及其方法

因此,JAVA集合框架的用法与数组相似,不过方法更多,针对不同问题可以采用不同的数据结构存储元素,元素的查找等操作效率更高,类的使用也更加方便。


JAVA集合框架定义的主要接口有Collection、List、Set,性质如下:


其他Queue、Deque、SortedSet等接口此处不详细说明。

Map是JAVA定义的映射接口,用于存储键-值对,也包含在集合框架中。

上表中,“无序”指元素没有以输入的顺序存放,元素插入(add)的顺序与输出的顺序不一致,“有序”指存放顺序与插入顺序一致。


接口:

Collection接口是List、Set的父接口,不允许存在NULL元素,扩展了Iterable接口,定义了iterator()方法,实现该接口或子接口的类可以采用iterator()和for-each(加强型for)遍历元素。


List接口,与数组相似采用以0开始的索引存放元素,get(int index)获得元素,set(int index, obj)元素幅值。


Set接口,不允许存在重复的元素。


类:

ArrayList类,实现了List接口,采用数组形式存放元素,将元素存储在连续空间中,插入删除元素麻烦,当数组长度不够时,将原数组复制到一个更长的数组中,实现存储长度动态增减。特点:查询快,增删慢,线程不安全,轻量级,有序,最常用。


LinkedList类,实现了List、Deque、Queue接口,采用链表实现, 又一个个存储节点链接起来, 适合插入删除元素等操作,查询元素等操作只能一个节点一个节点顺序遍历。


HashSet类,实现了Set接口,采用哈希表实现,不允许元素重复,若add相同元素,后者将覆盖前者。


TreeSet类,实现了Set接口,采用二叉树实现,能够快速访问大量有序数据。


用法演示:

ArrayList类

import java.util.*;

public class Main{
	public static void main(String[] args){
		ArrayList<String> al = new ArrayList<String>();
		al.add("abc");
		al.add("abc");
		al.add("def");
		al.add("ghi");
		
		System.out.println(al.size());
		System.out.println(al);
		System.out.println(al.get(2));
		System.out.println(al.indexOf("ghi"));
		al.set(1, "jkl");
		System.out.println(al);
		al.remove(1);
		System.out.println(al);
		al.remove("ghi");
		System.out.println(al);
		System.out.println("ArrayList转换成数组:");
		String[] str = new String[al.size()];
		str = al.toArray(str);
		for(String s:str)
			System.out.println(s);
	}
}

运行结果:

4
[abc, abc, def, ghi]
def
3
[abc, jkl, def, ghi]
[abc, def, ghi]
[abc, def]
ArrayList转换成数组:
abc
def


LinkedList

LinkedList类实现了List、Deque、Queue接口,访问List定义的add()等方法与上面ArrayList类相同,

import java.util.*;

public class Main{
	public static void main(String[] args){
		LinkedList<String> ll = new LinkedList<String>();
		//现栈
		ll.push("a");
		ll.push("a");
		ll.push("b");
		ll.push("c");
		System.out.println(ll.pop());
		System.out.println(ll.pop());
		System.out.println(ll.pop());
		System.out.println(ll.pop());
		System.out.println(ll);
		
		//双向列表
		ll.add("Q");
		ll.add("W");
		ll.addLast("E");
		ll.addFirst("R");
		System.out.println(ll);
		ll.removeFirst();
		System.out.println(ll);
		ll.removeLast();
		System.out.println(ll);
	}
}

运行结果:

c
b
a
a
[]
[R, Q, W, E]
[Q, W, E]
[Q, W]


HashSet

HashSet类无序且元素唯一。

import java.util.*;

public class Main{
	public static void main(String[] args){
		HashSet<String> hs = new HashSet<String>();
		hs.add("A");
		hs.add("A");
		hs.add("a");
		hs.add("B");
		hs.add("D");
		hs.add("C");
		System.out.println(hs);
	}
}

运行结果:

[A, a, B, C, D]


TreeSet

TreeSet类有序且元素唯一,Integer和String都有有默认排序方式,其他类型必须实现Comparable接口,并且重写compareTo()方法。

Integer和String的默认排序方式都是比较ASCii码值。

import java.util.*;

public class Main{
	public static void main(String[] args){
		TreeSet<String> ts = new TreeSet<String>();
		ts.add("A");
		ts.add("A");
		ts.add("a");
		ts.add("1");
		ts.add("D");
		ts.add("C");
		System.out.println(ts);
	}
}

运行结果:

[1, A, C, D, a]


在很多情况下,需要遍历集合所有元素,一般采用Iterator或者for-each(加强型for循环),示例如下:

import java.util.*;

public class Main{
	public static void main(String[] args){
		TreeSet<String> ts = new TreeSet<String>();
		ts.add("A");
		ts.add("B");
		ts.add("D");
		ts.add("C");
		
		Iterator<String> it = ts.iterator();
		while(it.hasNext()){
			String element = it.next();
			System.out.println(element);
		}
		
		for(String s:ts)
			System.out.println(s);;
	}
}

JAVA集合框架类的具体实现和采用的数据结构详见JAVA源代码。

下一篇对JAVA集合框架里的映射接口和类进行简单介绍。

发布了43 篇原创文章 · 获赞 50 · 访问量 14万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章