List集合框架

1集合框架

2 集合框架list(ArrayList特有方法、特有迭代器、具体对象特点、增长因子论证)

3.LinkedList集合制作堆栈和队列结构的容器

集合框架

一.一个专门操作集合中的元素内部类:迭代器(Iterator)
集合框架思维导图三大类:
在这里插入图片描述
增强for循环
集合的remove方法和迭代器的remove方法有什么区别?

  1. 在迭代器或者foreach循环删除的时候容易出现什么问题。
  2. 在迭代器中执行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%2
    0) {
    //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;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值