介绍集合中的特有方法【Collection and List】
攻城狮搜索工具
在线文档jdk
Collection接口—搜索顺序
- 点击链接
- 点java.util
- 点 Collection<E
其中重点方法有:
------------------------------------------------------------Iterator---------------------------------------------------------
优点:返回在此collection的元素上进行迭代的迭代器
不足:关于元素返回的顺序没有任何保证(除非此 collection 是某个能提供保证顺序的类实例)
public class CollectionDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList<>();
al.add("a");
al.add("b");
al.add("c");
al.add("d");
al.add("e");
//集合List三种遍历方式
① for(Object obj : al) {
System.out.println(obj);
}
② for (int i = 0; i < al.size(); i++) {
System.out.println(al.get(i));
}
③ Iterator it = al.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
集合的remove方法与迭代器的remove方法有啥区别?
例子①:删除容器里的所有元素 错误代码演示
public class CollectionDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList<>();
al.add(22);
al.add(24);
al.add(26);
al.add(28);
al.add(29);
Iterator it = al.iterator();
while(it.hasNext()){
Object obj=it.next();
al.remove(obj);
}
}
}
显示台会出现 :java.util.ConcurrentModificationException
表示:这段代码出现了并发问题,同志们一定要注意了
迭代器在内存中的走向 如下图:
上图代码如下:
public class CollectionDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList<>();
al.add(22);
al.add(24);
al.add(26);
al.add(28);
al.add(29);
Iterator it = al.iterator();
while(it.hasNext()){
int obj=(Integer)it.next();
if(obj % 2==0) {
System.out.println(it.next());
}
}
学集合框架就是为了了解容器的数据结构
---------------------------------------------------ArrayList-----------------------------------------------------
数组结构:
增删慢,查询快,有连续下标 线程不同步<没有锁旗标> 增长因子为1.5 10
---------------------------------------------------------vector--------------------------------------------------------
数组结构:
增删改查都慢,有连续下标 线程同步<有锁旗标,一个用户操作一个方法> 增长因子为2 10
------------------------------------------------------Linkedlist----------------------------------------------------
链表结构如图:
增删快,查询慢,没有连续下标。如图若想问第一个A认识D吗 需要通过BC才能问到,所以查询慢
假如说C是员工,想把C删除,就只要通过BD两个老板就那能够把C删除,所以增删快
特有方法:
- addFirst():在最前面增加
- addLast():在最后面增加
- getFirst():获取第一个
- getLast():获取第二个
- removeFirst():移除第一个
- removeLast():移除第二个
相关的面试题
①利用Linkedlist完成具有堆栈特性的容器
什么是堆栈?如图:
假如有三个字母A/B/C依次分别放入两个容器内
①的解题思路:
- 定义一个容器 Linkedlist
- 堆栈的存放特点:每一次都将元素放入容器的顶部
- 堆栈的取出特点,每一次都是从容器的顶部取出元素
①的解答代码如下:
public class LinkedListDemo {
public static void main(String[] args) {
DuiZhan dz=new DuiZhan();
dz.push("a");
dz.push("b");
dz.push("c");
dz.bianli();
}
}
//定义一个容器
class DuiZhan{
private LinkedList ll=new LinkedList<>();
//定义一个存放的方法
public void push(Object obj){
ll.addFirst(obj); //先往第一个加东西
}
public Object pop(){
return ll.removeFirst();
//由于堆栈是先进后出的,所以移除第一个,也就是最上面一个
}
//然后再把元素遍历出来
public void bianli() {
Iterator it=ll.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
}
②利用Linkedlist完成具有列队特性的容器
队列的话就把堆栈的那种第一个追加改成最后一个是追加
-------------------------------------------------------------set-------------------------------------------------------------
特点:
无序,元素不可以重复
-------------------------------------------------------------list-------------------------------------------------------------
特点:
有序,元素可以 重复 because该集合体系有索引
List里存放的对象是有序的,同时也是可以重复的,List关注的是索引,
拥有一系列和索引相关的方法,查询速度快。因为往list集合里插入或删除数据时,
会伴随着后面数据的移动,所有插入删除数据速度慢。
**父类有的方法子迭代器一样有 例如:
①ListIterator :顺着取
**
public class ListDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList<>();
al.add(22);
al.add(24);
al.add(26);
al.add(28);
al.add(29);
ListIterator it=al.listIterator();
while(it.hasNext()) {
System.out.println(it.next());
}
}
②hasPrevious:倒着取
public class ListDemo {
public static void main(String[] args) {
ArrayList al = new ArrayList<>();
al.add(22);
al.add(24);
al.add(26);
al.add(28);
al.add(29);
ListIterator it=al.listIterator();
while(it.hasPrevious()) {
System.out.println(it.previous()); }
}
}
-----------------------------------------------List实现类vector---------------------------------------------------
对于Vector只需了解他自己有的特有的遍历方式
public class VectorDemo {
public static void main(String[] args) {
Vector al=new Vector<>();
al.add(22);
al.add(24);
al.add(26);
al.add(28);
al.add(29);
Enumeration elements = al.elements(); //拿到枚举对象
while(elements.hasMoreElements()) {
System.out.println(elements.nextElement());
//在枚举里面拿到它的下一个元素
}
}
}
集合框架ArrayList中的重复元素去重以及其底层原理
*如何去除list集合中的重复元素
ArrayList集合去重复代码如下:
方法①
public class ArrayListRepeatDemo {
public static void main(String[] args) {
ArrayList al=new ArrayList<>();
al.add("a");
al.add("b");
al.add("c");
al.add("a");
ArrayList newAll=repeatList(al);
System.out.println(newAll.size());
}
private static ArrayList repeatList(ArrayList al) {
ArrayList newAll=new ArrayList<>();
for (Object obj : al) {
if(!newAll.contains(obj)) {
newAll.add(obj);
}
}
return newAll;
}
}
方法②
public class ArrayListRepeatDemo {
public static void main(String[] args) {
ArrayList al=new ArrayList<>();
//自定义的对象
al.add(new Person("a","18"));
al.add(new Person("b","15"));
al.add(new Person("c","19"));
al.add(new Person("a","18"));
ArrayList newAll=repeatList(al);
System.out.println(newAll.size());
}
private static ArrayList repeatList(ArrayList al) {
ArrayList newAll=new ArrayList<>();
for (Object obj : al) {
if(!newAll.contains(obj)) {
newAll.add(obj);
}
}
return newAll;
}
}
class Person{
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person() {
super();
}
public Person(String name, String age) {
super();
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Person) {
Person p=(Person)obj;
System.out.println(this.getName()+"---equals---"+p.getName());
return this.getName().equals(p.getName())
&& this.getAge()==p.getAge();
}
return false;
}
}
重点总结:
①、集合的remove方法与迭代器的remove方法有什么区别,容易出现什么异常?
并发异常 两个对象对同一个容器进行操作
②、ArrayList与Array的区别?
Array是数组:长度在数组申明时候,就已经确定了;存放的元素也确定了;
ArrayList:长度是可变的;存放元素随意
③、ArrayList与Linkedlist的区别?
ArrayList:数据结构不同、数组、查询快、增删慢、增长因子
Linkedlist:链表结构、查询慢、增删快、addFirst
④、list集合去重的思路,涉及到的方法有哪些,针对于引用数据?
假设有一个容器,里面存放了5个对象,其中有一个对象是重复的?
a 定义去重的方法(定义一个新的容器,判断新的容器是否包含指定的元素,如果包含,那么不添加新容器中,如果不包含,那么添加到新容器中)
b String之所以能够去重,是因为重写Object的equals方法
c 那么自定义的对象需要去去重的话,那么也就需要重写Object的equals方法