集合框架(List、Collection、迭代器)

介绍集合中的特有方法【Collection and List】

攻城狮搜索工具
在线文档jdk

Collection接口—搜索顺序

  1. 点击链接
  2. 点java.util
  3. 点 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删除,所以增删快

特有方法:

  1. addFirst():在最前面增加
  2. addLast():在最后面增加
  3. getFirst():获取第一个
  4. getLast():获取第二个
  5. removeFirst():移除第一个
  6. 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方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值