1.Lists.newArrayList和正常的码重 new ArrayList有什么区别?
2.阿里java开发手册为什么不建议使用arraylist的sublist方法
3.ArrayList详解及扩容源码分析
4.HashMapåHashtableçåºå«
5.å¦ä½èªå·±å®ç°ä¸ä¸ªç®åçArrayList
6.Hadoop 的 Lists.newArrayList和正常的 new ArrayList()有什么区别?
Lists.newArrayList和正常的 new ArrayList有什么区别?
List是一个接口,而ArrayList 是码重一个类。1、码重ArrayList 继承并实现了List。码重List list = new ArrayList();这句创建了一个ArrayList的码重对象后把上溯到了List。此时它是码重写入数据库php源码例子一个List对象了,有些ArrayList有但是码重List没有的属性和方法,它就不能再用了。码重而ArrayList list=new ArrayList;创建一对象则保留了ArrayList的码重所有属性。
2、码重为什么一般都使用 List list = new ArrayList ,码重而不用 ArrayList alist = new ArrayList呢。问题就在于List有多个实现类,码重如 LinkedList或者Vector等等,码重现在你用的码重是ArrayList,也许哪一天你需要换成其它的码重mx浪潮源码实现类呢。
3、这时你只要改变这一行就行了:List list = new LinkedList; 其它使用了list地方的代码根本不需要改动。假设你开始用 ArrayList alist = new ArrayList,这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。 ,如果没有特别需求的话,最好使用List list = new LinkedList,便于程序代码的重构,这就是面向接口编程的好处。
4、ava的多态,List只是定义了一堆接口,而对于这些接口,有各种各样的实现,比如ArrayList,unity双截龙源码LinkedList等等,不同的实现,会有自己不同的特性以及追加自己特有的方法。当你仅仅使用List的通用接口方法时,定义成List(也就是面向接口编程)是非常好的习惯。
阿里java开发手册为什么不建议使用arraylist的sublist方法
使用ArrayList的SubList方法存在潜在风险与不便之处,原因主要体现在以下几个方面。
举例而言,从ArrayList和内部类SubList的声明出发,两者皆继承自同一个父类AbstractList。在Java源码中,这种设计表明两者在逻辑上存在紧密关联。
深入分析,SubList对象实质上是幕聊源码一个代理对象,它关联于原始ArrayList实例。这意味着任何对SubList的修改操作,最终都会反馈到原始ArrayList中。这种特性虽在某些场景下带来了便利,但同时也带来了风险。
首先,SubList与原始列表的这种关联性可能导致不必要的资源消耗与性能问题。由于修改操作会反映到原始列表上,每次对子列表的修改都需要同步到原始列表中,这无疑增加了系统的处理负担。
其次,由于SubList作为代理对象,其操作可能会引发未预料的异常。例如,物品领用源码当尝试对已经迭代结束的子列表进行修改时,可能会导致运行时异常,影响程序的稳定性。
综上所述,考虑到SubList方法在实际应用中的潜在风险与不便,推荐使用更安全且灵活的替代方案。例如,可以创建一个新的ArrayList实例,通过调用原始列表的subList方法并传入指定的开始与结束索引来生成。这种操作不仅避免了与原始列表的关联性,还能提供更可控的列表操作环境。
ArrayList详解及扩容源码分析
在集合框架中,ArrayList作为普通类实现List接口,如下图所示。 它实现了RandomAccess接口,表明支持随机访问;Cloneable接口,表明可以实现克隆;Serializable接口,表明支持序列化。 与其他类不同,如Vector,ArrayList在单线程环境下的线程安全性较差,但适用于多线程环境下的Vector或CopyOnWriteArrayList。 ArrayList底层基于连续的空间实现,为动态可扩展的顺序表。一、构造方法解析
使用ArrayList(Collection c)构造方法时,传入类型必须为E或其子类。二、扩容分析
不带参数的构造方法初始容量为,此时底层数组为空,即`DEFAULT_CAPACITY_EMPTY_ELEMENTDATA`长度为0。 元素添加时,默认插入数组末尾,调用`ensureCapacityInternal(size + 1)`增加容量。 若当前容量无法满足增加需求,计算新的容量以达到所需规模,确保添加元素成功并避免频繁扩容。三、常用方法
通过List.subList(int fromIndex, int toIndex)方法获取子列表,修改原列表元素亦会改变此子列表。四、遍历方式
ArrayList提供for循环、foreach循环、迭代器三种遍历方法。五、缺陷与替代方案
ArrayList基于数组实现,插入或删除元素导致频繁元素移动,时间复杂度高。在需要任意位置频繁操作的场景下,性能不佳。 因此,在Java集合中引入了更适合频繁插入和删除操作的LinkedList类。 版权声明:本文内容基于阿里云实名注册用户的贡献,遵循相关协议规定,包括用户服务协议和知识产权保护指引。发现抄袭内容,可通过侵权投诉表单举报,确保社区内容健康、合规。HashMapåHashtableçåºå«
HashMapåHashtableçæ¯è¾æ¯Javaé¢è¯ä¸ç常è§é®é¢ï¼ç¨æ¥èéªç¨åºåæ¯å¦è½å¤æ£ç¡®ä½¿ç¨éå类以åæ¯å¦å¯ä»¥éæºåºå使ç¨å¤ç§æ路解å³é®é¢ãHashMapçå·¥ä½åçãArrayListä¸Vectorçæ¯è¾ä»¥åè¿ä¸ªé®é¢æ¯æå ³Java éåæ¡æ¶çæç»å ¸çé®é¢ãHashtableæ¯ä¸ªè¿æ¶çéåç±»ï¼åå¨äºJava APIä¸å¾ä¹ äºãå¨Java 4ä¸è¢«éåäºï¼å®ç°äºMapæ¥å£ï¼æ以èªæ¤ä»¥åä¹æäºJavaéåæ¡æ¶ä¸çä¸é¨åãHashtableåHashMapå¨Javaé¢è¯ä¸ç¸å½å®¹æ被é®å°ï¼çè³æ为äºéåæ¡æ¶é¢è¯é¢ä¸æ常被èçé®é¢ï¼æ以å¨åå ä»»ä½Javaé¢è¯ä¹åï¼é½ä¸è¦å¿äºåå¤è¿ä¸é¢ã
è¿ç¯æç« ä¸ï¼æ们ä¸ä» å°ä¼çå°HashMapåHashtableçåºå«ï¼è¿å°çå°å®ä»¬ä¹é´çç¸ä¼¼ä¹å¤ã
HashMapåHashtableé½å®ç°äºMapæ¥å£ï¼ä½å³å®ç¨åªä¸ä¸ªä¹åå è¦å¼æ¸ æ¥å®ä»¬ä¹é´çåå«ã主è¦çåºå«æï¼çº¿ç¨å®å ¨æ§ï¼åæ¥(synchronization)ï¼ä»¥åé度ã
ç±äºHashtableæ¯çº¿ç¨å®å ¨çä¹æ¯synchronizedï¼æ以å¨å线ç¨ç¯å¢ä¸å®æ¯HashMapè¦æ ¢ãå¦æä½ ä¸éè¦åæ¥ï¼åªéè¦åä¸çº¿ç¨ï¼é£ä¹ä½¿ç¨HashMapæ§è½è¦å¥½è¿Hashtableã
HashMapä¸è½ä¿è¯éçæ¶é´çæ¨ç§»Mapä¸çå ç´ æ¬¡åºæ¯ä¸åçã
fail-fastæºå¶å¨éåä¸ä¸ªéåæ¶ï¼å½éåç»æ被修æ¹ï¼ä¼æåºConcurrent Modification Exceptionã
fail-fastä¼å¨ä»¥ä¸ä¸¤ç§æ åµä¸æåºConcurrentModificationException
éå被å建åï¼å¨éåå®çè¿ç¨ä¸ä¿®æ¹äºç»æã
注æ remove()æ¹æ³ä¼è®©expectModcountåmodcount ç¸çï¼æ以æ¯ä¸ä¼æåºè¿ä¸ªå¼å¸¸ã
å½ä¸ä¸ªçº¿ç¨å¨éåè¿ä¸ªéåï¼èå¦ä¸ä¸ªçº¿ç¨å¯¹è¿ä¸ªéåçç»æè¿è¡äºä¿®æ¹ã
è¿ä»£å¨å¨éåè¿ç¨ä¸æ¯ç´æ¥è®¿é®å é¨æ°æ®çï¼å æ¤å é¨çæ°æ®å¨éåçè¿ç¨ä¸æ æ³è¢«ä¿®æ¹ã为äºä¿è¯ä¸è¢«ä¿®æ¹ï¼è¿ä»£å¨å é¨ç»´æ¤äºä¸ä¸ªæ è®° âmodeâ ï¼å½éåç»ææ¹åï¼æ·»å å é¤æè ä¿®æ¹ï¼ï¼æ è®°"mode"ä¼è¢«ä¿®æ¹ï¼èè¿ä»£å¨æ¯æ¬¡çhasNext()ånext()æ¹æ³é½ä¼æ£æ¥è¯¥"mode"æ¯å¦è¢«æ¹åï¼å½æ£æµå°è¢«ä¿®æ¹æ¶ï¼æåºConcurrent Modification Exceptionã
ä¸é¢ççArrayListè¿ä»£å¨é¨åçæºç ã
å¯ä»¥çå°å®çæ è®°âmodeâ为 expectedModeCountã
fail-safeä»»ä½å¯¹éåç»æçä¿®æ¹é½ä¼å¨ä¸ä¸ªå¤å¶çéåä¸è¿è¡ä¿®æ¹ï¼å æ¤ä¸ä¼æåºConcurrentModificationExceptionã
fail-safeæºå¶æ两个é®é¢
HashMapå¯ä»¥éè¿ä¸é¢çè¯å¥è¿è¡åæ¥ï¼
Map m = Collections.synchronizeMap(hashMap);
HashtableåHashMapæå 个主è¦çä¸åï¼çº¿ç¨å®å ¨ä»¥åé度ãä» å¨ä½ éè¦å®å ¨ç线ç¨å®å ¨çæ¶å使ç¨Hashtableï¼èå¦æä½ ä½¿ç¨Java 5æ以ä¸çè¯ï¼è¯·ä½¿ç¨ConcurrentHashMapå§ã
å¦ä½èªå·±å®ç°ä¸ä¸ªç®åçArrayList
ArrayListæ¯Javaéåæ¡æ¶ä¸ä¸ä¸ªç»å ¸çå®ç°ç±»ãä»æ¯èµ·å¸¸ç¨çæ°ç»èè¨ï¼ææ¾çä¼ç¹å¨äºï¼å¯ä»¥éæçæ·»å åå é¤å ç´ èä¸éèèæ°ç»ç大å°ãå®ç°ä¸ä¸ªç®åçArrayListï¼å®ç°çè¿ç¨ï¼
å®ç°çArrayList主è¦çåè½å¦ä¸ï¼
é»è®¤æé å¨åä¸ä¸ªåæ°çæåæé å¨
addæ¹æ³
getæ¹æ³
indexOfæ¹æ³
containsæ¹æ³
sizeæ¹æ³
isEmptyæ¹æ³
removeæ¹æ³
è¿ä¸ªç®åçArrayListç±» åå为SimpleArrayListï¼å ¨é¨ç代ç æ¥çSimpleArrayList代ç
æé å¨
æºç ArrayListä¸å ±æä¸ä¸ªæé å¨ï¼ä¸ä¸ªæ åæé å¨ï¼ä¸ä¸ªåæ°ä¸ºintåæåæé å¨ï¼ä¸ä¸ªåæ°ä¸ºCollectionåçæåæé å¨ãåæ°ä¸ºCollectionåçæé å¨ç¨æ¥å®ç°å°å ¶ä»ç»§æ¿Collectionç±»ç容å¨ç±»è½¬æ¢æArrayListãSimpleArrayListç±»å 为è¿æ²¡ææå¨å®ç°å ¶ä»ç容å¨ç±»ï¼æ以å®ç°çæé æ¹æ³åªæ2个ã代ç å¦ä¸ï¼
public SimpleArrayList(){ this(DEFAULT_CAPACITY);} public SimpleArrayList(int size){ if (size < 0){ throw new IllegalArgumentException("é»è®¤ç大å°" + size);
}else{
elementData = new Object[size];
}
}
æ åæé å¨ä¸ç DEFAULT_CAPACITYæ¯å®ä¹çç§æåéï¼é»è®¤å¼æ¯ï¼ç¨æ¥å建ä¸ä¸ªå¤§å°ä¸ºçæ°ç»ãæåæé å¨ä¸ï¼intåæ°æ¯ç¨æ¥çæä¸ä¸ªæå®å¤§å°çObjectæ°ç»ãå°å建好çæ°ç»ä¼ ç»elementDataãelementDataæ¯çæ£çç¨æ¥åå¨å ç´ çæ°ç»ãaddæ¹æ³
add æ¹æ³ç¨æ¥å¾å®¹å¨ä¸æ·»å å ç´ ï¼addæ¹æ³æ两个éè½½æ¹æ³ï¼ä¸ä¸ªæ¯add(E e),å¦ä¸ä¸ªæ¯add(int index, E e)ãaddæ¬èº«å¾ç®åï¼ä½æ¯è¦å¤çå¨ææ°ç»ï¼å³æ°ç»å¤§å°ä¸æ»¡è¶³çæ¶åï¼æ©å¤§æ°ç»çå åãå ·ä½ç代ç å¦ä¸ï¼
public void add(E e){isCapacityEnough(size + 1);
elementData[size++] = e;
}
æ¹æ³isCapacityEnoughå°±æ¯æ¥å¤ææ¯å¦éè¦æ©å®¹ï¼ä¼ å ¥çåæ°å°±æ¯æå°çæ©å®¹ç©ºé´ãå 为addä¸ä¸ªå ç´ ï¼æ以æå°çæ©å®¹ç©ºé´ï¼å³æ°çé¿åº¦æ¯ææå ç´ + 1ãè¿éçsizeå°±æ¯çæ£çå ç´ ä¸ªæ°ã private void isCapacityEnough(int size){ if (size > DEFAULT_CAPACITY){explicitCapacity(size);
} if (size < 0){ throw new OutOfMemoryError();
}
}
å¤ææ©å®¹çæ¹æ³ä¹å¾ç®åï¼å¤æéè¦æ©å®¹ç空é´æ¯ä¸æ¯æ¯é»è®¤ç空é´å¤§ãå¦æéè¦ç空é´æ¯é»è®¤ç空é´å¤§ï¼å°±è°ç¨explicitCapacityè¿è¡æ©å®¹ãè¿éæ个sizeå°äº0çå¤æï¼åºç°sizeå°äº0主è¦æ¯å 为å½sizeè¶ è¿Integer.MAX_VALUEå°±ä¼åæè´æ°ã private final static int MAX_ARRAY_LENGTH = Integer.MAX_VALUE - 8; private void explicitCapacity(int capacity){ int newLength = elementData.length * 2; if (newLength - capacity < 0){newLength = capacity;
} if (newLength > (MAX_ARRAY_LENGTH)){
newLength = (capacity > MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH);
}
elementData = Arrays.copyOf(elementData, newLength);
}
ä¸é¢ç代ç æ¯æ©å®¹ç代ç ï¼é¦å ï¼å®ä¹ä¸ä¸ªæ°ç»æ大ç容éç常é为æ大å¼ï¼è¿ä¸ªå¼æç §å®æ¹çæºç ä¸ç解éæ¯è¦æäºVMä¿çäºæ°ç»ç头é¨ä¿¡æ¯å¨æ°ç»ä¸ï¼å æ¤å®é åæ¾æ°æ®ç大å°å°±æ¯æ´æ°çæå¤§å¼ - 8ç¶å设å®ä¸ä¸ªè¦æ©å®¹çæ°ç»ç大å°ï¼è½ç¶ä¸é¢è¯´äºæä¸ä¸ªæ©å®¹ç©ºé´çå¼ size + 1 ï¼è¿ä¸ªæ¯å®é æ们æå°éè¦æ©å®¹ç大å°ãä½ä¸ºäºç»§ç»å¢å å ç´ ï¼èä¸é¢ç¹çæ©å®¹ï¼å æ¤ä¸æ¬¡æ§çç³è¯·å¤ä¸äºçæ©å®¹ç©ºé´ãè¿énewLength æç®ç³è¯·ä¸º æ°ç»é¿åº¦ç2åï¼ç¶åå»å¤æè¿ä¸ªé¿åº¦æ¯å¦æ»¡è¶³éè¦çæ©å®¹ç©ºé´çå¼ã å³æäºåç»ç两段代ç
if (newLength - capacity < 0){ newLength = capacity;} if (newLength > (MAX_ARRAY_LENGTH)){ newLength = (capacity > MAX_ARRAY_LENGTH ? Integer.MAX_VALUE : MAX_ARRAY_LENGTH);
}
å¦æ2åçé¿åº¦ä»ç¶ä¸æ»¡è¶³ï¼åç³è¯·å°éè¦çæ©å®¹é¿åº¦ãå¨æ们åªå¢å ä¸ä¸ªå ç´ çæ åµä¸ï¼è¿ä¸ªå¤ææ¯æ°¸è¿ä¸ä¼çæçï¼ä½æ¯å¦ææaddAllæ¹æ³ï¼åå¢å çå ç´ å¾å¤ï¼å°±è¦å¯¼è´ä¸æ¬¡ç³è¯·2åçé¿åº¦æ¯ä¸å¤çã第äºä¸ªå¤ææ¯å¤ænewLengthçé¿åº¦å¦æè¶ è¿ä¸é¢å®ä¹çæ°ç»æ大é¿åº¦åå¤æè¦éè¦çæ©å®¹ç©ºé´æ¯å¦å¤§äºæ°ç»æ大é¿åº¦ï¼å¦æ大äºånewLength为 MAX_VALUE ï¼å¦å为 MAX_ARRAY_LENGTHãæåï¼çæ£å®ç°æ°ç»æ©å®¹å°è®¾å®é¿åº¦çæ¹æ³å°±æ²¡ææäºï¼è°ç¨Arrays.copyOf(elementData, newLength)å¾å°ä¸ä¸ªæ©å®¹åçæ°ç»ã
addçå¦ä¸ä¸ªéè½½æ¹æ³ä¹å¾ç®åã
public void add(int index, E e) {//å¤ææ¯ä¸æ¯è¶ç
checkRangeForAdd(index);
//å¤æéä¸éè¦æ©å®¹
isCapacityEnough(size + 1);
//å°indexçå ç´ å以åçå ç´ åå移ä¸ä½
System.arraycopy(elementData,index,elementData,index + 1,size - index);
//å°indexä¸æ çå¼è®¾ä¸ºe
elementData[index] = e; size++;
}
private void checkRangeForAdd(int index){ //è¿éindex = sizeæ¯è¢«å 许çï¼å³æ¯æ头ï¼ä¸é´ï¼å°¾é¨æå ¥
if (index < 0 || index > size){ throw new IndexOutOfBoundsException("æå®çindexè¶ è¿çé");
}
}
è³æ¤ï¼ä¸ä¸ªç®åçaddæ¹æ³å°±å®ç°å®äºãgetæ¹æ³
getæ¹æ³ç¨æ¥å¾å°å®¹å¨ä¸æå®ä¸æ çå ç´ ãæ¹æ³å®ç°æ¯è¾ç®åï¼ç´æ¥è¿åæ°ç»ä¸æå®ä¸æ çå ç´ å³å¯ã
private void checkRange(int index) { if (index >= size || index < 0){throw new IndexOutOfBoundsException("æå®çindexè¶ è¿çé");
}
} public E get(int index){
checkRange(index); return (E)elementData[index];
}
indexOfæ¹æ³indexOfæ¹æ³ç¨æ¥å¾å°æå®å ç´ çä¸æ ãå®ç°èµ·æ¥æ¯è¾ç®åï¼éè¦å¤æä¼ å ¥çå ç´ ï¼ä»£ç å¦ä¸ï¼
public int indexOf(Object o){ if (o != null) { for (int i = 0 ; i < size ; i++){ if (elementData[i].equals(o)){ return i;}
}
}else { for (int i = 0 ; i < size ; i++){ if (elementData[i] == null) { return i;
}
}
} return -1;
}
å¤æä¼ å ¥çå ç´ æ¯å¦ä¸ºnullï¼å¦æ为nullï¼åä¾æ¬¡ä¸nullãå¦æä¸ä¸ºç©ºï¼åç¨equalsä¾æ¬¡æ¯è¾ãå¹é æåå°±è¿åä¸æ ï¼å¹é 失败就è¿å-1ãcontainsæ¹æ³
containsç¨æ¥å¤æ该容å¨ä¸æ¯å¦å å«æå®çå ç´ ãå¨æäºindexOfæ¹æ³çåºç¡ä¸ï¼containsçå®ç°å°±å¾ç®åäºã
public boolean contains(Object o){ return indexOf(o) >= 0;}
sizeæ¹æ³sizeæ¹æ³ç¨æ¥å¾å°å®¹å¨ç±»çå ç´ ä¸ªæ°ï¼å®ç°å¾ç®åï¼ç´æ¥è¿åsizeç大å°å³å¯ã
public int size(){ return size;}
isEmptyæ¹æ³isEmptyæ¹æ³ç¨æ¥å¤æ容å¨æ¯å¦ä¸ºç©ºï¼å¤æsizeæ¹æ³çè¿åå¼æ¯å¦ä¸º0å³å¯ã
public boolean isEmpty(){ return size() == 0;}
removeæ¹æ³removeæ¹æ³æ¯ç¨æ¥å¯¹å®¹å¨ç±»çå ç´ è¿è¡å é¤ï¼ä¸addä¸æ ·ï¼removeæ¹æ³ä¹æ两个éè½½æ¹æ³ï¼åå«æ¯
remove(Object o)åremove(int index)
public E remove(int index) {E value = get(index); int moveSize = size - index - 1; if (moveSize > 0){
System.arraycopy(elementData,index + 1, elementData,index,size - index - 1);
}
elementData[--size] = null; return value;
}
public boolean remove(Object o){ if (contains(o)){
remove(indexOf(o)); return true;
}else { return false;
}
}
第ä¸ä¸ªremoveæ¹æ³æ¯æ ¸å¿æ¹æ³ï¼é¦å å¾å°è¦å é¤çä¸æ å ç´ çå¼ï¼ç¶åå¤æindexåé¢çè¦å移çå ç´ ç个æ°ï¼å¦æ个æ°å¤§äºé¶ï¼åè°ç¨åºæ¹æ³ï¼å°indexåé¢çå ç´ åå移ä¸ä½ãæåelementData[--size] = null;缩åsize大å°ï¼å¹¶å°åæåä¸ä½ç½®ç©ºã第äºä¸ªremoveæ¹æ³ä¸éè¦å第ä¸ä¸ªæ¹æ³ä¸æ ·ï¼éè¦åè¯ä½¿ç¨è è¦å é¤çä¸æ 对åºçå ç´ ï¼åªéè¦å¤ææ¯å¦å é¤æåå³å¯ãå¦æè¦å é¤çå ç´ å¨å表ä¸ï¼åå é¤æåï¼å¦æä¸å¨å失败ãå æ¤è°ç¨containsæ¹æ³å°±å¯ä»¥å¤ææ¯å¦è¦å é¤çå ç´ å¨å表ä¸ãå¨åè°ç¨remove(int index),ä¸å¨åè¿å失败ã
Hadoop 的 Lists.newArrayList和正常的 new ArrayList()有什么区别?
这个方法在google工具类中也有,源码内容如下public static <E> ArrayList<E> newArrayList() {return new ArrayList();
}
内容是差不多的,唯一的好处就是可以少写泛型的部分。
这个方法有着丰富的重载:
Lists.newArrayList(E... elements)Lists.newArrayList(Iterable<? extends E> elements)
Lists.newArrayList(Iterator<? extends E> elements)
还有很多前缀扩展方法:
List<T> exactly = Lists.newArrayListWithCapacity();List<T> approx = Lists.newArrayListWithExpectedSize();
使得函数名变得更有可读性,一眼就看出方法的作用。
但是查看源码发现官方的注解里头是这么写的:
Creates a mutable, empty ArrayList instance (for Java 6 and earlier).
创建一个可变的空ArrayList(适用于java 6及之前的版本)
Note for Java 7 and later: this method is now unnecessary and should
be treated as deprecated. Instead, use the ArrayList constructor
directly, taking advantage of the new "diamond" syntax.
针对java 7及之后版本,本方法已不再有必要,应视之为过时的方法。取而代之你可以直接使用ArrayList的构造器,充分利用钻石运算符<>(可自动推断类型)。
Java ArrayList的使用
import java.util.*;
class Student { // 定义学生类
String name;
Student(String name) { // 构造方法
this.name = name;
}
// 重写equals方法,保证只要名字相等,则认为是同一个人.
public boolean equals(Object obj) {
if (name == null || obj == null) {
return false;
}
if (obj instanceof Student) {
Student sd = (Student) obj;
return name.equals(sd.name);
}
return false;
}
}
public class t2 {
public static void main(String[] args) {
Scanner reader = new Scanner(System.in);
Student[] stu = new Student[4];// 定义
ArrayList<Student> stus = new ArrayList<Student>();// ArrayList泛型,每个元素是1个学生。
System.out.println("输入4个学生姓名:");
// 初始化4个学生,并将他们添加进ArrayList
for (int i = 0; i < 4; i++) {
stu[i] = new Student(reader.nextLine());
stus.add(stu[i]);
}
System.out.println("列表中还有" + stus.size() + "个学生:");
for (int i = 0; i < stus.size(); i++) { // 遍历输出所有元素中学生的姓名
System.out.println("第" + i + "个学生: " + stus.get(i).name);
}
// 键盘输入一个学生姓名,判断该学生是否在列表中,如存在,则输出其在列表中的下标,然后将它从列表中移除。
System.out.println("输入要查找的人的姓名:");
Student s = new Student(reader.nextLine());
if (stus.contains(s)) {
System.out.println("找到" + s.name + ",下标为" + stus.indexOf(s));// 输出下标
stus.remove(s); // 从列表中移除该学生
System.out.println("删除" + s.name + "后,还有" + stus.size() + "个学生:");
for (int i = 0; i < stus.size(); i++) { // 遍历输出所有元素中学生的姓名
System.out.println("第" + i + "个学生: " + stus.get(i).name);
}
} else
System.out.println("列表中找不到" + s.name); // 如不存在则输出找不到。
}
}
效果
输入4个学生姓名:天涯
明月
秋水
清泉
列表中还有4个学生:
第0个学生: 天涯
第1个学生: 明月
第2个学生: 秋水
第3个学生: 清泉
输入要查找的人的姓名:
天涯
找到天涯,下标为0
删除天涯后,还有3个学生:
第0个学生: 明月
第1个学生: 秋水
第2个学生: 清泉