------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一.集合
1.什么是集合
集合是一种容器, 长度可变, 可以存储任意类型的对象.
2.集合的分类
Collection:单列集合, 一次存一个对象
List: 可重复, 有索引
* ArrayList: 数组实现, 查找快, 增删慢
* LinkedList: 链表实现, 增删快, 查找慢
Vector: 原理和ArrayList相同, 线程安全, 效率较低
Stack: 栈, 先存的对象最后才能被取出
Set: 不重复, 无索引
*HashSet: 使用哈希算法, 去重复, 速度快.
*TreeSet: 使用二叉树算法, 按照指定顺序排序. 指定顺序的方式有两种: 自然顺序, 比较器
LinkedHashSet: HashSet的子类, 也是使用哈希算法, 但可以保留存储顺序.
Map: 键值对, 一次存两个对象. 键唯一, 可以根据键查找值.
*HashMap: 使用哈希算法对键对象去重复
*TreeMap: 使用二叉树算法对键对象排序
*LinkedHashMap: HashMap的子类, 去重复的同时保留存储顺序
*Hashtable: 和HashMap原理相同, 都是使用哈希算法去重复. 线程安全, 效率略低. 键和值都不允许为null
*Properties: 键和值都是String, 用来存储一些配置项
二.List集合
1.List集合
ArrayList: 数组结构 , 查找快, 增删慢
查找的时候直接获取数组中的元素, 直接操作内存地址, 速度较快
增删的时候, 由于要创建数组或者拷贝数组,所以速度较慢
LinkedList:链表结构, 增删快, 查找慢
增加的时候只要让最后一个元素记住新来的一个元素即可, 删除的时候只要让前一个记住后一个后一个记住前一个即可, 所以链表结构增删较快
查找的时候需要逐个查找, 所以速度较慢
2.List类常用方法:
boolean add(Object obj)
向集合中添加一个对象, 如果改变了集合的结构, 返回true. 集合可以添加任意类型的对象.
<span style="white-space:pre"> </span>private static void demo1() {
List list = new LinkedList();
list.add("aaa");
list.add("bbb");
list.add(1, "ccc"); // 将"ccc"插入到1号索引
System.out.println(list);
}
删除指定索引上的元素, 并且返回这个元素
<span style="white-space:pre"> </span>private static void demo8() {
List list1 = new LinkedList();
list1.add("aaa");
list1.add("bbb");
list1.add("ccc");
list1.add("ddd");
System.out.println(list1.remove(2)); // 删除2号索引上的元素, 并且将元素返回
System.out.println(list1.remove(2));
System.out.println(list1);
}
Object set(int index, Objectobj)
将集合中指定位置的元素替换为指定对象
private static void demo12() {
List list1 = new LinkedList();
list1.add("aaa");
list1.add("bbb");
list1.add("ccc");
list1.add("ddd");
System.out.println(list1.set(2, "xxx")); // 将2号元素改为"xxx"
System.out.println(list1);
}
Object get(int index)
从集合中获取指定索引上的对象.
3.集合的遍历
for循环: 循环size()次, 每次调用get(int)方法获取一个元素.
迭代器: 使用iterator()方法获取一个迭代器(Iterator对象), 调用hasNext()方法判断是否包含下一个元素,调用next()方法获取元素.
增强for循环: for (类型 变量名 : 容器) { 循环体 }, 容器长度是多少循环体就执行多少次, 变量每次引用容器中的一个元素.
package cn.itcast.day16.list;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class ListIterateDemo {
public static void main(String[] args) {
List list = new LinkedList();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
// iterate1(list);
// iterate2(list);
// iterate3(list);
}
// List和Set通用
private static void iterate3(List list) {
for (Object obj : list) // 增强for循环, for (类型 变量名 : 容器) { 循环体 }
System.out.println(obj);
}
// List和Set通用
private static void iterate2(List list) {
Iterator iter = list.iterator(); // 获取list对象的迭代器(Iterator接口的子类对象), 内部有一个指针, 默认指向第一个元素之前的位置
while (iter.hasNext()) // 判断是否包含下一下元素
System.out.println(iter.next()); // 将指针向后移动一位, 并返回这个位置上的元素
}
// 只能用于List, Set不能使用
private static void iterate1(List list) {
for (int i = 0; i < list.size(); i++)
System.out.println(list.get(i));
}
}
4.遍历时删除元素
for循环: 由于在List集合中删除元素之后, 后面的元素会向前移动, 所以每次删除之后需要将循环遍历-1
迭代器: 迭代器在使用的过程中不允许修改集合, 如果要删除, 必须使用迭代器的remove()方法
增强for循环: 无法在循环过程中修改集合
package cn.itcast.day16.exercise;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import cn.itcast.day16.domain.Person;
public class Exercise2 {
public static void main(String[] args) {
// demo1();
// demo2();
// demo3();
// demo4();
}
private static void demo4() {
List list = new ArrayList();
list.add(new Person("张三", 19));
list.add(new Person("李四", 20));
list.add(new Person("王五", 19));
list.add(new Person("赵六", 19));
for (Object obj : list) {
Person p = (Person) obj;
if (p.getAge() == 19)
list.remove(p); // 增强for循环内部就是使用迭代器, 在使用的过程中不能改变原集合. 由于无法获得迭代器, 所以增强for循环不能操作集合.
}
}
private static void demo3() {
List list = new ArrayList();
list.add(new Person("张三", 19));
list.add(new Person("李四", 20));
list.add(new Person("王五", 19));
list.add(new Person("赵六", 19));
System.out.println(list);
Iterator iter = list.iterator();
while (iter.hasNext()) {
Person p = (Person) iter.next();
if (p.getAge() == 19)
iter.remove(); // 在使用迭代器的时候, 不能修改集合中的结构, 如果要删除, 需要使用迭代器的remove()方法
}
System.out.println(list);
}
private static void demo2() {
List list = new ArrayList();
list.add(new Person("张三", 19));
list.add(new Person("李四", 20));
list.add(new Person("王五", 19));
list.add(new Person("赵六", 19));
System.out.println(list);
for (int i = 0; i < list.size(); i++) {
Person p = (Person) list.get(i);
if (p.getAge() == 19)
list.remove(i--); // 删除元素后, 后面的元素会向前移动, 这时我们将指针也向前移动一位
}
System.out.println(list);
}
private static void demo1() {
List list = new ArrayList();
list.add(new Person("张三", 19));
list.add(new Person("李四", 20));
list.add(new Person("王五", 19));
list.add(new Person("赵六", 19));
for (int i = 0; i < list.size(); i++) {
Person p = (Person) list.get(i);
if (p.getAge() == 19)
System.out.println(p.getName());
}
Iterator iter = list.iterator();
while (iter.hasNext()) {
Person p = (Person) iter.next();
if (p.getAge() == 19)
System.out.println(p.getName());
}
for (Object obj : list) {
Person p = (Person) obj;
if (p.getAge() == 19)
System.out.println(p.getName());
}
}
}
三.练习
1.交换集合上的两个元素
package cn.itcast.day16.homework;
import java.util.LinkedList;
import java.util.List;
public class Homework1 {
public static void main(String[] args) {
List<String> list = new LinkedList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println(list);
swap(list, 1, 3);
System.out.println(list); // a d c b
}
/**
* 交换集合上两个元素
* @param list 要交换的集合
* @param index1 交换的第一个位置
* @param index2 交换的第二个位置
*/
public static void swap(List list, int index1, int index2) {
Object temp = list.get(index1);// 定义变量, 记住index1上的元素. get
list.set(index1, list.get(index2));// 获取index2上的元素, 替换掉index1上的元素. get,
// set
list.set(index2, temp);// 用变量记住的元素, 替换掉index2上的元素. set
}
}
2.翻转集合
package cn.itcast.day16.homework;
import java.util.LinkedList;
import java.util.List;
public class Homework2 {
public static void main(String[] args) {
List<String> list = new LinkedList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println(list);
reverse(list);
System.out.println(list);
}
/**
* 翻转集合
* @param list 被翻转的集合
*/
public static void reverse(List list) {
String temp;// 创建一个变量做中间变量
for (int i = 0; i < list.size() / 2; i++) { // 循环二分之size次
temp = (String) list.get(i); // 把第一个和最后一个交换、第二个和倒数第二个交换……以此类推
list.set(i, list.get(list.size() - i - 1));
list.set(list.size() - i - 1, temp);
}
}
}
3.自定义ArrayList, 模拟Java提供的ArrayList, 数组实现的列表
package cn.itcast.day16.mine;
/**
* 自定义ArrayList, 模拟Java提供的ArrayList, 数组实现的列表
* @author Don
*/
public class MyArrayList<E> { // <E>为泛型, 在创建对象的时候, <>中指定的类型是什么, 这个E就是什么, 整个类中的E都是这一个类型
private Object[] arr = new Object[10]; // 用来装载数据的容器
private int size; // 集合的大小
/**
* 添加一个对象到ArrayList中, 内部就是将对象添加到数组中
* @param e 要添加的对象
* @return 添加是否成功
*/
public boolean add(E e) {
if (size == arr.length) { // 如果数组装满了
Object[] newArr = new Object[arr.length * 3 / 2 + 1]; // 创建一个更大的新数组
System.arraycopy(arr, 0, newArr, 0, size); // 将原有数据拷贝到新数组中
arr = newArr; // 成员变量记住新数组
}
arr[size++] = e;
return true;
}
/**
* 删除指定索引上的元素
* @param index 要删除的索引
* @return 被删除的元素
*/
public E remove(int index) {
checkRange(index);
Object oldElement = arr[index]; // 记住要删除位置上的元素
int length = size - index - 1; // 要删除的元素后面有几个元素
if (length > 0) // 如果要删除的位置后面有元素
System.arraycopy(arr, index + 1, arr, index, length); // 将要删除位置后面的元素向前移动一位(覆盖了要删除的位置)
arr[--size] = null; // 将最后一个元素删除
return (E) oldElement; // 返回被删除的元素(在数组中被覆盖了)
}
/**
* 将集合中指定位置上的元素替换为指定元素
* @param index 要替换的位置
* @param e 要替换成哪个对象
* @return 被替换掉的对象
*/
public E set(int index, E e) {
checkRange(index);
Object oldElement = arr[index]; // 记住原对象
arr[index] = e; // 将原对象替换为新对象
return (E) oldElement; // 返回原对象
}
/**
* 检查索引是否越界
* @param index 要检查的索引
*/
private void checkRange(int index) {
if (index >= size)
throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size);
}
/**
* 获取集合中指定索引上的元素
* @param index 指定索引
* @return 索引上的元素
*/
public E get(int index) {
checkRange(index);
return (E) arr[index];
}
/**
* 获取集合的大小
* @return 集合的大小
*/
public int size() {
return size;
}
/**
* 重写Object类的toString, 返回集合中每个元素的toString
* @return 每个元素的toString
*/
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < size; i++) // 将集合中每个元素添加到StringBuilder中
sb.append(arr[i] + (i < size - 1 ? ", " : "")); // 如果不是最后一个, 加上逗号和空格
sb.append("]");
return sb.toString();
}
}
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------