———–android培训、java培训、java学习型技术博客、期待与您交流!————
1
对象数组:就是数组里边存储的是一个一个的对象。
特点:数组一但定义,长度不能改变。
问题:在日常的开发中,用的比较多的是变化的。所以用数组存储就不是适合,针对此,java提供了新的容器——-集合
集合和数组的区别:
集合:
A 长度可以改变
B 只能存储引用类型
C 可以存储任意类型的数据
数组:
A 长度不可以改变
B 可以存储基本类型,也可以存储引用类型
C 只能存储统一种同一中类型的数据
2
Collection集合概述
Collection(接口)
Collection继承体系结构图:
Collection
|--List(接口)
|--ArrayList
|--Vector
|--LinkedList
|--Set(接口)
|--HashSet
|--TreeSet
Collection集合的功能概述:
A:添加功能
boolean add(Object e):往集合中添加一个元素。
boolean addAll(Collection c):往集合中添加一个集合的元素。
B:删除功能
void clear():移除集合中的所有元素。
boolean remove(Object o):移除集合中指定的一个元素。
boolean removeAll(Collection c):移除集合中指定的一个集合的元素。
C:判断功能
boolean contains(Object o):判断集合中是否包含指定的元素。
boolean containsAll(Collection c):判断集合中是否包含指定的一个集合的元素。
boolean isEmpty():判断集合是否为空。
D:迭代器 Iterator iterator()用于获取集合中的元素。
E:长度功能
int size():获取集合中元素的个数。
F:交集功能
boolean retainAll(Collection c)
例如:集合A交集合B————A.retainAll(B);
把集合A和集合B中相同的元素存放在集合A中,
如果集合A发生过改变,就返回true,否则返回false
G:转换为数组
Object[] toArray():把集合转换为数组。
Collection集合的迭代器(Iterator)
A:迭代器是集合的一种遍历方式。
B:迭代器的使用步骤
a:通过集合对象获取迭代器对象。
b:通过迭代器对象判断是否有元素。
c:通过迭代器对象获取元素,并移动到下一个位置。
C:每种具体的集合的迭代器的具体实现是在每个具体集合类中。
以内部类的方式实现的。
介绍一下Iterator(接口)
A 是一个接口
B 没有构造方法
成员方法:
--boolean hasNext()
如果仍有元素可以迭代,则返回 true
--Object next()返回迭代的下一个元素
public class Collection1
{
public static void main(String[] args)
{
//创建集合对象,这里用到了多态
Collection c=new ArrayList();
//向集合中添加元素
c.add("Hello");
c.add("java");
c.add("Hadoop");
//获得集合对象迭代器
Iterator it=c.iterator();
//遍历集合对象
while(it.hasNext())
{
System.out.println((String)it.next());
}//Object next()此方法返回的是一个Object类型的对象,要想得到String类型的数据,就需要强转
//需要说明的是:因为collection集合中只有得到集合元素的个数的方法,没有得到对应索引出的元素的方法,所以不能使用普通for循环来遍历Collecion集合
}
}
3
List集合(接口)
(1)List和Set集合都是Collection集合的字接口他们的区别是:
List:该集合中的元素是有序的(存储和取出的顺序是一致的),可以重复
Set:该集合中的元素是无序的,元素唯一不可以重复
(2)没构造方法
重要的功能方法:
A:添加功能
boolean add(int index,Object) 在指定的位置添加元素。
B:删除功能
Objiect remove(int index) 删除指定索引位置的元素,并返回该元素。
C:修改功能
Objict set(int index,Object obj) 用指定的元素修改指定位置的元素,并把修改前的元素返回。
D:获取功能
Objict get(int index) 根据给定的索引,获取元素。
E:列表迭代器
有两种迭代器:
Iterator iterator()(这是继承Collection集合的迭代器)
ListIterator listIterator()(这是本身特有的)
package Collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListIterator
{
public static void main(String[] args)
{
//创建集对象
List li=new ArrayList();
//向集合中添加数据
li.add("java");
li.add("android");
li.add("hello");
----------
方法一:获得collection的迭代器进行遍历
//获得迭代器(collection的)
Iterator it=li.iterator();
while(it.hasNext())
{
System.out.println((String)it.next());
}
----------
方法二:
//因为List集合本身有E get(int index)和int size()所以可以使用普通for循环
for (int i = 0; i < li.size(); i++)
{
String string=(String)li.get(i);
System.out.println(string);
}
----------
方法三:还可以使用ListIterator进行遍历(和Iterator一样)
}
}
(3)
ListIterator的使用:
A:可以逆向遍历,但是要先正向遍历,一般不用。
--方法:E previous()返回列表中的前一个元素
--方法:boolean hasPrevious()如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。(
public class ListIterator
{
public static void main(String[] args)
{
//创建集对象
List li=new ArrayList();
//向集合中添加数据
li.add("java");
li.add("android");
li.add("hello");
//获得迭代器(首先需要正向遍历,才能用逆向遍历)(而且正向遍历的时候必须用ListIterator迭代器,用其他的迭代器或者普通for循环是不行的)
ListIterator lit=li.listIterator();
while(lit.hasNext())
{
System.out.println((String)lit.next());
}
System.out.println("--------------");
//正向遍历结束后,才能逆向遍历
while(lit.hasPrevious())
{
String string=(String) lit.previous();
System.out.println(string);
}
System.out.println();
}
}
B:并发修改异常的问题:
问题描述,在迭代器迭代的过程中,集合的元素是不能改变的,要是强制改变(向集合中添加元素),将出现并发修改异常
在迭代器迭代的过程中,是不能通过集合来修改集合
但是:有时候的我们的需要再迭代器迭代的时候修改集合中的数据
这时候,ListIterator迭代器有特殊的方法
--void add(E e)将指定的元素插入列表(可选操作
--void set(E e)用指定元素替换 next 或 previous 返回的最后一个元素
处理这个问题有两种方法:
方法一:不用迭代器遍历集合,用集合本身来遍历集合
方法二:用ListIterator进行遍历
package Collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
* 需求:遍历给定的集合,是是否有张三这个元素,有,就向集合中添加另外一个元素李四
*/
public class ListIterator2
{
public static void main(String[] args)
{
// 创建集合对象
List li = new ArrayList();
li.add("赵云");
li.add("关羽");
li.add("张三");
li.add("伍六一");
li.add("刘备");
// 用集合本身遍历
for (int i = 0; i < li.size(); i++)
{
String string = (String) li.get(i);
if ((string).equals("张三"))
;
{
li.add("李四");
}
}
System.out.println(li);
// 用迭代器实现
ListIterator listIterator = li.listIterator();
while (listIterator.hasNext())
{
String string = (String) listIterator.next();
if (string.equals("张三"))
{
listIterator.add("李四");
}
}
System.out.println(li);
}
}
需要:注意的是这两种方法都可以实现需求,但是得到的结果略有差别
用集合实现的:
结果是:添加的元素(李四),一定在集合末尾
用迭代器实现:
结果是:添加的元素(李四),在元素张三后边(紧挨着)
4
Lis接口的3个子类
(1) ArrayList:
底层数据结构是数组,查询快,增删慢。
线程不安全,效率高。
Vector:
底层数据结构是数组,查询快,增删慢。
线程安全,效率低。
LinkedList:
底层数据结构是链表,查询慢,增删快。
线程不安全,效率高。
(2) 我们到底使用谁呢?
看需求:
要安全吗?
要:Vector
不要:ArrayList或者LinkedList
查询多:ArrayList
增删多:LinkedList
什么都不知道,就用ArrayList。
(3) ArrayList的特有功能及案例:
A:ArrayList存储字符串并遍历
B:ArrayList存储自定义对象并遍历
C:ArrayList存储字符串并遍历。要求去除重复值。
D:ArrayList存储自定义对象并遍历。要求去除重复值。
自定义对象:对象的成员变量值都相同,则为同一个对象。
package Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
import com.itheima.Persion;
public class ArrayList1
{
/*
* 需求:ArrayList存储自定义对象并遍历。要求去除重复值。思路:从给定的集合中,依次拿到元素,和新集合中的元素比较,如果新集合中没有此元素,
* 就把此元素添加到新集合中,这样就去除了给定集合中的重复的元素
*/
public static void main(String[] args)
{
// 给定集合自己创建(在集合中添加Student对象)
Student P1 = new Student("赵云", 20);
Student P2 = new Student("伍六一", 22);
Student P3 = new Student("森马", 26);
Student P4 = new Student("中泰", 21);
Student P5 = new Student("赵云", 20);
// 创建集合,并向集合中添加元素
List oldArray = new ArrayList();
oldArray.add(P1);
oldArray.add(P2);
oldArray.add(P3);
oldArray.add(P4);
oldArray.add(P5);
// 创建新集合(存储旧集合的元素)
List newList = new ArrayList();
// 遍历旧集合
for (int i = 0; i < oldArray.size(); i++)
{
if (!newList.contains(oldArray.get(i)))
{
newList.add(oldArray.get(i));
}
}
// 遍历新集合
Iterator it = newList.iterator();
while (it.hasNext())
{
System.out.println(it.next());
}
}
}
package Collection;
public class Student
{
private String name;
private int age;
public Student(String name, int age)
{
this.name = name;
this.age = age;
}
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
@Override//重写toString方法
public String toString()
{
return "Student [name=" + name + ", age=" + age + "]";
}
@Override//重写equals方法,如果不重写。测试类中contains方法用的是父类(Object)的equals方法,父类的此方法默认比较的是地址值
public boolean equals(Object obj)
{
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null)
{
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}
(4)Vector(类)
构造方法---public Vector()构造一个空向量,使其内部数据数组的大小为 10,其标准容量增量为零。
特有的方法:
添加元素:public void addElement(E obj)
遍历元素:
普通for循环
得到元素:public Object elementAt(int index)
得到元素的个数:public int size()
迭代器实现:
public Enumeration elements()
Enumeration(接口中的方法
--boolean hasMoreElements()测试此枚举是否包含更多的元素。
--Object nextElement()如果此枚举对至少还有一个可提供的元素,则返回此枚举的下一个元素。
package Collection;
import java.util.Enumeration;
import java.util.Vector;
public class VectorText
{
public static void main(String[] args)
{
// 创建Vector集合()
Vector v = new Vector();
// 向集合中添加元素
v.addElement("zhansan");
v.addElement("lisi");
v.addElement("nihao");
// 遍历集合
// 方法一(普通for循环)
for (int i = 0; i < v.size(); i++)
{
System.out.println((String) v.elementAt(i));
}
System.out.println("----------");
// 方法二(用迭代器)
Enumeration e = v.elements();
while (e.hasMoreElements())
{
System.out.println(e.nextElement());
}
}
}
(5)
LinkedList的特有功能及案例:
A:特有功能
a:添加功能
void addFirst()
void addLast()
b:删除功能
object removeFirst()移除并返回此列表的第一个元素。
Object removeLast()移除并返回此列表的最后一个元素。
c:获取功能
object getFirst()--添加到集合开头
object getLast()--添加到集合末尾
B:LinkedList存储字符串并遍历
---普通for循环
使用int size()和public E get(int index)方法
---使用Iterator
boolean hasNext() 和E next() 方法
存在并发修改的错误
使用 ListIterator的boolean add(Object c);方法解决,
或者用集合自身的遍历
---增强for循环
C:LinkedList存储自定义对象并遍历
package Collection;
public class LinkedListText
{
/*
* 需求:请用LinkedList模拟栈数据结构的集合,并测试。 思路:题目的意思是需要自己定义一个集合类
* 该自定义的类中,可以有一个LinkedList类可以使用
*/
public static void main(String[] args)
{
//创建自己定义的集合对象
MyStack stack = new MyStack();
// 向集合中添加元素
stack.add("赵云");
stack.add("哈哈");
stack.add("朗天");
stack.add("袁郎");
while (!stack.isempty())
{
System.out.println(stack.get());
}
}
}
package Collection;
import java.util.LinkedList;
public class MyStack
{
private LinkedList linkdeList;
public MyStack()
{
linkdeList = new LinkedList();
}
public void add(Object e)
{
linkdeList.addFirst(e);
}
public Object get()
{
// return linkdeList.getFirst();//如用这个,将是死循环,并且只有一个元素
return linkdeList.removeFirst();// 删除第一个元素,并发返回这个元素
}
public boolean isempty()
{
return linkdeList.isEmpty();
}
}
———–android培训、java培训、java学习型技术博客、期待与您交流!————