java基础--14

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方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值