一道比较简单的java面试题,一个list中存放string,例如存放人名,而且这个list的size比较大,现在要求去除该list中的名字为姓“张”的所有元素,至今没有想到很好的方法,自己只知道三种方法,求大神给予更好的答案,性能越高越好,谢谢~
import java.util.ArrayList; import java.util.ConcurrentModificationException; import java.util.Iterator; import java.util.List; import java.util.Random; import org.junit.Before; public class ModifyList { public List<String> lists=null; String[] prefixName = new String[]{"赵","钱","孙","李","张","陈"}; String[] suffixName = new String[]{"子涵","心怡","子墨","梦瑶","浩轩","轩","俊熙","可馨","睿","思彤","思诚","丹"}; @Before public void before(){ lists=new ArrayList<String>(); Random random=new Random(); int i=0; while(i<50000){ int prefix=random.nextInt(6); int suffix=random.nextInt(12); String name=prefixName[prefix]+suffixName[suffix]; lists.add(name); i++; } } @org.junit.Test(expected=ConcurrentModificationException.class) public void remove1(){ for(String name:lists){ if(name!=null&name.indexOf("张")>-1){ lists.remove(name); } } System.out.println(lists); } /** * 该方法适用于去除唯一一个不合适的值,效率最高 */ @org.junit.Test public void remove2(){ for(String name:lists){ if(name!=null&name.indexOf("张")>-1){ lists.remove(name); break; } } System.out.println(lists); } /** * 该方法没有报错,因为每次都去获取lists.size * 不会抛出ConcurrentModificationException异常 * 但如果连续的list中有连续的姓张的在一起,就会出现不删除现象 * 当i=0时,删除“张三”,此时“张九”的下标变为0,i=1,此时就不会对“张九”做处理 */ @org.junit.Test public void remove3(){ for(int i=0;i<lists.size();i++){ if(lists.get(i)!=null&lists.get(i).indexOf("张")>-1){ lists.remove(i); } } System.out.println(lists); } /** * 正确方法一 */ @org.junit.Test public void remove4(){ long begin=System.currentTimeMillis(); System.out.println(begin); Iterator<String> iters = lists.iterator(); while(iters.hasNext()){ String name=iters.next(); if(name!=null&name.indexOf("张")>-1){ iters.remove(); } } long end=System.currentTimeMillis(); System.out.println(end); System.out.println(end-begin); /*System.out.println(lists);*/ } /** * 正确方法二 */ @org.junit.Test public void remove5(){ long begin=System.currentTimeMillis(); System.out.println(begin); for(int i=0;i<lists.size();i++){ if(lists.get(i)!=null&lists.get(i).indexOf("张")>-1){ lists.remove(i); i--; } } long end=System.currentTimeMillis(); System.out.println(end); System.out.println(end-begin); //System.out.println(lists); } /** * 正确方法三,效率最高,其实不算去除 */ @org.junit.Test public void remove6(){ List<String> list2=new ArrayList<String>(); long begin=System.currentTimeMillis(); System.out.println(begin); for(String name:lists){ if(name!=null&name.indexOf("张")<0){ list2.add(name); } } long end=System.currentTimeMillis(); System.out.println(end); System.out.println(end-begin); //System.out.println(list2); } }
相关推荐
### Java工程师面试题知识点解析 #### 一、Hibernate中离线查询去除重复项 - **问题**: Hibernate中如何在离线查询中去除重复项? - **解决方案**: 在Hibernate的Criteria API中,可以通过调用`...
本文总结了 BAT 面试中常见的 Java 面试题,涵盖了 List、Map、String 等基本数据结构和面试题,旨在帮助读者更好地了解 BAT 面试的常见问题。 一、List 相关知识点 1. List 是有序的,ArrayList 和 LinkedList 是...
65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都...
### Java工程师面试题知识点解析 #### 一、Hibernate中离线查询去除重复项 - **问题**: Hibernate中离线查询去除重复项怎么加条件? - **解决方案**: 在Hibernate的Criteria API中,可以通过调用`...
Java工程师面试题主要涵盖多个Java基础知识领域,包括但不限于语法、框架、网络协议、文件操作、Servlet、数据库管理和数据结构。以下是对这些知识点的详细解析: 1. Hibernate中的离线查询去除重复项: Hibernate...
这份"2023一线互联网大厂Java面试题集"是为那些正在寻找跳槽机会,特别是对Java技术有深入理解和应用的初中高级开发者精心准备的。它包含了来自百度、阿里、字节跳动等知名企业的最新面试题目,涵盖了广泛的Java核心...
### Java面试题总结 #### 一、MVC框架与MySQL索引 - **MVC框架**:MVC(Model-View-Controller)是一种常见的软件架构模式,用于将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)...
【Java基础知识】 1. **Java基本类型**:Java有8种基本数据类型,包括布尔型(boolean)、字符型(char)、字节型(byte...以上是Java面试中常见的知识点,深入理解这些基础概念对于解决实际问题和通过面试至关重要。
65、去掉一个Vector集合中重复的元素 46 66、Collection 和 Collections的区别。 47 67、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别? 47 68、你所知道的集合类都...
从给定的文件信息中,我们可以提取出一系列与Java编程语言相关的面试知识点,这些...以上知识点覆盖了Java面试中经常被问及的基础和进阶概念,理解并掌握这些知识将有助于加深对Java语言特性的了解,并提高面试成功率。
本资料“直击面试系列_破解Java面试题_全”显然是为了帮助求职者准备这些常见的Java面试问题。 首先,我们来看看Java的基础知识。Java语法基于C++,但去除了指针等易出错的特性,引入了垃圾回收机制来自动管理内存...
### 华为Java面试题知识点解析 #### 一、Java面向对象基础 1. **super()与this()的区别** - `super()`用于调用父类的构造方法或父类中的成员方法。 - `this()`用于调用本类中的其他构造方法。 2. **作用域public...
### Java面试题精选与解析知识点概览 #### 一、Java基础知识 - **Java的特点和优势**: - 平台无关性:Java程序可以在任何安装了Java虚拟机(JVM)的操作系统上运行,无需修改。 - 面向对象:Java是一种纯面向...
// 定义下标,模拟已经去掉一个元素,因此从-1开始 // 循环移除元素,直到只剩一个 while (dataList.size() > 1) { index = (index + k) % dataList.size(); // 移动k步 dataList.remove(index); // 移除元素 ...