黑马程序员Java基础__集合(上)

---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------

 一、  集合类  


一)概述:
java语言的java.util包中提供了一些集合类,这些集合又被成为容器。提到容器不难会想象到数组,集合类与数组的不同之处,
数组的长度是固定的,集合的长度是可变的。数组用来存放基本类型的数据,集合用来存放对象的引用,集合有List集合、Set集合、Map集合,
其中List和Set集合是想了Collection接口,个个接口还提供了不同的实现类。

 二)部分基本框架:

Collection


 |-----List---:
元素是有序的,元素可以重复。因为该集合体系有索引。
          |----ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。
          |----LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。
          |----Vector:底层是数组数据结构。线程同步。被ArrayList替代了因为效率低。

 |-----Set ---:Set集合的功能和Collection是一致的。元素是无序(存入和取出的顺序不一定一致),元素不可以重复,其存储顺序是按哈希值顺序。
          |----HashSet:底层数据结构是哈希表。是线程不安全的。不同步。

HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。
          |----TreeSet---:可以对Set集合中的元素进行排序。
                                 底层数据结构是二叉树。
                                 保证元素唯一性的依据:compareTo方法return 0。


                                 TreeSet排序的第一种方式:让元素自身具备比较性。元素需要实现Comparable接口,覆盖compareTo方法。
也种方式也成为元素的自然顺序,或者叫做默认顺序。


                                 TreeSet的第二种排序方式: 当元素自身不具备比较性时,或者具备的比较性不是所需要的。这时就需要让集

合自身具备比较性。在集合初始化时,就有了比较方式。定义一个类,实现Comparator接口,覆盖compare方法。


--------------------------华丽的分割线-----------------------------


三、集合中的共性方法


1、增加
   add(Object obj);   ----->  添加元素。

2、删除
   remove();      ----->  删除集合中指定参数的元素。
   removeAll();   ----->  删除当前集合中与另一集合相同的元素,即只保留与另一集合不同的元素。
   clear();       ----->  清空集合中的元素,集合还存在。

3、获取集合长度
   size();        ----->  获取集合长度,即集合元素的个数。

4、修改
   set(int index,e);  ----->  将指定位置(index)上的元素修改为给定的参数e。

5、判断
   boolean contains(e); ----->  判断给定元素e是否存在于集合中。

6、迭代器
   iterator()   ----->  集合取出元素的方式。
   boolean hasNext();   ----->  判断是否还有下一个元素。
   next();              ----->  取出下一个元素。

示例1:

import java.util.*;

class CollectionDemo {  public static void sop(Object obj) {   System.out.println(obj);  }

 public static void main(String[] args) {   base_method();   sop("------------------");   method2();   sop("------------------");   method_get();  }

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

  // 打印原集合   sop("原集合" + al);

  // 3.删除元素   al.remove("java02");

  // 清空集合中的元素   al.clear();

  // 4.判断元素   // 判断集合中是否存在某个元素:contains()   sop("是否存在java03:" + al.contains("java03"));   // 判断集合是否为空:isEmpty()   sop("判断集合是否为空:" + al.isEmpty());

  // 2.获取个数,集合长度   sop("size :" + al.size());

  // 打印改变后集合   sop(al);

  System.out.println("Hello World!");  }

 public static void method2() {   // 创建另一个新集合   ArrayList at1 = new ArrayList();   at1.add("java01");   at1.add("java02");   at1.add("java03");   at1.add("java04");

  // 打印原集合   sop("原集合at1:" + at1);

  ArrayList at2 = new ArrayList();   at2.add("java01");   at2.add("java02");   at2.add("java05");   at2.add("java06");   sop("原集合at2:" + at2);

  // removeAll()--->只保留和at2不相同的元素。   at1.removeAll(at2);   sop("remove后at1:" + at1);   sop("now集合at2:" + at2);

  // 取两个集合的交集,at1中只保留交集的部分   at1.retainAll(at2);

  sop("取完交集后的at1:" + at1);  }

 public static void method_get() {   // 创建另一个新集合   ArrayList at1 = new ArrayList();   at1.add("java01");   at1.add("java02");   at1.add("java03");   at1.add("java04");

  // 打印原集合   sop("原集合at1:" + at1);

  // 获取迭代器,用于去除集合中的元素   Iterator it = at1.iterator();

  while (it.hasNext()) {    sop(it.next());   }  } }



二、 List集合

一、对于List集合特有的方法:
凡是可操作角标的方法都是该体系特有的方法,基本方法和Collection中的一样。

1、增加:
   add(int index,e);               ----->  在指定位置增加给定的元素。
   addAll(int index,Collection);   ----->  在指定位置增加给定集合中的所有元素,若省略位置参数,则在当前集合的后面依次添加元素。

2、删除:
   remove(int index); ----->  删除集合中指定位置上的元素。
   
3、修改:
   set(int index,e);  ----->  将指定位置(index)上的元素修改为给定的参数e。

4、查询
   get(int index);    ----->  获取指定位置上的元素。
   indexOf(e);        ----->  通过指定元素获取其在集合中的位置。
   subList(int from,int to);    ----->  获取从from到to位置上的元素。
   Iterator listIterator();     ----->  返回Iterator接口类型值。


---------------华丽的分割线-----------------------------

二、LinkedList类 特有方法:
一)JDK1.6之前的方法
1、增加:
   addFirst(obj);   ----->  在集合头部添加给定的元素。
   addLast(obj);    ----->  在集合尾部添加给定的元素。

2、获取:
   getFirst();   ----->  获取集合第一个元素,若集合中没有元素,则出现NoSuchElementException。
   getLast();    ----->  获取集合最后一个元素,若集合中没有元素,则出现NoSuchElementException。
   
3、删除
   removeFirst();  ----->  获取并删除集合第一个元素,若集合中没有元素,则出现NoSuchElementException。
   removeLast();   ----->  获取并删除集合最后一个元素,若集合中没有元素,则出现NoSuchElementException。

二)JDK1.6出现的替代方法:
1、增加:
   offerFirst(obj);   ----->  在集合头部添加给定的元素。
   offerLast(obj);    ----->  在集合尾部添加给定的元素。

2、获取:
   peekFirst();   ----->  获取集合第一个元素,若集合中没有元素,则返回null。
   peekLast();    ----->  获取集合最后一个元素,若集合中没有元素,则返回null。
   
3、删除
   pollFirst();  ----->  获取并删除集合第一个元素 ,若集合中没有元素,则返回null。
   pollLast();   ----->  获取并删除集合最后一个元素,若集合中没有元素,则返回null。


--------------------------华丽的分割线-----------------------------

三、 Set集合

 TreeSet排序的第一种方式:实现Comparable接口,覆盖compareTo方法。

示例1:

class Student implements Comparable//该接口强制让学生具备比较性。  
{  
 private String name;  
 private int age;  
 Student(String name,int age)  
 {  
  this.name = name;  
  this.age = age;  
 }  
 public int compareTo(Object obj)  
 {  
  if(!(obj instanceof Student))  
   throw new RuntimeException("不是学生对象");  
  Student s = (Student)obj;  
  if(this.age>s.age)  
   return 1;  
  if(this.age==s.age)  
  {  
   return this.name.compareTo(s.name);  
  }  
  return -1;  
 }  
  public String getName()  
 {  
  return name;  
 }  
 public int getAge()  
 {  
  return age;  
 }  
} 


TreeSet排序的第二种方式:实现Comparator接口,覆盖compare方法。


示例2:

TreeSet ts = new TreeSet(MyCompare);  
class MyComart implements Comparator//定义一个类,实现Comparator接口,覆盖compare方法。  
{  
 public int compare(Object o1,Object o2)//覆盖compare方法。  
 {  
  Student s1 = (Student)o1;  
        Student s2 = (Student)o2;  
  int num = s1.getName().compareTo(s2.getName());  
        if(num==0)  
  {  
   return new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));//比较年龄因为Intege已经具有比较性了.直接比就可以啦  
               /* 
               if(s1.getAge()>s2.getAge()) 
                      return 1; 
               if(s1.getAge()==s2.getAge()) 
                      return 0; 
               return -1; 
               */  
        }  
        return num;  
 }  
}  


---------------------- ASP.Net+Android+IO开发S.Net培训、期待与您交流! ----------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值