您的位置:首页 > 编程语言 > Java开发

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

2016-02-26 16:43 836 查看
参考: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集合框架里的映射接口和类进行简单介绍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: