java基础--14
2012-11-24 21:49
141 查看
1、集合类概述
存储对象的一种常用方式
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点
用于存储对象,长度可变,可以存储不同类型的对象。
集合框架
Collection
List
ArrayList
LinkedList
Vector
Set
HashSet
TreeSet
2、共性方法(Collection)
add方法的参数类型是Object以便接受任意类型的对象
集合中存储的都是对象的引用(地址)
add(Object)//添加元素
size()//获取集合长度
remove(Object)//删除元素 clear()//清空集合 removeAll(Collection)//去掉“一堆”元素
判断元素 contains(Object) isEmpty()
retainAll(Collection)//取交集,al1中只会保留和al2中相同的元素
3、迭代器
迭代器就是取出元素的方式
Iterator it=al.iterator(); it.next(); it.hasNext();
4、List集合共性方法
List:元素是有序的,元素可以重复。因为该集合体系有索引
Set:元素师无序的,元素不可以重复。
List:
特有方法,凡是可以操作角标的方法都是该体系特有的方法
增
add(index,element);
addAll(index,Collection);
删
remove(index);
改
set(index,element)
查
get(index);
subList(from,to);
listIterator();
5、ListIterator
indexOf
List集合特有的迭代器,ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素,会发生异常。所以在迭代时只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断、取出、删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator.
该接口只能通过List集合的listIterator方法获取
hasPrevious()
previous()
6、List集合具体对象的特点
List
ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢。线程不同步
LinkedList:底层的数据结构使用的是链表结构。特点:增删速度很快,查询慢。
Vector:底层是数组数据结构。线程同步。被ArrayList替代了
7、Vector中的枚举
Enumeration en=v.elements();
en.hasMoreElements();
en.nextElement();
枚举就是Vector特有的取出方式
其实枚举和迭代是一样的
因为枚举的名称及方法的名称都过长,所以被迭代器取代了。
8、LinkedList
特有方法:
addFirst();
addLast();
getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素会出现NoSuchElemementException
removeFirst();
removeLast();
获取元素,但元素被删除。如果集合中没有元素会出现NoSuchElemementException
在JDK1.6出现了替代方法。
offerFirst();
offerLast();
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素会出现null
pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null.
9、LinkedList练习:模拟一个堆栈或者队列数据结构
堆栈:杯子
队列:水管
import java.util.*;
public class LinkedListTest
{
public static void main(String[] args)
{
DuiLie dl=new DuiLie();
dl.add("java01");
dl.add("java02");
dl.add("java03");
dl.add("java04");
while(!dl.isNull())
{
System.out.println(dl.get());
}
}
}
class DuiLie
{
private LinkedList list=null;
DuiLie()
{
list=new LinkedList();
}
public void add(Object obj)
{
list.addFirst(obj);
}
public Object get()
{
return list.removeLast();
//return list.removeFirst();//栈
}
public boolean isNull()
{
return list.isEmpty();
}
}
10、ArrayList练习1
/*去除ArrayList中的重复元素*/
import java.util.*;
public class ArrayListTest
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add("java01");
al.add("java02");
al.add("java01");
al.add("java02");
al.add("java01");
al.add("java03");
System.out.println(al);
al=(ArrayList)singleElement(al);
System.out.println(al);
}
public static List singleElement(ArrayList al)
{
ArrayList newAl=new ArrayList();
Iterator it=al.iterator();
while(it.hasNext())
{
Object obj=it.next();
if(!newAl.contains(obj))
{
newAl.add(obj);
}
}
return newAl;
}
}
注意:在迭代时循环中next调用一次,就要hasNext判断一次
11、ArrayList练习2
List集合判断元素是否相同,依据是元素的equals方法
import java.util.*;
public class ArrayListTest2
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add(new Person("zhangsan01",30));
al.add(new Person("zhangsan02",31));
al.add(new Person("zhangsan02",31));
al.add(new Person("zhangsan03",32));
al.add(new Person("zhangsan04",33));
al.add(new Person("zhangsan04",33));
al=(ArrayList)singleElement(al);
Iterator it=al.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
System.out.println(p.getName()+"..."+p.getAge());
}
}
public static List singleElement(ArrayList al)
{
ArrayList newAl=new ArrayList();
Iterator it=al.iterator();
while(it.hasNext())
{
Object obj=it.next();
if(!newAl.contains(obj))
{
newAl.add(obj);
}
}
return newAl;
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
12、HashSet
Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
HashSet:底层数据结构是哈希表
TreeSet:
13、HashSet自定义存储对象
HashSet是如何保证元素唯一性的呢?是通过元素的两个方法,hashCode和equals来完成
如果元素的HashCode值相同,才会判断equals是否为true.如果元素的hashCode值不同,不会调用equals
Set的功能和Collection是一样的
import java.util.*;
public class HashSetTest
{
public static void main(String[] args)
{
HashSet hs=new HashSet();
hs.add(new Person("a1",11));
hs.add(new Person("a2",12));
hs.add(new Person("a3",13));
//hs.add(new Person("a4",14));
hs.add(new Person("a2",12));
Iterator it=hs.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
System.out.println(p.getName()+"..."+p.getAge());
}
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public int hashCode()
{
return name.hashCode()+age;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
14、HashSet判断和删除的依据
对于判断元素是否存在以及删除等操作,依赖的方法是元素的hashCode和equals方法
存储对象的一种常用方式
数组和集合类同是容器,有何不同?
数组虽然也可以存储对象,但长度是固定的,集合长度是可变的。
数组中可以存储基本数据类型,集合只能存储对象。
集合类的特点
用于存储对象,长度可变,可以存储不同类型的对象。
集合框架
Collection
List
ArrayList
LinkedList
Vector
Set
HashSet
TreeSet
2、共性方法(Collection)
add方法的参数类型是Object以便接受任意类型的对象
集合中存储的都是对象的引用(地址)
add(Object)//添加元素
size()//获取集合长度
remove(Object)//删除元素 clear()//清空集合 removeAll(Collection)//去掉“一堆”元素
判断元素 contains(Object) isEmpty()
retainAll(Collection)//取交集,al1中只会保留和al2中相同的元素
3、迭代器
迭代器就是取出元素的方式
Iterator it=al.iterator(); it.next(); it.hasNext();
4、List集合共性方法
List:元素是有序的,元素可以重复。因为该集合体系有索引
Set:元素师无序的,元素不可以重复。
List:
特有方法,凡是可以操作角标的方法都是该体系特有的方法
增
add(index,element);
addAll(index,Collection);
删
remove(index);
改
set(index,element)
查
get(index);
subList(from,to);
listIterator();
5、ListIterator
indexOf
List集合特有的迭代器,ListIterator是Iterator的子接口。
在迭代时,不可以通过集合对象的方法操作集合中的元素,会发生异常。所以在迭代时只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断、取出、删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator.
该接口只能通过List集合的listIterator方法获取
hasPrevious()
previous()
6、List集合具体对象的特点
List
ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快,但是增删稍慢。线程不同步
LinkedList:底层的数据结构使用的是链表结构。特点:增删速度很快,查询慢。
Vector:底层是数组数据结构。线程同步。被ArrayList替代了
7、Vector中的枚举
Enumeration en=v.elements();
en.hasMoreElements();
en.nextElement();
枚举就是Vector特有的取出方式
其实枚举和迭代是一样的
因为枚举的名称及方法的名称都过长,所以被迭代器取代了。
8、LinkedList
特有方法:
addFirst();
addLast();
getFirst();
getLast();
获取元素,但不删除元素。如果集合中没有元素会出现NoSuchElemementException
removeFirst();
removeLast();
获取元素,但元素被删除。如果集合中没有元素会出现NoSuchElemementException
在JDK1.6出现了替代方法。
offerFirst();
offerLast();
peekFirst();
peekLast();
获取元素,但不删除元素。如果集合中没有元素会出现null
pollFirst();
pollLast();
获取元素,但是元素被删除。如果集合中没有元素,会返回null.
9、LinkedList练习:模拟一个堆栈或者队列数据结构
堆栈:杯子
队列:水管
import java.util.*;
public class LinkedListTest
{
public static void main(String[] args)
{
DuiLie dl=new DuiLie();
dl.add("java01");
dl.add("java02");
dl.add("java03");
dl.add("java04");
while(!dl.isNull())
{
System.out.println(dl.get());
}
}
}
class DuiLie
{
private LinkedList list=null;
DuiLie()
{
list=new LinkedList();
}
public void add(Object obj)
{
list.addFirst(obj);
}
public Object get()
{
return list.removeLast();
//return list.removeFirst();//栈
}
public boolean isNull()
{
return list.isEmpty();
}
}
10、ArrayList练习1
/*去除ArrayList中的重复元素*/
import java.util.*;
public class ArrayListTest
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add("java01");
al.add("java02");
al.add("java01");
al.add("java02");
al.add("java01");
al.add("java03");
System.out.println(al);
al=(ArrayList)singleElement(al);
System.out.println(al);
}
public static List singleElement(ArrayList al)
{
ArrayList newAl=new ArrayList();
Iterator it=al.iterator();
while(it.hasNext())
{
Object obj=it.next();
if(!newAl.contains(obj))
{
newAl.add(obj);
}
}
return newAl;
}
}
注意:在迭代时循环中next调用一次,就要hasNext判断一次
11、ArrayList练习2
List集合判断元素是否相同,依据是元素的equals方法
import java.util.*;
public class ArrayListTest2
{
public static void main(String[] args)
{
ArrayList al=new ArrayList();
al.add(new Person("zhangsan01",30));
al.add(new Person("zhangsan02",31));
al.add(new Person("zhangsan02",31));
al.add(new Person("zhangsan03",32));
al.add(new Person("zhangsan04",33));
al.add(new Person("zhangsan04",33));
al=(ArrayList)singleElement(al);
Iterator it=al.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
System.out.println(p.getName()+"..."+p.getAge());
}
}
public static List singleElement(ArrayList al)
{
ArrayList newAl=new ArrayList();
Iterator it=al.iterator();
while(it.hasNext())
{
Object obj=it.next();
if(!newAl.contains(obj))
{
newAl.add(obj);
}
}
return newAl;
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
12、HashSet
Set:元素是无序(存入和取出的顺序不一定一致),元素不可以重复。
HashSet:底层数据结构是哈希表
TreeSet:
13、HashSet自定义存储对象
HashSet是如何保证元素唯一性的呢?是通过元素的两个方法,hashCode和equals来完成
如果元素的HashCode值相同,才会判断equals是否为true.如果元素的hashCode值不同,不会调用equals
Set的功能和Collection是一样的
import java.util.*;
public class HashSetTest
{
public static void main(String[] args)
{
HashSet hs=new HashSet();
hs.add(new Person("a1",11));
hs.add(new Person("a2",12));
hs.add(new Person("a3",13));
//hs.add(new Person("a4",14));
hs.add(new Person("a2",12));
Iterator it=hs.iterator();
while(it.hasNext())
{
Person p=(Person)it.next();
System.out.println(p.getName()+"..."+p.getAge());
}
}
}
class Person
{
private String name;
private int age;
Person(String name,int age)
{
this.name=name;
this.age=age;
}
public int hashCode()
{
return name.hashCode()+age;
}
public boolean equals(Object obj)
{
if(!(obj instanceof Person))
return false;
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
}
14、HashSet判断和删除的依据
对于判断元素是否存在以及删除等操作,依赖的方法是元素的hashCode和equals方法
相关文章推荐
- 黑马程序员_java编程基础14 String
- 【Java学习笔记】基础知识学习14【文件】
- java基础知识(14)---API
- java基础总结14-面向对象10(多态)
- 黑马程序员-Java基础总结14——正则表达式
- Java基础知识强化之网络编程笔记14:TCP之多个客户端上传到一个服务器的思考(多线程改进)
- Java基础知识_毕向东_Java基础视频教程笔记(14-18集合框架)
- java基础讲解14-----IO
- java基础19(Javaoo14)——反射、类加载与垃圾回收
- Java自学之路-Java基础教程-14:Java基本语句之4-条件判断语句switch和case
- java基础问题14
- 14.JavaWeb基础 EL(表达式语言)
- Java基础教程14-数组
- 【java基础 14】锁的粒度:ThreadLocal、volatile、Atomic和Synchronized
- java基础--14
- JAVA基础--JAVA API集合框架(ArrayList、HashSet、HashMap使用)14
- Java基础学习14(面向对象特征二:继承性)
- 黑马程序员_Java基础[14]_模版设计模式、习题练习
- 【java基础 14】锁的粒度:ThreadLocal、volatile、Atomic和Synchronized
- Java基础学习总结(14)---File类、字节流与字符流、字节字符转换流