文章目录
本节总结知识网思维导图
一、特点
- 相当于一个容器的增删改查
- list集合长度是不固定的
- 有序并且可以添加徒步元素
- 可重复
示例代码块:
package com.xhy.list;
import java.util.ArrayList;
import java.util.List;
public class demol01 {
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
// 增加
list.add("a");
list.add("b");
list.add("c");
list.add("d");
System.out.println("现有的集合元素有:" + list);
// 重复:
list.add("b");
System.out.println("现有的集合元素有:" + list);
// 移除:
list.remove(0);
System.out.println("现有的集合元素有:" + list);
// 查:
System.out.println(list.get(0));
// 改:
list.set(0, "d");
System.out.println("现有的集合元素有:" + list);
}
}
①可增加:
结果如下:
②可重复:前面代码后面直接加
结果如下:
③可删:
④可改 :
⑤可查:
二、遍历
1.fori
代码如下(示例):
for (int i = 0; i <list.size(); i++) {
System.out.println(list.get(i));
}
2.foreach
代码如下(示例):
for (String s : list) {
System.out.println(s);
}
3.iterator(迭代器)
理解迭代器原理:
代码如下(示例):
Iterator<String> it=list.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
错误代码示例:
Iterator it = a1.iterator();
while(it.hasNext()) {
Object obj = it.next();
a1.remove(obj);
}
原因:
出现了并发问题。两个对象同时操作了同一个变量,所以不能这样删除集合里的元素
演示结果如下:
三、LinkedList
1、对比ArrayList的数据结构及特点
面试题:
Linked数据结构是链表
ArrayList数据结构是底层数组
特点:
①Arraylist查询修改快,删除新增慢
②LinkedList查询修改慢,删除新增快
图解原理:
代码如下(示例):
代码块
演示结果如下:
2、堆栈、队列特点
①堆栈:先进后出
②队列:先进先出
模拟队列以及堆栈 如图所示:
堆栈:
代码如下(示例):
package com.xhy.list;
import java.util.LinkedList;
/**
* LinkedList实现队列以及堆栈
* @author zjjt
*
*/
public class Demo3 {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
Duizhan dl=new Duizhan(list);
dl.push("a");
dl.push("b");
dl.push("c");
dl.push("d");
System.out.println(dl.pop());
System.out.println(dl.pop());
System.out.println(dl.pop());
System.out.println(dl.pop());
}
}
class Duizhan{
LinkedList<String> ll=null;
public Duizhan(LinkedList<String> ll) {
this.ll=ll;
}
//从容器中取出元素(队列先进后出出)
public String pop() {
return ll.removeLast();
}
public void push(String s) {
ll.add(s);
}
}
演示结果如下:
队列:
代码如下(示例):
package com.xhy.list;
import java.util.LinkedList;
/**
* LinkedList实现队列以及堆栈
* @author zjjt
*
*/
public class Demo3 {
public static void main(String[] args) {
LinkedList<String> list = new LinkedList<>();
DuiLie dl=new DuiLie(list);
dl.push("a");
dl.push("b");
dl.push("c");
dl.push("d");
System.out.println(dl.pop());
System.out.println(dl.pop());
System.out.println(dl.pop());
System.out.println(dl.pop());
}
}
class DuiLie{
LinkedList<String> ll=null;
public DuiLie(LinkedList<String> ll) {
this.ll=ll;
}
//从容器中取出元素(队列先进先出)
public String pop() {
return ll.removeFirst();
}
public void push(String s) {
ll.add(s);
}
}
演示结果如下:
四、增长因子论证
结论:List集合底层是数组结构,它是“可变数组”,一旦超过默认数组大小,
会自动扩容,扩容的增长因子为0.5(原来的1.5)
内部表示:
代码如下(示例):
package com.xhy.list;
import java.lang.reflect.Field;
import java.util.ArrayList;
/**
* List集合底层是数组结构,它是“可变数组”,一旦超过默认数组大小,
* 会自动扩容,扩容的增长因子为0.5(原来的1.5)
* @author zjjt
*
*/
public class demo4 {
public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
ArrayList list=new ArrayList<>();
for (int i = 1; i < 101; i++) {
System.out.println(i);
list.add(i);
//论证:
printelementDataLength(list);
}
}
private static void printelementDataLength(ArrayList<String> list) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
Field f=list.getClass().getDeclaredField("elementData");
f.setAccessible(true);
Object[] elementData =(Object[])f.get(list);
System.out.println("目前list集合底层存储数据的数组长度"+elementData.length);
}
}
演示结果如下:
五、集合框架ArrayList中的重复元素去重原理
结论:list集合去重与去重对象equals方法有关
论证:
package com.xhy.list;
import java.util.ArrayList;
import java.util.List;
/**
* list集合去重与去重对象equals方法有关
* @author zjjt
*
*/
public class Demo5 {
public static void main(String[] args) {
List list = new ArrayList<>();
// list.add("a");
// list.add("b");
// list.add("c");
// if(!list.contains("b")) {
// list.add("b");
// }
//第一种:
list.add(new Student("xhy", 18));
list.add(new Student("sjy", 18));
list.add(new Student("ltf", 18));
list.add(new Student("lsz", 18));
if(!list.contains(new Student("lsz", 18))) {
list.add("lsz");
}
for (Object object : list) {
System.out.println(object);
}
}
}
class Student{
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 Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
演示结果如下:
添加hasCode()和equesl()方法代码后:
@Override
public int hashCode() {
System.err.println("hashCo方法被调用");
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
System.err.println("equals方法被调用");
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
演示结果如下:
另:
UML(基于面向对象的统一建模语言)
可画关系图
详情可看:https://blog.csdn.net/qq_35433716/article/details/82821747