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

Java 浅谈集合框架

2016-04-07 20:06 246 查看

1.集合框架概述

集合都是在 java.util包中

Java Collection Framework=Java集合框架 JCF

集合:用来存放很多元素的一种类型 也可以称为集合容器

框架:是一种结构体系 有很多类去组成的

提到集合我们自然就想到数组 那么这两个有什么关系呢?

我们定义一个数组的时候 是必须得定长 并且只能存同一种类型

比如 String[] a=new String[5]; //必须这样去定义

那么用ArrayList的时候就用限制长度

对于集合框架的知识 我们可以用、Java API(Application Programing Interface=应用程序接口)去获得

这个是事先已经编好的 我们只需要拿来用就可以了

那么我们就开始集合框架的学习了

首先让我们看一个集合框架图



上方这个图是集合框架图 集合框架中 不只是有Collection 和 Map接口 还有其它的接口 只是这两个是结合中用的最多的

那我们先学习Collection 然后在学Map

2.Collection接口

在这个Collection接口中 有两个子接口 List和 Set ,而 List 和 Set后面就是他们的实现类。

那么这两个子接口究竟有什么区别呢?

ListSet
有索引无索引
数据可以重复数据不可以重复

2.1 List

2.1.1 ArrayList

ArrayList:动态数组,表示数组长度可变

public class Text {

public static void main(String[] args) {
ArrayList<String> al=new ArrayList<String>();
al.add("Beijing");
al.add("Tianjin");
al.add("Shanghai");
al.add(0,"Chongqing");
for(int i=0; i<al.size(); i++)
{
System.out.println(al.get(i));
}
}
}


2.1.2 LinkedList

LinkedList::用法和ArrayList是完全一样的

2.1.3 ArrayList和LinkedList区别

数据存储方式不一样,称为不同的数据结构

ArrayList:基于数组实现(优点:连续存放,查找速度比较快,缺点:增加元素或者删除元素比较慢),

LinkedList基于链表实现(缺点:不连续存放,查找速度比较慢,优点:增加元素或删除元素比较快)。

2.1.4 Vector

Vector 向量:基于数组实现的,但是已经过时,现在都用ArrayList。

2.2 Set

2.2.1 HashSet

HashSet:是以哈希表为存储结构 是无序的

public class Text {

public static void main(String[] args) {
HashSet<String> al=new HashSet<String>();
al.add("Beijing");
al.add("Tianjin");
al.add("Shanghai");
al.add("Chongqing");
Iterator<String> it=al.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}


Beijing
Shanghai
Chongqing
Tianjin


iterator: 迭代器(遍历器)

迭代器用于遍历集合中的元素

详细请看:/article/10457825.html

2.2.2 TreeSet

TreeSet:是以二叉树为存储结构 是有序的

public class Text {

public static void main(String[] args) {
TreeSet<String> al=new TreeSet<String>();
al.add("Beijing");
al.add("Tianjin");
al.add("Shanghai");
al.add("Chongqing");
Iterator<String> it=al.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}


Beijing
Chongqing
Shanghai
Tianjin


但是如果我们存自定义对象的时候 TreeSet就无法进行排序 从而报错

package javastudy;

import java.util.*;

public class Text {

public static void main(String[] args) {
TreeSet<Person> al=new TreeSet<Person>();
al.add(new Person("小明", 15));
al.add(new Person("王芳", 19));
al.add(new Person("张红", 12));
Iterator<Person> it=al.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}


Person类

package javastudy;

public class Person {
String name;
int age;
public Person(String name,int age) {
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "name=" + name + ", age=" + age;
}

}


异常信息



cannot be cast to java.lang.Comparable

Comparable:可比较的



那现在该怎么办呢?

有两种方法解决

方法一:传入的对象所属的类,必须实现Comparable

给Person实现Comparable接口

package javastudy;

public class Person implements Comparable<Person> {
String name;
int age;
public Person(String name,int age) {
this.name=name;
this.age=age;
}
@Override
public String toString() {
return "name=" + name + ", age=" + age;
}
@Override
public int compareTo(Person o) {
if(this.age>o.age){
return 1;
}
else if(this.age<o.age){
return -1;
}
else{
return 0;
}
}

}
结果

name=张红, age=12
name=小明, age=15
name=王芳, age=19


方法二:初始化TreeSet时,传入一个比较器(比较器是一个实现了Comparator的类的对象)作为一个构造参数。

package javastudy;

import java.util.Comparator;

public class MyCom implements Comparator<Person> {

@Override
public int compare(Person o1, Person o2) {
// TODO Auto-generated method stub
return o1.name.compareTo(o2.name);
}

}


TreeSet<Person> al=new TreeSet<Person>(new MyCom());


结果:

name=wangfang, age=19
name=xiaoming, age=15
name=zhanghong, age=12


如果方法一和方法二同时使用的时候 方法二优先执行

3.Map接口

他和Collection这个接口是有区别的

Collection 是单列集合,Map是双列集合

在Map接口中有Key-Value 键值对这个概念

键值对的键是不可以重复的 获取的时候用Set 而值是可以重复的 所以用Collection

而且Map在用的时候 有点像Set

3.1 HashMap

HashMap: 底层是哈希表,键值都可以是null。

读取方式以HashMap举例 TreeMap也是这么做的

3.1.1 获得所有键的结合keyset

public class Text {

public static void main(String[] args) {
HashMap<String, String> hm=new HashMap<String,String>();
hm.put("010", "Beijing");
hm.put("020", "Shanghai");
hm.put("021", "Chongqing");
hm.put("023", "Tianjin");

Set<String> s=hm.keySet();
Iterator<String> it=s.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}

}
}


023
020
010
021


3.1.2 获得所有值得结合values

public class Text {

public static void main(String[] args) {
HashMap<String, String> hm=new HashMap<String,String>();
hm.put("010", "Beijing");
hm.put("020", "Shanghai");
hm.put("021", "Chongqing");
hm.put("023", "Tianjin");
Collection<String> cl=hm.values();
Iterator<String> it=cl.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}

}
}


Tianjin
Shanghai
Beijing
Chongqing


3.1.3获得所有条目entryset

entry=一行,一个条目(包含键和值)

package javastudy;

import java.util.*;
import java.util.Map.Entry;

public class Text {

public static void main(String[] args) {
HashMap<String, String> hm=new HashMap<String,String>();
hm.put("010", "Beijing");
hm.put("020", "Shanghai");
hm.put("021", "Chongqing");
hm.put("023", "Tianjin");
Set<Entry<String, String>> en=hm.entrySet();
Iterator<Entry<String, String>> it=en.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}

//023=Tianjin
//020=Shanghai
//010=Beijing
//021=Chongqing


3.2 TreeMap

TreeMap: 底层是二叉树,支持键排序。有序的(键是有序的)

package javastudy;

import java.util.*;
import java.util.Map.Entry;

public class Text {

public static void main(String[] args) {
TreeMap<String, String> hm=new TreeMap<String,String>();
hm.put("023", "Beijing");
hm.put("021", "Shanghai");
hm.put("020", "Chongqing");
hm.put("030", "Tianjin");
Set<Entry<String, String>> en=hm.entrySet();
Iterator<Entry<String, String>> it=en.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}
}
}

//020=Chongqing
//021=Shanghai
//023=Beijing
//030=Tianjin


如果键是自定义对象的话 那么我们也需要用到TreeSet中的方法 方法都是一样的 不做演示

3.3 HashTable

HashTable:底层存储结构是哈希表,键和值都不可以是null。已过时。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: