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

Java学习札记——集合框架一

2013-04-26 21:37 302 查看
---------------------超人学院hadoop、spark、storm大数据--------------------
一、什么是集合?
Java JDK 有两个很容易搞混的东东,一个是接口Collection,另一个是类Collections。
Collection是最基本的集合接口,一个Collection代表一组Object对象,即Collection的元素。一些 collection 允许有重复的元素,而另一些则不允许。一些
collection 是有序的,而另一些则是无序的。JDK 不提供此接口的任何直接 实现:它提供更具体的子接口(如 Set 和 List)实现。
所有实现Collection接口的类都必须提供两个标准的 构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这
个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。

  如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:

Iterator it = collection.iterator();//获得一个迭代因子
while(it.hasNext()) {
Object obj = it.next();//得到下一个元素
}

  由Collection接口派生的两个接口是List和Set。
常见的集合组成
Cololection

|——List:元素是有序的,元素可以重复,因为该集合体系有索引

| |——ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢。线程不同步。

| |——LinkedList:底层使用的是链表数据结构。特点:增删速度很快,查询稍慢。

| |——Vector:底层是数组数据结构。线程同步。被ArrayList代替了。
|

|——Set:元素师无序的,元素不可以重复。
先来看List接口:
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。

和下面要提到的Set不同,List允许有相同的元素。

   除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个 ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素, 还能向前或向后遍历。

  实现List接口的常用类有LinkedList,ArrayList,Vector。
List子类共有的一些方法:


add(index , element);

addAll(index,Collection);



remove(index)



set(index,element);



get(index);

subList(from,to);

listIterator();


以ArrayListList为例说明:代码很简单,掩饰ArrayList的一些基本方法
/*
1、add方法的参数类型是Object,一边与接收任意类型的对象。
2、集合中存储的都是对象的引用(地址)
3、什么是迭代器?其实就是集合的去除原生的方式。
*/
class ArrayListDemo
{
public static void main(String[] args)
{
//base_method_2();
method_get();
}

public static void method_get()
{
ArrayList al = new ArrayList();
//1、添加元素
al.add("java01");//add(Object obj)
al.add("java02");
al.add("java03");
al.add("java04");
/*
Iterator it = al.iterator();//获取迭代器,用于去除集合中的元素

while(it.hasNext())
{
sop(it.next());
}
*/
for(Iterator it = al.iterator();it.hasNext() ;)
{
sop(it.next());
}
}

public static void sop(Object obj)
{
System.out.println(obj);
}
public static void base_method_2()
{
ArrayList al1 = new ArrayList();

al1.add("java01");//add(Object obj)
al1.add("java02");
al1.add("java03");
al1.add("java04");

ArrayList al2 = new ArrayList();

al2.add("java03");//add(Object obj)
al2.add("java04");
al2.add("java05");
al2.add("java06");

//al.retainAll(a2);//取交际,al中只会保留和a2中相同的元素
al1.removeAll(al2);
sop("al1:"+ al1);
sop("al2:"+ al2);
}

public static void base_method()
{
//创建一个集合容器,使用Collection接口的子类,ArrayList
ArrayList al = new ArrayList();
//1、添加元素
al.add("java01");//add(Object obj)
al.add("java02");
al.add("java03");
al.add("java04");

//打印原集合
sop(al);
//2、获取个数,集合长度
sop("size: " + al.size());
//3、删除元素。
sop("------------修改后的集合-------");
al.remove("java02");
sop(al);
sop("size: " + al.size());
sop("------------修改后的集合1-------");
//al.clear()
//4、判断元素
sop("java03是否存在?" + al.contains("java03"));
sop("集合是否为空?" + al.isEmpty());
}
}


相比于List的有序,Set则是无序集合。
|--Set:元素师无序(存入取出是无序的),元素不可以重复

|--HashSet:底层数据结构式哈希表

HashSet是如何保证元素唯一性的呢?

是通过元素的两个方法,hashCode和equals来完成的。

如果元素的HashCode相同。才会判断equals是否为true

如果元素的HashCode不同,不会调用equals、

注意:对于判断元素是否存在,以及删除等操作,以来的方法是元素的hashCode和equals方法。

ArrayList判断元素是否相同依赖的是equals(),HashSet判断元素是否相同先依赖hashCode再依赖equals。

|--TreeSet:

Set集合的功能和List是一样的。
自不多说,举一例说明:
class  HashSetTest
{
public static void sop(Object obj)
{
System.out.println(obj);
}

public static void main(String[] args)
{
HashSet hs = new HashSet();
hs.add(new Person("a1",30));
hs.add(new Person("a2",31));
hs.add(new Person("a3",32));
hs.add(new Person("a4",34));
//	hs.add(new Person("a2",31));

sop("a1:" + hs.contains(new Person("a5",30)));

hs.remove(new Person("a3",32));
for(Iterator it = hs.iterator();it.hasNext();)
{
Person p = (Person)it.next();
sop(p.getName() + " ... " + p.getAge());
}
}
}

class Person
{
private String name;
private int age;
Person(String name , int age)
{
this.name = name;
this.age = age;
}

public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public String toString()
{
return this.name + " ... " + this.age;
}
public int hashCode()
{
System.out.println(this.name + " **** " );
return name.hashCode() + age * 39;//乘以29是为了尽量为了保证hash值的唯一性。
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
System.out.println(this.name + " ------ " + p.name);
return this.name.equals(p.name) && this.age == p.age;
}
}


在学习,集合的时候,老师还讲了一个很重要的概念,泛型
泛型:JDK1.5版本以后出现新特性。用于解决安全问题,是一个类型安全机制。

好处

1、将运行时期出现的问题ClassCastException。转移到了编译时期, 方便与程序员解决问题,让运行时期减少问题

2、避免了强制转换的麻烦。

泛型格式:通过<>来定义要操作的引用数据类型。

在使用java提供的对象时,什么时候写泛型呢?

通常在集合框架中很常见,只要见到<>就要定义泛型。

其实<>就是用来接收类型的。

当时用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。

举一个例子说明:演示了泛型的使用。
class GenericDemo
{
public static void main(String[] args)
{
TreeSet<String> ts = new TreeSet<String>(new LenComparator());
ts.add("abcd");
ts.add("cc");
ts.add("cba");
ts.add("aaa");
ts.add("z");
ts.add("hahaha");

for(Iterator<String> it = ts.iterator();it.hasNext();)
{
String s = (String)it.next();
System.out.println(s);
}
}
}
class LenComparator implements Comparator<String>
{
public int compare(String o1 , String o2)
{
int num = new Integer(o2.length()).compareTo(new Integer(o1.length()));
if(num == 0)
return o1.compareTo(o2);
return num;
}
}


明天完成接下来的Map和Collections工具类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: