------<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("四毛");//插入到三毛的后面;
}
}