1、集合框架(简介、Collection方法、迭代器)
Collection就是相当容器 特殊的方法有iterator;相当于抓娃娃机中的夹子,把容器的元素取出的工具
《面试题 一.集合的remove方法与迭代器的remove方法有什么区别?
1.在迭代器或者foreach 循环删除的时候容易出现什么常见的问题 (常见!!!)
会下标越界异常
2.在迭代器执行collection.remove方法要注意会出什么问题 util.concurrentModificationException
从本质上来说:并发问题; (抓娃娃机为例子)
代码:
package com.wxm;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/** * collection中特别的方法 * iterator迭代器 * * * * 集合的remove和迭代器的remove有什么区别 * @author wxm * */
public class CollectionDemo {
public static void main(String[] args) {
Collection c= new ArrayList();
c.add(22);
c.add(23);
c.add(34);
c.add(35);
c.add(48); //
//fore//
for (Object object : c) {4//
System.out.println(object);
// } //迭代器是集合的特有方法 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(num); //System.out.println(it.next());
}
}
}
}
2、集合框架List(ArrayList特有方法、特有迭代器、具体对象特点、增长因子论证)
可以看到这类的容器是有下标,可以按照下标去取、删除…等等的方式去操作容器的元素
《面试题 二. 2.1arraylist与linkedlist的区别(增删改查方面,结构)
Arraylist 数组结构 增删慢,查询快 有连续下标 线程不同步 增长因子为1.5 10 Linkedlist 链表结构 增删快,查询慢 没有连续下标
```
package com.wxm; import java.util.ArrayList;
import java.util.Collection;import java.util.List;import java.util.ListIterator;
/* * list中的listIterator * * * */
public class ListDemo {
public static void main(String[] args) {
List c= new ArrayList();
c.add(22);
c.add(23);
c.add(34);
c.add(35);
c.add(48);
ListIterator it=c.listIterator();
while(it.hasPrevious()) {//
System.out.println(it.previous());
}
System.out.println("---");
}
}~
```
2.2 arraylist与list区别
1.list的长度可变,数组长度固定
2.list可以存放各类的元素对象,而数组一声明,只能存放对应的类型 、
2.3arraylist如何调优(增长因子)
为啥list集合底层是数组结构,但数组长度又固定的,而list长度又 怎么变?(论证)~
package com.wxm; import java.lang.reflect.Field;import java.util.ArrayList;
/** * 面试题: * arraylist与array的区别 *
1.list长度可变,数组长度固定、
2.list可以存放各类元素对象,对象一旦声明类型,就不能便 *
* arraylist如何调优 * 增长因子,来实现优化性能 *
* @author wxm * */
* public class ListDemo2 {
* public static void main(String[] args) {
* ArrayList al=new ArrayList<>();
* for(int i=1;i<=80;i++) {
* al.add(i);
* System.out.println(i+",");
* getlength(al);
* }
* }
* public static void getlength(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 (Exception e) {
* e.printStackTrace();
* }
* }}~
3、集合框架LinkedList
链表的数据结构 模拟队列以及堆栈 堆栈:先进后出 子弹夹 队列:先进先出 水管
package com.wxm; import java.util.Iterator;import java.util.LinkedList;
/** * 面试题:
* 通过linkedlist集合来制作一个堆栈结构的容器 * *
* 模拟一个队列结构的容器 */
*public class LinkedListDemo {
public static void main(String[] args) {
Duilie dl=new Duilie();
dl.push("a");
dl.push("b");
dl.push("c");
dl.push("c");
dl.push("d");
dl.push("e");
dl.bianLi();
}
}
/* * 堆栈结构的容器 * */
class Duilie{
private LinkedList ll=new LinkedList<>();
/* * 往堆栈容器添加元素 * * */
public void push (Object obj) {
ll.addLast(obj);
}
public Object pop() {
return ll.removeFirst();
}
public void bianLi() {//
for (int i = 0; i < ll.size(); i++) {//
System.out.println(this.pop());// } Iterator it=ll.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}~
5、集合框架ArrayList中的重复元素去重及其底层原理
判断list 集合中元素是否相同,依据的是元素的equals方法~
字符串去重list中存储的是字符串,而string的equals方法就是比的字符串值 引用数据类型去重(同姓名同年龄视为同一个人)
思路~
1、对人进行描述,将数据封装进对象 2、将对象放入容器 3、去重 引用数据类型被调用了equals方法验证~
package com.wxm; import java.util.ArrayList;
/** * * 对arrayList中的元素去重
1.元素为字符串 2.元素是自定义对象 * *
*
需求:
* 判定两个人是同一个人的依据;
* 名字相同年龄相同 *
@author wxm
*集合collection的contains在调用的时候底层调用容器元素对象的equals方法 * *之前元素对象是String *元素对象是obj(person) */
public class ArrayListDemo {
public static void main(String[] args) {
ArrayList al=new ArrayList<>();//
al.add("wangting");//
al.add("zhuangyuan");
// al.add("xiang");
// al.add("runchen");
// al.add("xiang");
System.out.println("无去重复"+al.size());
// ArrayList newal= repeat(al);
// System.out.println("去重复后"+newal.size());
al.add(new Person("wangting5", 12));
al.add(new Person("wangting1", 12));
al.add(new Person("wangting2", 12));
al.add(new Person("wangting3", 12));
al.add(new Person("wangting1", 12));
System.out.println(al.size());
}
/** * * ArrayList 怎么去重复 *
* 思路:
* 1.建立一个新容器, *
2。将老的容器遍历取出其中的元素 *
3.如果这个元素存在于新容器中,那么不再往新容器加入。如果不存在,就加 */
public static ArrayList repeat(ArrayList al) {
ArrayList newAl =new ArrayList<>();
for(Object obj:al) {
if(!newAl.contains(obj)) {
newAl.add(obj);
}
}
return newAl;
}
}
cclass 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(); }
@Override
public boolean equals(Object obj) {
Person p=(Person) obj;
System.out.println(p.name+"--equals--"+this.name);
return p.name.equals(this.name) && p.age==this.age; }}~