黑马程序员————对象数组、集合类、迭代器、list接口简述

时间:2022-09-03 15:03:44


------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------



一、对象数组


 可以利用数组来存储同类型的许多的“对象”
 1.定义引用类型的数组:
 回顾:数组定义的格式:数据类型[] 数组名 = new 数据类型[数组长度];
  Student[] stuArray=new Student[3];//此行代码并没有产生对象,只是一个存储引用性的数组,其内元素的默认值是null
 2.实例化若干多的Student类的对象
  Student stu1 =new student(“李磊”,35);
 3.将对象存储到数组中(数组中存储的是对象的引用,地址值)
  stuArray[0] = stu;
 4.遍历数组


 

for (int x=0;x<stuArray.length ;x++ ){
Student stu=stuArray[x];//从数组中取出每一个元素是Student类的引用,可以用一个Student类的变量来接收
System.out.println(stu.name,stu.age);//取出对象的内容属性
}


 使用对象数组可以存除大量引用,方便以后的操作使用遍历。
 但是,他是数组其长度是固定的不易增删空间,并且一个数组只能存储同类型的引用。


  
二、集合类


 集合类就是一个类的容器,只能用来存除对象的引用。★★★
 特点:
  1、可以用来存储只能存除对象的引用
  2、集合存除对象,可以不用关心其长度,可以存储任意数量的对象
  3、★★可以存储不同类型的对象,但是对数只是存储一种类型
 用法:
  1、定义一个集合类
   Arraylist list=new Arraylist();
  2、实例化若干对象
   Student stu1 =new student(“李磊”,35)
  3、添加对象引用
   list.add(new Student());
  4、遍历集合类   
  

 for(int i = 0;i < list.size();i++){  //可以使用此集合的一个方法list.size()获取其内元素的个数
Student s = (Student)list.get(i); //跟数组差不多,这里调用的是get()方法,获取一个Student的引用.
//由于get方法返回的是Object类型,所以这里强转一下
System.out.println(s.name + "," + s.age);
}


  

 
三、java中的集合体系结构


  Collection(接口):是所有的set和list类型集合的顶层接口,定义了所有的set和list集合类型该有的一些方法。
   ——继承——|list(接口):有序的(存入和取出的顺序是相同的),允许重复元素。
   ——继承——|set(接口):无序,不允许重复的元素。
  



四.Collection接口


 1.它是List和Set的父接口;定义了get和list接口该有的一些方法。学习要从collection开始,使用从子类开始Collection list = new  ArrayList();

 2.成员方法
  A添加元素方法:boolean add(E(object) e) //向集合中添加元素;如果此 collection 由于调用而发生更改,则返回 true
      add(10) ;//此过程有个默认的自动装箱动作 //大家以后看到某个方法的形参或返回值是E的话,那么就先把它视作:Object类型:
  
  B删除元素方法:boolean remove(Object o) //移除元素:此 collection 由于调用而发生更改),则返回 true
      void clear()   //清空集合,删除其内的所有元素
  C判断: boolean contains(Object o)  //判断参数在集合中是否存在;存在:返回true,否则返回false
    boolean isEmpty()    //判断集合为空,空则返回true
  
  D获取属性:int size()     //获取集合内的元素的数量
   ****批量的方法***
  

  boolean addAll(Collection c)  //添加另一个集合中的所有元素
boolean removeAll(Collection c) //移除同指定集合中的元素相同的元素
boolean containsAll(Collection c) //判断是否包含指定集合中的所有元素
boolean retainAll(Collection c) //移除除了指定元素之外的全部元素

   
 打印Collection集合的引用,实际上是子类的对象,由于多态,调用的tostring()方法。由于子类重写了方法,所以要调用子类的tostring()方法,也就是Arraylist类中的方法。
  这是因为ArrayList 的toString方法重写了。但是这个方法不是在Arraylist中被重写的,而是在其继承类中被重写的,他继承自Abstracetlist,Abstracetlist继承自AbstractCollection,
  AbstractCollection中的tostring()方法为:返回此 collection 的字符串表示形式。该字符串表示形式由 collection 元素的列表组成,
  这些元素按其迭代器返回的顺序排列,并用方括号 ("[]") 括起来。相邻元素由字符 ", "(逗号加空格)分隔。
  通过 String.valueOf(Object) 可以将元素转换成字符串。 覆盖:类 Object 中的 toString
  若是存储的元素是字符串,那么就打印字符串内容,否则就是其内所存的引用的地址。
  
   3.用于遍历
  方法一:Object[] toArray();
  可以通过toArray方法将其转化为一个Object[]数组,再遍历数组就可以了。
  

Collection list = new ArrayList();
list.add("撒贝宁");
list.add("刘亦菲");
Object[] objArray = list.toArray();
for(int i = 0;i < objArray.length ; i++){
//由于toArray()方法返回的是Object类型的数组,而我们存储的是String对象。可以将Object强制转换为String
String s =(String) objArray[i];
System.out.println(s);

  方法二:Iterator(迭代器);


五、Iterator(迭代器):是一个接口



 1:创建引用:
 Collection list = new ArrayList();//实例化一个集合
 Iterator ite =list.iterator();//调用集合的iterator
 2:成员方法:
  boolean hasNext():判断是否可以返回下一个元素;,如果由下一个元素,就返回true,否则就是false;
  Object next():返回下一个元素。由于每次next()都会取出一个元素,所以在循环中,不要多次的调用next()
  while(it.hasNext()){
   Student s = (Student) it.next();  //接收的时候由于是Object类型,要注意使用强制类型转换。
   System.out.println(s.name + "," + s.age);    
 3:迭代器原码分析
   大家可以将Iterator接口当做一个"仓库管理员"。
   Arraylist等都重写了iterator方法,并且在方法中定义了一个内部类,这个内部类实现了Iterator接口,该方法并返回了一个这个内部类的对象;它是Iterator类型
   每个集合的iterator()方法都会返回一个Iterator类型的对象,这个子类的定义一般都是在"集合类"的内部,作为内部类实现的
   因为每个集合类都使用了不同的"数据结构"来存储元素,所以每个集合类内部管理元素的方式也不一样,所以各自实现各自的,但都必须是Iterator类型


interface Collection{

Iterator iterator();
}
interface List extends Collection{
}
//同样的Vector类的内部,也提供了iterator的内部实现;
class ArrayList implements List{
public Iterator<E> iterator() {//此方法是Collection接口中定义的
return new Itr();//返回的都是"内部类"的对象,都是Iterator类型;
}
private class Itr implements Iterator<E> {
public boolean hasNext() {
}
public E next() {
}
public void remove() {
}
}
}
interface Iterator{
public boolean hasNext();

public E next();

public void remove();
}




六.List接口


 特点:有序的,可以根据元素的整数索引来访问元素,允许元素重复。
 1.void add(int index,E element)  //在index的位置上插入元素element,原索引上的元素依次后移.可以在末尾追加元素的,索引指向最后一位加1就可以
   E remove(int index)    //移除列表中指定位置的元素(可选操作)。将所有的后续元素向左移动(将其索引减 1)。返回从列表中移除的元素。
   E get(int index)     //取index位置上的元素。(它就类似于数组的下标)
   E set(int index,E element)  //将element替换原index位置上的元素
   ListIterator listIterator()  //List接口特有的Iterator(),同样是用来遍历元素的
 *****用于遍历*******
 使用for循环结合使用Collection的size()和
 List的get()方法
 List list = new ArrayList();
 list.add("aaa");
 list.add("bbb");
 list.add("ccc");
 for(int i = 0;i < list.size(); i++){
  String s = (String)list.get(i);
  System.out.println(s);
 }
 
 2.ListIterator(接口):增加向上遍历的方式;
  继承自Iterator接口
  特有方法:
   hasPrevious():如果可以向上遍历,返回true
 *    previous():获取前一个元素;

 3.并发修改异常:
  
   当我们通过迭代器遍历集合时,如果通过List去向集合中添加元素,那么将会导致迭代器的数据不准确,所以Java禁止这样的行为,
  解决方法:
 通过迭代器遍历,那么就通过迭代器去添加;不要用List去添加;


 

  ListIterator it = list.listIterator();
while(it.hasNext()){
String s = (String)it.next();
if(s.equals("三毛")){
//在集合中添加一个人"四毛"
// list.add("四毛");
it.add("四毛");//插入到三毛的后面;
}
}