------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一.java容器简化图,这个一定要切记,下来我会根据这个图来详细介绍集合框架。
图.
所有集合类都位于java.util包下。集合中只能保存对象(保存对象的引用变量)。(数组既可以保存基本类型的数据也可以保存对象)。
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些接口或实现类。
Set和List接口是Collection接口派生的两个子接口。Map实现类用于保存具有映射关系的数据(key-value)。
Set、List和Map可以看做集合的三大类。
List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问。
Set集合是无序集合,集合中的元素不可以重复,访问集合中的元素只能根据元素本身来访问(也是不能集合里元素不允许重复的原因)。
Map集合中保存Key-value对形式的元素,访问时只能根据每项元素的key来访问其value。
如果要详细了解集合,笔者建议还是自己去实现集合的底层代码,在这里呢,笔者实现了一个简化版的ArrayList,供大家理解集合。
<span style="font-size:12px;">import java.util.Arrays;
public class SequenceList<T> {
/**
* 步骤 1:提供以默认数组长度创建空顺序表的构造方法 2.提供以一个初始化元素创建顺序表的构造方法
* 3.提供指定顺序表中第一个元素,和指定数组长度来创建顺序表的构造方法 4.获取顺序线性表的大小方法 5.获取顺序线性表中索引为i处元素的方法
* 6.查找顺序线性表中指定元素的索引 7.向顺序线性表指定位置插入一个元素 8.在顺序线性表的开始处添加一个元素
* 9.删除顺序线性表中指定索引处的元素 10.删除顺序线性表中最后一个元素 11.判断顺序线性表是否为空 12.清空线性表13.返回顺序表大小
*
*/
// 默认数组长度
private final int DEFAULT_SIZE = 16;
// 保存数组的长度
private int alength;
// 定义数组用来保存List中的原色
private Object[] b;
// 线性表中元素的当前个数
private int size = 0;
// 1.提供以默认数组长度创建空顺序表的构造方法
public SequenceList() {
alength = DEFAULT_SIZE;
b = new Object[alength];
}
// 2.提供以一个初始化元素创建顺序表的构造方法
public SequenceList(T element) {
this();
b[0] = element;
size++;
}
// 3.提供指定顺序表中第一个元素,和指定数组长度来创建顺序表的构造方法
public SequenceList(T element, int initSize) {
if (initSize < 0) {
throw new IllegalArgumentException("指定长度不能小于0");
}
b = new Object[initSize];
b[0] = element;
size++;
}
// 4.获取顺序线性表的大小方法
public int getLength() {
return size;
}
// 5.获取顺序线性表中索引为i处元素的方法
public Object get(int i) {
if (i < 0 || i > size - 1) {
throw new IndexOutOfBoundsException("线性表索引越界");
}
return b[i];
}
// 6.查找顺序线性表中指定元素的索引
public int getIndexOf(T element) {
for (int i = 0; i < b.length; i++) {
if (element.equals(b[i]))
return i;
}
return -1;
}
// 7.向顺序线性表指定位置插入一个元素
public void insert(T element, int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("线性表索引越界");
}
while (alength < size + 1) {
alength <<= 1;
}
b = Arrays.copyOf(b, alength);
System.arraycopy(b, index, b, index + 1, size - index);
/*
* for (int i = 0; i < b.length; i++) { System.out.print(b[i]); }
*/
b[index] = element;
size++;
}
// 8.在顺序线性表的开始处添加一个元素
public void add(T element) {
insert(element, size);
}
// 9.删除顺序线性表中指定索引处的元素
public T delete(int index) {
if (index < 0 || index > size) {
throw new IndexOutOfBoundsException("线性表索引越界");
}
size--;
T oldvalue = (T) b[index];
System.arraycopy(b, index + 1, b, index, size - index);
// 清空顺序表最后一个元素
b[size] = null;
/*
* for (int i = 0; i < b.length; i++) { System.out.println(b[i]); }
*/
return oldvalue;
}
// 10.删除顺序线性表中最后一个元素
public T removeLast() {
return (T) b[size - 1];
}
// 11.判断顺序线性表是否为空
public boolean empty() {
return size == 0;
}
// 12.清空线性表
public void clear() {
// 将数组索引元素赋值为null
for (int i = 0; i < size; i++) {
b[i] = null;
}
size = 0;
}
// 13.返回顺序表大小
public int size() {
return size;
}
// 14.toString()漂亮处理输出顺序列表元素
public String toString() {
StringBuffer sb = new StringBuffer("");
if (size == 0) {
sb.append("[]");
} else
for (int i = 0; i < size - 1; i++) {
sb.append("[");
sb.append(b[i] + ",");
}
sb.append(b[size - 1] + "]");
return sb.toString();
}
}
</span>
二.两种遍历集合的方法Iterator接口和foreach循环
1、Iterator接口
Iterator也是Java集合框架的成员,主要用于遍历(即迭代访问)Collection集合中的元素,也称为迭代器。
提供的三种方法:
boolean hasNext():返回集合里的下一个元素。
Object next():返回集合里下一个元素。
void remove();删除集合里上一次next方法返回的元素。
public class MyIterator {
/**
* @param args
*/
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("黑马程序员");
list.add("毕向东老师");
list.add("张孝祥老师");
list.add("黑马捣蛋学生");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.println(s);
if (s.equals("黑马捣蛋学生")) {
it.remove();
}
}
System.out.print(list);
}
}
2、使用foreach循环遍历集合元素。
格式:
for(元素类型 元素变量x:要遍历的对象){
}
将要遍历的对象中的每一个元素的值赋值给x,然后遍历输出。
废话不多说,还是上代码。
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("黑马程序员");
list.add("毕向东老师");
list.add("张孝祥老师");
list.add("黑马捣蛋学生");
for (String string : list) {
System.out.println(string);
}
}
三.集合元素排序
java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现该接口的类必须实现该方法,实现了该接口的类的对象就可以比较大小。当一个对象调用该方法与另一个对象进行比较,例如obj1.comparTo(obj2),如果该方法返回0,则表明这两个对象相等;如果返回一个正整数,则表明obj1大于obj2;如果该方法返回一个负整数,则表明obj1小于obj2.
/**
*
*/
/**
* @author lenovo
*
*/
public class Name implements Comparable {
public String firstName;
public String lastName;
public Name(String firstName, String LastName) {
this.firstName = firstName;
this.lastName = LastName;
}
public boolean equals(Object object) {
// instanceof返回true,表示对象object属于Name类
if (object == null)
return false;
else {
if (object instanceof Name) {
Name name = (Name) object;
return (firstName.equals(name.firstName))
&& (lastName.equals(name.lastName));
}
}
return super.equals(object);
}
public int hashCode() {
return firstName.hashCode();
}
public String toString() {
return firstName + " " + lastName;
}
/* (non-Javadoc)
* @see java.lang.Comparable#compareTo(java.lang.Object)
*/
@Override
public int compareTo(Object o) {
Name n=(Name)o;
int count=this.firstName.compareTo(n.firstName);
return (count!=0?count:this.lastName.compareTo(n.lastName));
}
}