Day 5 :ArrayList原理、LinkedList原理和方法和迭代器注意事项
迭代器在变量元素的时候要注意事项:
在迭代器迭代元素 的过程中,不允许使用集合对象改变集合中的元素个数,如果需要添加或者删除只能使用迭代器的方法进行操作。
如果使用过了集合对象改变集合中元素个数那么就会出现ConcurrentModificationException异常。
迭代元素的过程中:
迭代器创建到使用结束的时间。
------意识是迭代器一旦创建,在之后是不可以用集合操作元素的。如果用了后再调用迭代器是报错的。
//错误代码段
List list = new ArrayList();//创建集合
list.add("李杰");
list.add("李英");
list.add("李汉三");
ListIterator it = list.listIterator(); //获取到迭代器
list.add("Ha");
it.next();
//正确代码段
List list = new ArrayList();//创建集合
list.add("李杰");
list.add("李英");
list.add("李汉三");
ListIterator it = list.listIterator(); //获取到迭代器
it.next();
list.add("Ha");
ArrayList
笔试题目:使用ArrayList无参的构造函数创建一个 对象时, 默认的容量是多少? 如果长度不够使用时又自增增长多少?
ArrayList底层是维护了一个Object数组实现的,使用无参构造函数时,Object数组默认的容量是10,当长度不够需要比较所需要的最小长度和Object数组长度,当Object数组长度不够时,自动增长0.5倍。如果(所需要的最小长度-增长后的数组长度>0,那么将所需要的最小长度作为新长度赋值给Object数组长度)
ArrayList底层是维护了一个Object数组实现的
特点: 查询速度快,增删慢。
因为数组中的数据是连续的如果删除或增加就会导致缺失或者多一位数据,当数据量大的时候就会需要使用复制进行移动位置或者移动到更加大的数组空间,就会特别慢
ArrayList 特有的方法:
ensureCapacity(int minCapaci上ty)//制定
trimToSize()
什么时候使用ArrayList: 如果目前的数据是查询比较多,增删比较少的时候,那么就使用ArrayList存储这批数据。
作业: 编写一个函数清除集合中重复元素。图书管理为例如果书号是一样就视为重复元素。
要求: 遍历集合元素的时候必须使用迭代器。 迭代器
import java.util.*; class book{
int id;
String name; public book(int id,String name) {
this.id = id;
this.name = name;
} @Override
public boolean equals(Object obj) {
book v = (book)obj;
return this.id==v.id;
} @Override
public String toString() {
// TODO Auto-generated method stub
return "{"+"编号"+id+",书名"+name+"}";
} }
public class Demo1 {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new book(110,"java web"));
list.add(new book(120,"java"));
list.add(new book(119,"c++"));
list.add(new book(110,"c#")); ArrayList list1 = clearRe_element(list);
System.out.println(list1);
} private static ArrayList clearRe_element(ArrayList list) {
ArrayList list2 = new ArrayList(); Iterator it =list.iterator();
while(it.hasNext()) {
book a = (book)it.next();
if(!list2.contains(a)) {
list2.add(a);
}
}
return list2;
} }
LinkedList
LinkedList底层是使用了链表数据结构实现的
特点: 查询速度慢,增删快。
Linkedlist特有的方法:
1:方法介绍
addFirst(E e)
addLast(E e)
getFirst()
getLast()
removeFirst()
removeLast()
2:数据结构
栈 : 主要是用于实现堆栈数据结构的存储方式。
先进后出
push()
pop()
队列(双端队列): 主要是为了让你们可以使用LinkedList模拟队列数据结构的存储方式。
先进先出
offer()
poll()
返回逆序的迭代器对象
descendingIterator() 返回逆序的迭代器对象
import java.util.*;
public class Demo2 { public static void main(String[] args) {
LinkedList list= new LinkedList();
list.add("李杰");
list.add("李英");
list.add("李汉三");
/*
list.addFirst("李道杰"); //把元素添加到集合的首位置上。
list.addLast("杰仔"); //把元素添加到集合的末尾处。 System.out.println(list.getFirst());//获取集合中首位置的元素
System.out.println(list.getLast());//获取集合中末尾的元素 System.out.println(list.removeFirst());//删除集合中的首位置元素并返回
System.out.println(list.removeLast());//删除集合中的末尾素并返回 list.push("英子"); //将该元素插入此集合的开头处。
System.out.println(list.pop()); // 移除并返回集合中的第一个元素 list.offer("哈哈哈");//将该元素插入此集合的开头处
System.out.println(list.poll());//删除集合的首元素 System.out.println(list);
*/
Iterator it = list.descendingIterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
题目: 使用LinkedList实现堆栈数据结构的存储方式与队列的数据结构存储方式
import java.util.*;
//模拟栈的存储方式pop();push();
class StackList{
LinkedList list = new LinkedList();
//进栈
public void add(Object o){
list.push(o);
}
//弹栈 : 把元素删除并返回
public Object pop(){
return list.pop();
}
//获取元素个数
public int size(){
return list.size();
}
} //模拟队列的存储方式poll();offer(o);
class TeamList{
LinkedList list = new LinkedList();
//进入队列
public void add(Object o){
list.offer(o);
}
//移除队列
public Object remove(){
return list.poll();
}
//获取元素个数
public int size(){
return list.size();
}
} public class Demo3 { public static void main(String[] args) { StackList list = new StackList();
list.add("李杰");
list.add("李英");
list.add("李汉三"); int size = list.size();
for(int i = 0 ; i<size ; i++){
System.out.println(list.pop());
} TeamList list1= new TeamList();
list.add("李杰");
list.add("李英");
list.add("李汉三"); int size1 = list.size();
for(int i = 0 ; i<size ; i++){
System.out.println(list1.remove());
}
}
}
Day 5 :ArrayList原理、LinkedList原理和方法和迭代器注意事项的更多相关文章
- java学习笔记20(Arraylist复习,Collection接口方法,迭代器,增强型for循环)
集合:集合是Java提供的一种容器,可以用来存储多个数据: 集合与数组的区别:集合的长度是可变的,数组的长度是固定的 集合中存储的数据必须是引用类型数据: ArrayList回顾: public cl ...
- 从list引用调用arraylist和linkedlist对象的方法了解多态
一.前言 今天和朋友在写代码时突然发现List<object> list=new ArrayList<object>()中,前面是通过List引用来调用其子类ArrayLis ...
- java面试记录三:hashmap、hashtable、concurrentHashmap、ArrayList、linkedList、linkedHashmap、Object类的12个成员方法、消息队列MQ的种类
口述题 1.HashMap的原理?(数组+单向链表.put.get.size方法) 非线程安全:(1)hash冲突:多线程某一时刻同时操作hashmap并执行put操作时,可能会产两个key的hash ...
- 什么情况用ArrayList or LinkedList呢?
ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类.ArrayList 和 LinkedList 都实现 List 接口.先对List做一个简单的了解: ...
- Java中ArrayList和LinkedList的异同
一:ArrayList和LinkedList的大致区别如下: 1.ArrayList是实现了基于动态数组的数据结构,ArrayList实现了长度可变的数组,在内存中分配连续的空间.遍历元素和随机访问元 ...
- Java集合之ArrayList和LinkedList的实现原理以及Iterator详解
ArrayList实现可变数组的原理: 当元素超出数组内容,会产生一个新数组,将原来数组的数据复制到新数组中,再将新的元素添加到新数组中. ArrayList:是按照原数组的50%来延长,构造一个初始 ...
- 集合中list、ArrayList、LinkedList、Vector的区别、Collection接口的共性方法以及数据结构的总结
List (链表|线性表) 特点: 接口,可存放重复元素,元素存取是有序的,允许在指定位置插入元素,并通过索引来访问元素 1.创建一个用指定可视行数初始化的新滚动列表.默认情况下,不允许进行多项选择. ...
- 二.LinkedList原理及实现学习总结
一.LinkedList实现原理概述 LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同.LinkedList 是基于链表实现的(通过名字也能 ...
- Java集合:ArrayList的实现原理
Java集合---ArrayList的实现原理 目录: 一. ArrayList概述 二. ArrayList的实现 1) 私有属性 2) 构造方法 3) 元素存储 4) 元素读取 5) 元素删除 ...
随机推荐
- Ubuntu 16.04 系统编译部署lamp服务。
壹 下载Apache 和 PHP源码包: Apache:http://httpd.apache.org/download.cgi PHP:http://php.net/downloads.php 贰 ...
- No 'Access-Control-Allow-Origin'跨域问题- (mysql-thinkphp) (6)
因为ajax请求一个服务的时候,服务器端,比如thinkphp端,或者java框架,它会检测,你请求时候的域名,就是http请求的时候,request header不是会把客户端的Request UR ...
- mysq8设置编码utf8
设置mysql默认编码utf8 以及其他配置 系统:centos7 vi /etc/my.cnf #红色部分如果以存在则在他的下方添加 [mysql] default-character-set=ut ...
- Java虚拟机03(Java虚拟机内存模型)
根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法区.程序计数器.本地方法栈五个部分. 其实最需要Java程序员关注的是堆,栈,还有方法区,因为啊: 如果代码又问题的话,可能回出现栈溢出 然后说 ...
- [前端] Vue封装播放器、打包、上传NPM
一.使用icomoon 1.生成和下载图标相关文件 先使用icomoon获取我们要使用的图标,例如播放.暂停.停止.全屏等图标. icomoon网站:https://icomoon.io/app/#/ ...
- Python连载61-tkinter三种布局
一.pack布局举例 #pack布局案例 import tkinter baseFrame = tkinter.Tk() #以下代码都是创建一个组件,然后布局 btn1 = tkinter.Butto ...
- 0109 springboot的部署测试监控
springboot的部署测试监控 部署 基于maven 打包 JAR 打包方式一般采用的jar包,使用springboot的默认方式即可: 使用maven命令: mvn clean package ...
- setTimeout的异步
http://www.cnblogs.com/littledu/articles/2607211.html http://www.cnblogs.com/rubylouvre/archive/2009 ...
- 洛谷P1002——过河卒
又是洛谷题,要不是有小姐姐不会,我才不想动脑子.先贴一下题目地址https://www.luogu.org/problem/P1002 再贴一下题目: 我们读一下题目,这可不比学校的**算法题,读完一 ...
- netty权威指南学习笔记四——TCP粘包/拆包之粘包问题解决
发生了粘包,我们需要将其清晰的进行拆包处理,这里采用LineBasedFrameDecoder来解决 LineBasedFrameDecoder的工作原理是它依次遍历ByteBuf中的可读字节,判断看 ...