第十三天总结0407

1.集合
集合是专门用来放对象的,它是一种容器(容器思想)
集合和数组的区别:
数组既可以存储基本数据类型,也可以存储对象,但是数据存储的对象必须是同一个类型,而且数组的长度是固定的;
集合只能存储对象,但是他可以存储任意的对象,他没有固定的长度.
------------------------
集合接口:Collection接口,这个接口实现了Iterable,Iterable中只有一个iterator方法,这个方法就是迭代器
Collection接口中的通用方法常见有:
add添加,clear清除,contains判断该集合是否存在指定元素
equals比较集合是否相等,iterator迭代器
remove移除某个元素,size集合长度,toArray把集合转化成数组
------------------------
迭代器取出集合元素的方式:
因为一个方法是不足以描述取出这个动作的,因为每个容器底层的数据结构是不同的,最简单的理解就是,如果我们要取出某个集合中的某个元素,先要判断该集合是否存在该元素,这就要

一个判断方法了,所以JAVA把从集合中取出元素的动作封装成了一个接口,在集合中通过内部类的形式取出元素,这个集合就是Iterable,迭代器就是iterator
------------------------
下面以ArrayList类的集合对象为例做一次集合取出元素的演示
for(Iterator it=lit.iterator();it.hasNext();)
{
 System.out.println(it.next());
}
------------------------------------------------
2.List接口
List接口继承了Collection
List接口的规则:它对元素的存取时有顺序的,可以存入重复的元素,因为该集合中的元素都有角标
List接口中除了继承了Collection中的方法外,另外还有多种操作角标的方法:
------------------------
add(index.obj)在指定的角标添加元素,如果该位置上本来有元素,则该元素以及他后面的元素全部后移(插入元素)
indexOf(obj)返回指定元素在该集合中第一次出现的角标
lastIndexOf(obj)返回制定元素在该集合中最后一次出现的角标
remove(index)移除制定角标位置上的元素
set(index,obj)把制定角标上的元素修改成obj
get(index)获取某个角标上的元素
indexOf(index)获取某个角标上的元素
------------------------
对于list接口,我们不仅可以用iterator迭代器进行便利取出,还可以用get方法进行遍历取出,还可以用listiterator
for(int x=0;x<list.size(),x++)
{
 System.out.println(list.get(x));
}
------------------------
List的三个常用类:
ArrayList底层是数组数据结构的;不同步,ArrayList替代了Vector,他比LinkedList查询的速度快,ArrayList构造函数默认构造的是一个长度为10的数组,当集合长度超过10的时候,就会

在新建一个数组,新建的数组会引用原来的所有元素,新增的数组长度是成倍减少的。
Vector底层是数组数据结构的,同步的,效率非常低,他的底层和ArrayList的原理是一样的,但是他新建数组的长度是成倍增加的。
LinkedList底层是链表数据接口的,增删元素的时候速度快,但是查询的速度慢
------------------------
ArrayList和Vector的区别:
1.数组延长上不同,2.线程安全上不同,3前两点导致了效率上的不同。4、ArrayList具备迭代器,而Vector不仅具备iterator迭代器,还支持枚举方法。
------------------------
Enueration和迭代器的方式是一样的,只是迭代器比他优化:
for(Enuemration en=voc.elements();en.hasMoreElements();)
{
 System.out.println(en.nextElement());
}
如何在ArrayList中使用枚举:
ArrayList al=new ArrayList();
final Iterator it=al.iterator();//内部类只能访问最终化的成员变量
Enumeration en=new Enumeration(){
 public boolean hasMoreElements()
 {
  return it.hasNext();
 }
 public Object nextElement()
 {
  return it.next();
 }
};//内部类,自己做一个Enumeration对象,并且构造里面的方法
while(en.hasMoreElements())
{
 System.out.println(en.nextElement())
}
---------------------------------------------
3.set集合
set:它对元素的存取是无序的,不可以存入重复的元素;没有角标
set有两个常用的子类对象:HashSet,TreeSet
HashSet:他和Collection中的方法是一致的,它只有用Iterator这一种方式才能取元素;
HashSet:他的底层数据结构是哈希表,他是按照哈希值指定位置的;对于判断该集合元素是否重复,是通过hashCode方法和equals方法来保证元素的唯一性;
判断方式:先会判断两个对象的hashCode值,只有hashCode值相同的时候才会判断equals方法。他是不同步的
如果在描述事物的事情,要想到该事物会不会被存到集合当中,如果要存到集合当中,最好就要复写他们从Object中集成来的hashCode和equals方法,来保证他们在hashSet这样的接口中的存


------------------------
TreeSet:底层的数据接口是二叉树。弥补了Set集合的不足,这个集合中的元素可以对他的元素进行排序。
Comparable接口,此接口对实现他的类进行强行排序
compareTo方法是属于Comparable接口的,是JAVA.lang包里的。
TreeSet:通过return 0来保证元素的唯一性。
如果往TreeSet集合中存入的元素并未实现Comparable接口,或者实现了Comparable接口,但是其比较方式并不是我们所需要的,那么这时候我们就用比较器,让集合具备比较性。
(比较器)comparte方法属于Comparator接口,是JAVA. util包里的
比较方式:1.让元素自身具备比较性,元素实现Comparable接口,覆盖compareTo方法
2.让TreeSet集合自身具备比较性,自动以Comparator的子类对象,覆盖compare方法,将比较器的对象作为参数传递给TreeSet集合的构造函数。(比1要常用)因为比较器对象只有一个方法,

所以我们可以直接用匿名内部类构造
这两种方式都要注意主要条件和次要条件。当判断return 0的时候,先比较主要条件,然后在比较次要条件
当return 1的时候可以使存取的顺序一致
------------------------------------------------
/*
需求:去除一个Vector中的相同元素;
*/
import java.util.*;
class test10
{
 public static void main(String[] args)
 {
  Vector a=new Vector();
  a.add(new Student("A",30));
  a.add(new Student("B",32));
  a.add(new Student("C",33));
  a.add(new Student("A",30));
  a.add(new Student("D",30));
  a.add(new Student("E",30));
  a.add(new Student("A",30));
  a.add(new Student("C",33));
  a.add(new Student("E",30));
  a.add(new Student("B",32));
  method(a);
 }
 public static void method(Vector v)
 {
  Vector v1=new Vector();
  v1.add(v.get(0));
  for (int x=1;x<v.size() ;x++ )
  {
   if (!v1.contains(v.get(x)))
    v1.add(v.get(x)); 
  }
  for (Iterator it=v1.iterator();it.hasNext() ; )
  {
   System.out.println(it.next());
  }
 }
}
class Student
{
 private String name;
 private int age;
 Student(String name,int age)
 {
  this.name=name;
  this.age=age;
 }
 public boolean equals(Object o)//元素是对象,判断对象是否相同很重要
 {
  Student s=(Student)o;
  return this.name.equals(s.name)&&this.age==s.age;
 }
 public String toString()
 {
  return this.name+"---"+this.age;
 }
}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值