黑马程序员_java 集合

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 

Blog5_1集合基本概念

在存储元素的过程中很多时候并不知道要存储的元素个数,此时用数组的话,就显得很难操作,鉴于此种情况,java就提供了一种新的数据存储容器集合。

集合与数组的区别:

数组:长度固定、存储可以是基本类型,也可以是引用类型、同一个数组只能存储同一类型的元素。

集合:长度不定、存储的元素只能是引用类型、可以存储任意类型的元素。

Blog5_2 Collection集合

(1)    Collection集合的功能

Collection是集合的顶层接口,下面来学习Collection集合

添加功能:

booleanadd(Object e)----添加一个元素

boolean addAll(Collectionc)  ----添加一个集合(如果原集合中有元素,后添加的元素不覆盖不修改原集合中的元素,只是追加在原集合元素的后面)。

删除功能:

voidclear()----删除所有元素

remove(Objecte)---- 删除指定的一个元素

判断功能:

booleancontains(Object e)----判断集合中是否有指定的元素(当包含的含义是:内容相同的对象时~~要重写equals()方法)

booleanisEmpty()----判断集合是否为空

       遍历功能:

              Iteratoriterator()----迭代器(接口)

其中有两个方法很重要:boolean hasNext(),Object next();

       长度功能:

              Intsize()----返回集合的长度值,注意要和array中的length,和String中的length()区别;

       转换功能:

Object[]toArray()----把集合转换成数组的功能。

Blog5_3  List集合(接口)

(1)list集合的特点

元素存储和取出有序,元素可以重复。

(2)List集合常用的三个子类及特点

ArrayList:底层数据结构是数组,查询快,增删慢,线程不安全,效率高。

Vector:底层数据结构是数组,查询快,增删慢,线程安全,效率低。

LinkedList:底层数据结构是链表,查询慢,增删快,线程不安全,效率高。

(3)ArrayList集合

ArrayList集合的三种遍历方法:

      ArrayList<String>arr = new ArrayList<String>();
      arr.add("hello");
      arr.add("world");
      arr.add("java");
      //迭代器遍历的方法
      Iterator<String>it = arr.iterator();
      while (it.hasNext()) {
         System.out.println(it.next());
      }
      //增强for遍历集合
      for (String str : arr) {
         System.out.println(str);
      }
     
      // 使用get()和size()的配合遍历集合
      //ArrayList、Vector、LinkedList都有 get()方法
      for (int i = 0; i <arr.size(); i++) {
         String str = arr.get(i);
         System.out.println(str);
      }

 

(4)Vector集合及其子类

   Vector集合的特殊方法如下:

1:添加功能

public void addElement(Object obj)

2:遍历方法

 public Object elementAt(intindex) 

 3:迭代器的功能

 publicEnumeration elements()           

 booleanhasMoreElements()   

 Object nextElement() 

Vector的三种遍历方法如下:

  //迭代器进行遍历
      //Vector的迭代器实质和ArrayList的没有区别,只是书写不一样而已。
      Enumeration<String>en=v.elements();
      while(en.hasMoreElements()){
         System.out.println(en.nextElement());
      }
     
      //怎强for进行遍历
      for(String str:v){
         System.out.println(str);
      }
     
      //使用普通for
      for(int i=0;i<v.size();i++){
         String str=v.elementAt(i);
         System.out.println(str);
      }

 

(4)LinkedList集合

LinkedList的一些特殊方法:

      A:添加功能

          public void addFirst(Object e)

          public void addLast(Object e)

      B:删除功能

          public Object removeFirst()

          public Object removeLast()

      C:获取功能

          public Object getFirst()

         public Object getLast()

LinkedList的三种遍历方法:

 //增强for遍历
      for(String str:link){
         System.out.println(str);
      }
      //普通for遍历
      for(inti=0;i<link.size();i++){
         String str=link.get(i);
         System.out.println(str);
      }
      //迭代器遍历
      Iterator<String>it=link.iterator();
      while(it.hasNext()){
         String str=it.next();
         System.out.println(str);
      }

 

总结:由于Collection中有size()方法,list中有get()方法,故list的所有子类都能用普通for遍历,又由于Collection中有iterator()方法,故所有属于Collection的子类都能使用迭代器方法进行迭代遍历。Jdk5后增加了,增强for来遍历集合,使得遍历大大方便了。

Blog5_4  Set集合及其子类

(1)Set集合的特点

Set集合存储元素无序、唯一

(2)HashSet集合

HashSet由于Set表中没有get(index)方法故,遍历方式只有增强for和迭代器方式两种。遍历方式和list集合的完全一样,这儿就不在累赘。下面着重学习一下HashSet集合元素保持唯一性的原因。

(3)HashSet集合元素保持唯一性的原因

通过查看add的源码,我们最终发现了判断条件:

 if (e.hash == hash && ((k =e.key) == key || key.equals(k)))

 &&的左边和右边

 1:e.hash == hash

 这个hash值跟hashCode()方法相关。而我们都知道,hashCode()返回的是对象的哈希值。

 2:((k = e.key) == key || key.equals(k))

||的左边和右边(k = e.key) == key比较对象的地址值。

key.equals(k)

   小结:通过查看add的源码我们可分析出HashSet集合通过底层的HasCode()和equals()方法保持集合元素的唯一性。

(4)TreeSet集合

①TreeSet的自然排序

      TreeSet<String>ts = new TreeSet<String>();
      ts.add("hello");
      ts.add("world");
      ts.add("java");
      ts.add("abc");
      ts.add("zero");
      for (String s : ts) {
         System.out.println(s);
      }

 

打印出的结果是:abc、hello、java、world、zero

是按照单词的首字母进行排序,类似的这种排序方法叫做自然排序方法。

上面例子能进行排序的实质是String类中实现了一个Comparable<String>排序的接口。

TreeSet存储自定义对象使用自然排序方法的步骤:

A.  是要进行排序的类实现Comparable接口如:

public class Teacher implementsComparable<Teacher> {

B.重写compareTo方法,如下实例代码:

public intcompareTo(Teacher t) {
      intnum1=this.name.length()-t.name.length();
      intnum2=(num1==0)?this.name.compareTo(t.name):num1;
      intnum3=(num2==0)?(this.age-t.age):num2;
      returnnum3;
   }

 

③TreeSet存储自定义对象使用比较器排序的方法步骤:

A.创建TreeSet集合,使用TreeSet(Comparator<?superE>comparator)构造方法;

B.用匿名内部类的方法重写compare方法

如代码:

TreeSet<Teacher> ts=new TreeSet<Teacher>(newComparator<Teacher>() {
         @Override
         public int compare(Teacher t1,Teacher t2) {
            intnum1=t1.getName().length()-t2.getName().length();
            intnum2=(num1==0)?t1.getName().compareTo(t2.getName()):num1;
            intnum3=(num2==0)?(t1.getAge()-t2.getAge()):num2;
            return num3;
         }
      });

 

当然上面的过程也可以通过新建立一个类,让其实现Comparator接口,然后再向TreeSet的构造方法传递一个新建类的对象来实现。但匿名内部类使用起来会使代码更简洁,明了提倡使用匿名内部类。

 

----------------------- android培训java培训、java学习型技术博客、期待与您交流! ----------------------

详情请查看:http://edu.youkuaiyun.com/heima

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值