List 集合框架
- 集合框架中提供了一个内部类专门操作集合中的元素,这个内部类就是迭代器数据结构
集合框架的由来:数据多了用对象进行存储,对象多了用集合来进行存储。
而存储数据的方式(数据结构)各有不同,所以存储的容器也就有多种,从框架这一体系。
1. 集合框架(简介、Collection方法、迭代器)
- 给Collection 集合加入值 add()方法 和 迭代器 遍历数据
- isEmpy() 方法 如果此 collection 不包含元素,则返回 true。包含则返回 false
package com.hyf.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.apache.jasper.tagplugins.jstl.core.ForEach;
public class CollcecionDemo {
public static void main(String[] args) {
Collection c = new ArrayList<>();
c.add(2);
c.add(23);
c.add(11);
c.add(43);
c.add(22);
c.add(66);
// 迭代器是集合所特有遍历方式
Iterator it = c.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
// 判断是否包含元素
boolean b=c.isEmpty();
System.out.println(b);
}
}
控制台输出为
2两个常见的面试提
- 在迭代器或则freach循环时容易出现什么常见的问题 it.next()
package com.hyf.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.apache.jasper.tagplugins.jstl.core.ForEach;
/**
* 这个类是Collection接口中特别的方法 Iterator 迭代器
*
* 集合的remove方法与迭代器remove方法有什么区别
* 1.在迭代器或则freach循环时容易出现什么常见的问题 it.next()
*/
public class CollcecionDemo {
public static void main(String[] args) {
Collection c = new ArrayList<>();
c.add(2);
c.add(23);
c.add(11);
c.add(43);
c.add(22);
c.add(66);
Iterator it = c.iterator();
while(it.hasNext()) {
int num=(int)it.next();
if(num % 2==0) {
System.out.println(it.next());
}
}
}
}
控制台输出为
2.2 在迭代器中使用 collection .remove 方法
会出现java.util.ConcurrentModificationException(当前改变常)
package com.hyf.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import org.apache.jasper.tagplugins.jstl.core.ForEach;
/**
* 这个类是Collection接口中特别的方法 Iterator 迭代器
* 在迭代器中执行collection.remove 方法
* java.util.ConcurrentModificationException(当前改变异常)
* 本质上来说这是一个并发问题
*/
public class CollcecionDemo {
public static void main(String[] args) {
Collection c = new ArrayList<>();
c.add(2);
c.add(23);
c.add(11);
c.add(43);
c.add(22);
c.add(66);
// 迭代器是集合所特有遍历方式
Iterator it = c.iterator();
while(it.hasNext()) {
int num=(int)it.next();
if(num % 2==0) {
c.remove(num);
}
}
}
}
2 . 集合框架List(ArrayList特有方法、特有迭代器、具体对象特点、增长因子论证)
ArrayList特有方法
- 返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始。
如果 listteratior(n) 括号里面有参数 ,代表 n 个下标开始遍历数据
package com.hyf.list;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/**
1. 讲解List 所有特有的方法 listIterator
2. */
public class ListDemo {
public static void main(String[] args) {
List l = new ArrayList();
l.add(12);
l.add(22);
l.add(32);
l.add(43);
l.add(88);
ListIterator lt = l.listIterator();
while (lt.hasNext()) { //没有着里下面会取不到元素
System.out.println(lt.next());
}
while (lt.hasPrevious()) {
System.out.println(lt.previous()); // it.precious() 上一个数据
}
}
}
控制台输出为
3.ArrayList 和 linkedList 区别
- ArrayList 数组结构 增删慢,查询快,有连续下标
- Linkedlist 链表结构 增删快,查询慢 没有连续下标
增长因子论证
- Arraylist 增长因子为0.5 默认为10
package com.hyf.list;
import java.lang.reflect.Field;
import java.util.ArrayList;
/**
1. 面试题 ArrayList 与 array 的区别
2.
3. 1.list 的长度可变,数组长度固定
4. 2.list 可以存放各类的元素对象,而数组一旦声明,只能存放对应的类型
5.
6. ArrayList 如何进行性能调优? 为啥List 集合底层是数据结构,但是数组的长度优势固定的,而list 长度有可变呢? 论证增长因子
7.
8. @author 17628
*/
public class ListDemo2 {
public static void main(String[] args) {
ArrayList al=new ArrayList<>(10);
for(int i=1; i<=80;i++) {
al.add(i);
System.out.print(i+",");
getLen(al);
}
}
public static void getLen(ArrayList al) {
try {
Field f=al.getClass().getDeclaredField("elementData");
f.setAccessible(true);
Object obj=f.get(al);
Object [] elementData=(Object[]) obj;
System.out.println("当前al容器的底层数组长度:"+elementData.length);
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
4. 集合框架LinkedList
- 堆栈:先进后出 子弹夹 特有方法 addFirst();
- 队列:先进先出 水管 特有方法 addLast();
面试题 :通过 linkedList 集合来制作一个堆栈结构的容器 制作一个队列结构的容器
代码演示
- 堆栈
package com.hyf.list;
import java.util.Iterator;
import java.util.LinkedList;
/**
* 面试题
* 通过 linkedList 集合来制作一个堆栈结构的容器 制作一个队列结构的容器
*/
public class LinkedListDemo {
public static void main(String[] args) {
// 队列
DuiZhan dz=new DuiZhan();
dz.push("a");
dz.push("b");
dz.push("c");
dz.push("d");
dz.push("e");
dz.push("f");
dz.bianLi();
}
}
/**
1. 堆栈结构容器
2. @author 17628
*/
class DuiZhan{
private LinkedList ll=new LinkedList<>();
public void push(Object obj) {
ll.addFirst(obj);
}
/* public Object pop() {
return ll.removeFirst();
}*/
public void bianLi() {
Iterator it=ll.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
2.队列
package com.hyf.list;
import java.util.Iterator;
import java.util.LinkedList;
/**
* 面试题
* 通过 linkedList 集合来制作一个堆栈结构的容器 制作一个队列结构的容器
*/
public class LinkedListDemo {
public static void main(String[] args) {
// 队列
DuiLie dz=new DuiLie();
dz.push("a");
dz.push("b");
dz.push("c");
dz.push("d");
dz.push("e");
dz.push("f");
dz.bianLi();
}
}
class DuiLie{
private LinkedList ll=new LinkedList<>();
public void push(Object obj) {
ll.addLast(obj);
}
public void bianLi() {
Iterator it=ll.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
集合框架ArrayList中的重复元素去重及其底层原理
判定两个人是一个人的依据 名字相同 age 相同
代码演示
package com.hyf.list;
import java.util.ArrayList;
/**
* 对ArrayList 中的元素去重 1.元素是字符串 2.元素是自定义对象
*
* 需求:
* 判定 两个人是一个人的依据
* 名字相同 age 相同
*
* 集合collection 的contains 在调用的时候底层调用容器元素对象equals方法
* 之前元素对象是Strng
* 元素对象object(Person)
*
* list 去重和set 去重
*/
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList<>();
al.add(new Person("aa", 11));
al.add(new Person("aa", 11));
al.add(new Person("bb", 11));
al.add(new Person("dd", 12));
al.add(new Person("ee", 112));
ArrayList newAl = repeat(al);
for (Object object : newAl) { // 遍历去除重复的数据
System.out.println(object);
}
}
/**
* ArrayList al这个容器中是有重复元素的? 1.建立一个新的容器 2.将老的容器遍历取出其中的元素
* 3.如果说这个元素存在于新容器中,那么不再往新容器加入。如果不存在,就加
*/
public static ArrayList repeat(ArrayList al) {
ArrayList newAl = new ArrayList<>();
for (Object object : al) {
if (!newAl.contains(object)) {
newAl.add(object);
}
}
return newAl;
}
}
class Person {
private String name;
private int 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;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public boolean equals(Object obj) {
Person p= (Person)obj;
return p.name.equals(this.name) && p.age==this.age;
}
}