List集合中的常见面试题以及简单思路

在这里插入图片描述

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;	}}~

猜你喜欢

转载自blog.csdn.net/weixin_44106334/article/details/94652783
今日推荐