package it.heima.mylog;
/**
*
* 把容器向上抽取,就形成了Collection集合框架.在Collection顶层接口下有两个很常用的子接口List和Set,
* 它们均在Collection的功能上各自加了自己特有的方法.
*
* List接口
*
* List接口有很多实现类,其中Vector,ArrayList,LinekList三种最为多用,
* 注意,它们都是实现类,只有List能对数元素进行添删改查的功能.
* Vector是在JDK1.0就出现了,属于元老级别,其实内部的数据结构就是数组,同步的,处理数据能力效率很低.
* ArrayList是在JDK1.2出现的,内部数据结构和Vector一样数组结构,但不同步,出于安全性考虑适用于单线程.对元素的查找非常快.
* LinekList内部数据是链表结构,线程不同步,对数据的添删非常快.
*
* 迭代器Iterator
*
* 对象放在容器中,怎么取出来呢?需要用到迭代器.迭代器也是一个接口,
* 它是一种取出集合元素的一种方法.因为每个容器的内部结构不同,取出元素的方法也不同,
* 那么对每种容器的迭代器进行向上抽取,就形成了一个Iterator接口。
*
* Iterator接口有一个iterator方法,返回值为Iterator类型,这样就获得了一个迭代器对象,就可以取元素啦.
*
* 当对一个集合进行迭代时啊,同时对集合进行添加或删除,这样就会抛出异常,
* 因为对集合进行迭代时,其实迭代器已经获取了集合的元素个数,
* 如果在迭代的过程中再对集合进行增删也就改变了集合元素的个数,迭代器会不知道的,
* 这样的程序就会不严谨,当然会抛异常。
*
* 为了避免这种现象而我又要偏要在迭代过程中对集合元素修列表改么办???
* Iterator接口很争气,在Iterator接口下有一个子接口ListIterator系列表迭代器,它有效的避免了上述的情况,
* 在对集合元素迭代过程中能对集合元素进行添删改查.
*
*---------------------------/
/*练练手,来代码爽爽:-P*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
class CollList {
public static void main(String[] args) {
// showArrayList1();
// showArrayList2();
showLinkedList();
}
public static void showLinkedList() {
LinkedList<String> link = new LinkedList<String>();
link.add("abc1");// 添加元素
link.add("abc3");
link.add("abc1");
link.add("abc2");
Iterator<String> it = link.iterator();
while (it.hasNext()) {
// 在迭代器过程中,不要使用集合操作元素,容易出现异常
String current = it.next();
System.out.println(current + "---" + current.hashCode());// 第一个元素和第三个元素hashCode一样
}
/**
* 使用LinkedList来模拟一个堆栈或者队列数据结构 堆栈:先进后出 First In Last Out (FILO)
* 队列:先进先出First In First Out (FIFO) 应该描述这样一个容器,给使用提供一个容器对象完成这两种结构中的一种。
* 思路: 构造一个容器,创建一个容器对象,给使用者提供一个容器对象操作 Queue inst = new Queue();
*/
Queue inst = new Queue();
/*先进先出,这是FIFO模式 */
inst.myAdd("z计划1");
inst.myAdd("z计划2");
inst.myAdd("z计划3");
while (!inst.isNull()){
System.out.println(inst.myGet());
}
/*先进后出,这是FILO模式*/
inst.myAdd2("z计划1");
inst.myAdd2("z计划2");
inst.myAdd2("z计划3");
while (!inst.isNull()){
System.out.println(inst.myGet());
}
System.out.println(link);
link.addFirst("zplan");
System.out.println(link);
/*addFirst是在元素的最前前面依次添加的 */
System.out.println("getFirst() = " + link.getFirst());
System.out.println(link);
/* getFirst()取出第一个元素,但不删除。 */
System.out.println("removeFirst() = " + link.removeFirst());
System.out.println(link);
/* removeFirst()移除第一个元素。会删除数据的。 */
System.out.println(link.isEmpty());
/* 当集合里没有元素的时候,返回true。否则返回false。 */
}
public static void showArrayList1() {
List<String> list = new ArrayList<String>();
list.add("abc1");// 添加元素
list.add("abc3");
list.add("abc1");
list.add("abc2");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
// 在迭代器过程中,不要使用集合操作元素,容易出现异常
String current = it.next();
System.out.println(current + "---" + current.hashCode());// 第一个元素和第三个元素hashCode一样
}
}
/* 可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作 */
public static void showArrayList2() {
List<String> list = new ArrayList<String>();
list.add("abc1");// 添加元素
list.add("abc3");
list.add("abc1");
list.add("abc2");
System.out.println("修改之前:" + list);
ListIterator<String> it2 = list.listIterator();
while (it2.hasNext()) {
// 如果元素等于"abc2",就替换掉它
if (it2.next().equals("abc2")) {
it2.set("Z计划");
}
/*
* if(it2.previous()== "abc2"){ System.out.println(list); }
*/
}
System.out.println("修改之后:" + list);// [abc1, abc3, abc1, Z计划]
}
}
/************************ Queue类 ********************************************/
class Queue {
private LinkedList<String> link;
Queue() {
link = new LinkedList<String>();
}
public void myAdd(String str) {// FIFO模式
link.addLast(str);
}
public void myAdd2(String str) {// FILO模式
link.addFirst(str);
}
public Object myGet() {
return link.removeFirst();
}
public boolean isNull() {
return link.isEmpty();
}
}
/**
*
* 知识点:集合框架Collection的子接口List集合
* 把容器向上抽取,就形成了Collection集合框架.在Collection顶层接口下有两个很常用的子接口List和Set,
* 它们均在Collection的功能上各自加了自己特有的方法.
*
* List接口
*
* List接口有很多实现类,其中Vector,ArrayList,LinekList三种最为多用,
* 注意,它们都是实现类,只有List能对数元素进行添删改查的功能.
* Vector是在JDK1.0就出现了,属于元老级别,其实内部的数据结构就是数组,同步的,处理数据能力效率很低.
* ArrayList是在JDK1.2出现的,内部数据结构和Vector一样数组结构,但不同步,出于安全性考虑适用于单线程.对元素的查找非常快.
* LinekList内部数据是链表结构,线程不同步,对数据的添删非常快.
*
* 迭代器Iterator
*
* 对象放在容器中,怎么取出来呢?需要用到迭代器.迭代器也是一个接口,
* 它是一种取出集合元素的一种方法.因为每个容器的内部结构不同,取出元素的方法也不同,
* 那么对每种容器的迭代器进行向上抽取,就形成了一个Iterator接口。
*
* Iterator接口有一个iterator方法,返回值为Iterator类型,这样就获得了一个迭代器对象,就可以取元素啦.
*
* 当对一个集合进行迭代时啊,同时对集合进行添加或删除,这样就会抛出异常,
* 因为对集合进行迭代时,其实迭代器已经获取了集合的元素个数,
* 如果在迭代的过程中再对集合进行增删也就改变了集合元素的个数,迭代器会不知道的,
* 这样的程序就会不严谨,当然会抛异常。
*
* 为了避免这种现象而我又要偏要在迭代过程中对集合元素修列表改么办???
* Iterator接口很争气,在Iterator接口下有一个子接口ListIterator系列表迭代器,它有效的避免了上述的情况,
* 在对集合元素迭代过程中能对集合元素进行添删改查.
*
*---------------------------/
/*练练手,来代码爽爽:-P*/
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.ListIterator;
class CollList {
public static void main(String[] args) {
// showArrayList1();
// showArrayList2();
showLinkedList();
}
public static void showLinkedList() {
LinkedList<String> link = new LinkedList<String>();
link.add("abc1");// 添加元素
link.add("abc3");
link.add("abc1");
link.add("abc2");
Iterator<String> it = link.iterator();
while (it.hasNext()) {
// 在迭代器过程中,不要使用集合操作元素,容易出现异常
String current = it.next();
System.out.println(current + "---" + current.hashCode());// 第一个元素和第三个元素hashCode一样
}
/**
* 使用LinkedList来模拟一个堆栈或者队列数据结构 堆栈:先进后出 First In Last Out (FILO)
* 队列:先进先出First In First Out (FIFO) 应该描述这样一个容器,给使用提供一个容器对象完成这两种结构中的一种。
* 思路: 构造一个容器,创建一个容器对象,给使用者提供一个容器对象操作 Queue inst = new Queue();
*/
Queue inst = new Queue();
/*先进先出,这是FIFO模式 */
inst.myAdd("z计划1");
inst.myAdd("z计划2");
inst.myAdd("z计划3");
while (!inst.isNull()){
System.out.println(inst.myGet());
}
/*先进后出,这是FILO模式*/
inst.myAdd2("z计划1");
inst.myAdd2("z计划2");
inst.myAdd2("z计划3");
while (!inst.isNull()){
System.out.println(inst.myGet());
}
System.out.println(link);
link.addFirst("zplan");
System.out.println(link);
/*addFirst是在元素的最前前面依次添加的 */
System.out.println("getFirst() = " + link.getFirst());
System.out.println(link);
/* getFirst()取出第一个元素,但不删除。 */
System.out.println("removeFirst() = " + link.removeFirst());
System.out.println(link);
/* removeFirst()移除第一个元素。会删除数据的。 */
System.out.println(link.isEmpty());
/* 当集合里没有元素的时候,返回true。否则返回false。 */
}
public static void showArrayList1() {
List<String> list = new ArrayList<String>();
list.add("abc1");// 添加元素
list.add("abc3");
list.add("abc1");
list.add("abc2");
Iterator<String> it = list.iterator();
while (it.hasNext()) {
// 在迭代器过程中,不要使用集合操作元素,容易出现异常
String current = it.next();
System.out.println(current + "---" + current.hashCode());// 第一个元素和第三个元素hashCode一样
}
}
/* 可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作 */
public static void showArrayList2() {
List<String> list = new ArrayList<String>();
list.add("abc1");// 添加元素
list.add("abc3");
list.add("abc1");
list.add("abc2");
System.out.println("修改之前:" + list);
ListIterator<String> it2 = list.listIterator();
while (it2.hasNext()) {
// 如果元素等于"abc2",就替换掉它
if (it2.next().equals("abc2")) {
it2.set("Z计划");
}
/*
* if(it2.previous()== "abc2"){ System.out.println(list); }
*/
}
System.out.println("修改之后:" + list);// [abc1, abc3, abc1, Z计划]
}
}
/************************ Queue类 ********************************************/
class Queue {
private LinkedList<String> link;
Queue() {
link = new LinkedList<String>();
}
public void myAdd(String str) {// FIFO模式
link.addLast(str);
}
public void myAdd2(String str) {// FILO模式
link.addFirst(str);
}
public Object myGet() {
return link.removeFirst();
}
public boolean isNull() {
return link.isEmpty();
}
}