1集合框架
2 集合框架list(ArrayList特有方法、特有迭代器、具体对象特点、增长因子论证)
3.LinkedList集合制作堆栈和队列结构的容器
集合框架
一.一个专门操作集合中的元素内部类:迭代器(Iterator)
集合框架思维导图三大类:
增强for循环
集合的remove方法和迭代器的remove方法有什么区别?
- 在迭代器或者foreach循环删除的时候容易出现什么问题。
- 在迭代器中执行collection.remove方法
java.util.ConcurrentModificationException当前改变异常本质上来说,这是一个并发问题
package com.xiaoyi.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/**
-
这个类是讲解collection接口中特别方法
-
Iterator迭代器
-
集合的remove方法和迭代器remove方法有什么区别
-
1.在迭代器或者foreach循环删除的时候容易出现什么常见的问题 it.next(
-
2.在迭代器中执行collection,remove方法
-
java.util.ConcurrentModificationException当前改变异常
*本质上来说,这是一个并发问题
*/
public class CollectionDemo {public static void main(String[] args) {
Collection c=new ArrayList();
c.add(10);
c.add(22);
c.add(25);
c.add(29);
c.add(78);
//增强for循环
for (Object obj : c) {
System.out.println(obj);}
//迭代器是集合所特意有的遍历方式
/* Iterator it=c.iterator();
while(it.hasNext()) {
//System.out.println(it.next());
int num=(int)it.next();
if(num%20) {
System.out.println(it.next());
//区别:It.next:指的是容器中的指针往下移
}
}
*/
Iterator it=c.iterator();
while(it.hasNext()) {
//System.out.println(it.next());
int num=(int)it.next();
if(num%20) {
//System.out.println(it.next());
//System.out.println(num);
// iterator的移除方法会正常播放
// it.remove();
//collection的移除方法会出现:java.util.ConcurrentModificationException当前改变异常
c.remove(num);
}}
System.out.println©;}
//collection的移除方法会出现异常:
二. 集合框架list(ArrayList特有方法、特有迭代器、具体对象特点、增长因子论证)
数据结构
可以看到这类容器是有下标,可以按照下标去取,去删除的方法去操作容器的元素
1.
package com.xiaoyi.list;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
/**
- 讲解list所特有的方法listIterator
*/
public class ListDamo {
public static void main(String[] args) {
List c=new ArrayList();
c.add(11);
c.add(21);
c.add(22);
c.add(23);
c.add(51);
/*Iterator it=c.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}*/
ListIterator it=c.listIterator();
while(it.hasNext()) {
System.out.println(it.next());//下一个
}//这边注释的话下面会取不到元素
while(it.hasPrevious()) {
System.out.println(it.previous());//反序输出
//it.previous()上一个
}
}
}
2.Vector与AarrayList增长因子的区别:
增长因子0.5 默认容量是10
Arraylist与array的区别
1.list的长度可变,数组长度固定
2.list可以存放各类的元素对象,而数组一旦申明,只能存放对应的类型
2.1 ArrayList数组结构 增删慢,查询快、有连续下标 线程不同步
Vector 数组结构 增删改查都慢,有连续下标,线程同步(已经淘汰掉了)
(Vector有锁旗标(synchronized),ArrayList没有锁旗标,有锁旗标的线程同步)
LikedList 链表结构 增删快,查询慢 没有连续下标
package com.xiaoyi.list;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
/**
- 面试题:
- Arraylist与array的区别
- 1.list的长度可变,数组长度固定
- 2.list可以存放各类的元素对象,而数组一旦申明,只能存放对应的类型
- Arrayliest如何进行性能调优
- 为啥list集合底层是数据结构,但是数组长度优势固定的,而list长度又可变了?
*/
public class ListDamo2 {
public static void main(String[] args) {
ArrayList al=new ArrayList<>(50);//增长因子0.5 默认容量是10
for(int i=1;i<=80;i++) {
al.add(i);
System.out.println(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 | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//ArrayList增长因子0.5 默认容量是10 结果:
3. Vector的增长因子:
增长因子2 默认容量是50
package com.xiaoyi.list;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Vector;
/**
- 面试题:
- Arraylist与array的区别
- 1.list的长度可变,数组长度固定
- 2.list可以存放各类的元素对象,而数组一旦申明,只能存放对应的类型
- Earliest如何进行性能调优
- 为啥list集合底层是数据结构,但是数组长度优势固定的,而list长度又可变了?
*/
public class ListDamo2 {
public static void main(String[] args) {
Vector al=new Vector<>(50);//增长因子2 默认容量是50
for(int i=1;i<=80;i++) {
al.add(i);
System.out.println(i+",");
getLen(al);
}
}
public static void getLen(Vector 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 | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
三. LinkedList集合制作堆栈和队列结构的容器
面试题:
通过linkdlist集合来制作一个堆栈的容器
获取制作一个队列结构的容器
堆栈结果先进后出:放进去:从下至上abcde 取出来:edcba
队列:先进先出(水管)放进去:abcde 取出来也是:abcde
package com.xiaoyi.list;
import java.util.Iterator;
import java.util.LinkedList;
/**
- 面试题:
- 通过linkdlist集合来制作一个堆栈的容器
- 获取制作一个队列结构的容器
- 堆栈结果先进后出:放进去:从下至上abcde 取出来:edcba
- 队列:先进先出(水管)放进去:abcde 取出来也是:abcde
*/
public class LinkdListDemo {
public static void main(String[] args) {
//DuiZhan dz=new DuiZhan();
DuiLie dz=new DuiLie();
dz.push("a");
dz.push("b");
dz.push("c");
dz.push("d");
dz.push("e");
dz.bianLi();
}
}
/**
堆栈结构的容器
/
class DuiZhan{
private LinkedList li=new LinkedList<>();
/
* 往堆栈结构的容器中加元素
* @param obj
*/
public void push(Object obj) {
li.addFirst(obj);
}
public Object pop() {
//return li.getFirst();//使用getFirst()不能移除全部都会变成重复
return li.removeFirst();//来一个删一个,不会重复,5个出现三个,边遍历边删除
//遍历使用迭代器来做就不会变少
}
public void bianLi() {
Iterator it=li.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
//队列
class DuiLie{
private LinkedList li=new LinkedList<>();
/**
* 往堆栈结构的容器中加元素
* @param obj
*/
public void push(Object obj) {
li.addLast(obj);
}
public Object pop() {
//return li.getFirst();//使用getFirst()不能移除全部都会变成重复
return li.removeFirst();//来一个删一个,不会重复,5个出现三个,边遍历边删除
//遍历使用迭代器来做就不会变少
}
public void bianLi() {
Iterator it=li.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
四. 对ArrayList中的元素去重复
判断list集合中元素是否相同,依据的是元素的equals方法
字符串去重:
list中存储的是字符串,而string的equals方法就是比的字符串值
package com.xiaoyi.list;
import java.util.ArrayList;
/**
*对ArrayList中的元素去重复
*1.元素是字符串
*2.元素是自定义对象
*需求:
*判定两个人是同一个人的依据,名字相同年龄相同
*集合collection的contains在调用的时候调用容器元素对象的equals方法
*之前元素对象是String
*现在元素对象是Object(Person)
*contains方法能对比字符串因为 String方法已经重写了equals方法
*list去重和set去重的底层原理
*/
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList al=new ArrayList<>();
/*al.add(“hehe”);
al.add(“xixi”);
al.add(“lalala”);
al.add(“xiang”);
al.add(“xiang”);
*/
//判断两个人是同一个人的依据,名字,年龄相同
al.add(new Person(“hehe”,10));
al.add(new Person(“xixi”,20));
al.add(new Person(“haha”,14));
al.add(new Person(“xiang”,20));
al.add(new Person(“xixi”,20));
ArrayList newAl=repeat(al);
System.out.println(newAl.size());
}
/**
*arraylist al这个容器中使用重复元素的?
*1.建立一个新的容器
*2.将老的容器遍历取出其中的元素
*3.说明这个元素在新容器中,那么不再往新容器加入,如果不存在就加
*
*list去重和set去重有什么原理
*/
public static ArrayList repeat(ArrayList al) {
ArrayList newAl=new ArrayList<>();//新的容器
for (Object obj : al) {//遍历
if(!newAl.contains(obj)) {//判断时候存在与容器里面
newAl.add(obj);
}
}
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;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
//重写equals方法
@Override
public boolean equals(Object obj) {
Person p=(Person)obj;//上下转型
System.out.println(p.name+"–equals–"+this.name);//Person对象和当前对象相比较
return p.name.equals(this.name) && p.age==this.age;
}
}