佛山营销网站建设推广,htm网站的维护,怎样建立一个主题网站,建设网站查证书文章目录01. 迭代器 Iterator 是什么#xff1f;02. 迭代器 Iterator 有什么特点#xff1f;03. 迭代器 Iterator 怎么使用#xff1f;04. 如何边遍历边移除 Collection 中的元素#xff1f;05. Iterator 和 ListIterator 有什么区别#xff1f;06. 数组和集合的区别…
文章目录01. 迭代器 Iterator 是什么02. 迭代器 Iterator 有什么特点03. 迭代器 Iterator 怎么使用04. 如何边遍历边移除 Collection 中的元素05. Iterator 和 ListIterator 有什么区别06. 数组和集合的区别07. 常见集合类的继承体系08. 常见集合类的特点09. 常见集合类的底层数据结构10. Collection 和 Collections 有什么区别11. List、Set、Map 之间的区别是什么12. 怎么确保一个集合不能被修改?13. ArrayList 和 Vector 的区别14. ArrayList 和 LinkedList 的区别15. ArrayListLinkedListVector的使用场景16. Array 和 ArrayList 有何区别17. 如何实现数组和 List 之间的转换01. 迭代器 Iterator 是什么
Iterator则主要用于遍历Collection集合中的元素Iterator对象也被称为迭代器。
02. 迭代器 Iterator 有什么特点
Iterator 迭代器的特点是更加安全它可以保证当使用Iterator迭代访问Collection集合元素时Collection集合里的元素不能被改变只有通过Iterator的remove方法删除上一次next方法返回的集合元素才可以否则将会引发java.util.Concurrent ModificationException异常。
Iterator迭代器采用的是快速失败fail-fast机制一旦在迭代过程中检测到该集合已经被修改通常是程序中的其他线程修改程序立即引发ConcurrentModificationException异常这样可以避免共享资源而引发的潜在问题。
03. 迭代器 Iterator 怎么使用
Iterator接口隐藏了各种Collection实现类的底层细节向应用程序提供了遍历Collection集合元素的统一编程接口。
使用iterator()方法要求容器返回一个Iterator 对象
(1) 当创建指向集合的 Iterator 对象后指针指向第一个元素的上方即指向一个空
(2) 调用 hasNext() 方法判断集合中是否还有元素
(3) 调用 next() 方法向下移动指针并返回指针指向的元素如果指针指向的内存中没有元素会报异常
(4) 调用 remove() 方法一般和next()方法一起用用来删除next()方法返回的元素
04. 如何边遍历边移除 Collection 中的元素
① 《阿里巴巴编码规范》中的一条不要在foreach循环里进行元素的remove/add操作使用foreach循环进行删除则会抛出ConcurrentModificationException异常。
public class Main {public static void main(String[] args) {DepartmentMemberInput departmentMemberInput1 new DepartmentMemberInput(张三,18767880909);DepartmentMemberInput departmentMemberInput2 new DepartmentMemberInput(张四,18767880910);ListDepartmentMemberInput list1 new ArrayList();list1.add(departmentMemberInput1);list1.add(departmentMemberInput2);for (DepartmentMemberInput departmentMemberInput : list1) {if(departmentMemberInput.getName().equals(张三)){list1.remove(departmentMemberInput);}}}
}执行结果 ② 不要在 iterator 遍历的过程中使用 list.remove() 方法
public class Main {public static void main(String[] args) {DepartmentMemberInput departmentMemberInput1 new DepartmentMemberInput(张三,18767880909);DepartmentMemberInput departmentMemberInput2 new DepartmentMemberInput(张四,18767880910);ListDepartmentMemberInput list1 new ArrayList();list1.add(departmentMemberInput1);list1.add(departmentMemberInput2);for (Iterator iterator list1.iterator(); iterator.hasNext();) {DepartmentMemberInput departmentMemberInput (DepartmentMemberInput) iterator.next();if(departmentMemberInput.getName().equals(张三)){// 使用Iterator迭代过程中不可修改集合元素下面代码引发异常list1.remove(departmentMemberInput);}}}
}public class IteratorErrorTest
{public static void main(String[] args){// 创建一个集合Collection booksnew HashSet();books.add(轻量级Java EE企业应用实战);books.add(Java讲义);// 获取books集合对应的迭代器Iterator itbooks.iterator();while(it.hasNext()){String book(String)it.next();System.out.println(book);if (book.equals(疯狂Android讲义)){//使用Iterator迭代过程中不可修改集合元素下面代码引发异常books.remove(book);}}}
}执行结果 ③ 推荐在 iterator 遍历的过程中使用iterator.remove() 方法
public class Main {public static void main(String[] args) {DepartmentMemberInput departmentMemberInput1 new DepartmentMemberInput(张三,18767880909);DepartmentMemberInput departmentMemberInput2 new DepartmentMemberInput(张四,18767880910);ListDepartmentMemberInput list1 new ArrayList();list1.add(departmentMemberInput1);list1.add(departmentMemberInput2);for (Iterator iterator list1.iterator(); iterator.hasNext();) {DepartmentMemberInput departmentMemberInput (DepartmentMemberInput) iterator.next();if(departmentMemberInput.getName().equals(张三)){iterator.remove();}}}
}05. Iterator 和 ListIterator 有什么区别
(1) Iterator可用来遍历Set和List集合但是ListIterator只能用来遍历List。
(2) Iterator对集合只能是前向遍历ListIterator既可以前向也可以后向。
(3) ListIterator实现了Iterator接口并包含其他的功能比如增加元素替换元素获取前一个和后一个元素的索引等等。
06. 数组和集合的区别
数组元素既可以是基本类型的值也可以是对象实际上保存的是对象的引用变量而集合里只能保存对象实际上只是保存对象的引用变量但通常习惯上认为集合里保存的是对象。
07. 常见集合类的继承体系
Java的集合类主要由两个接口派生而出Collection和MapCollection和Map是Java集合框架的根接口这两个接口又包含了一些子接口或实现类。 Set和List接口是Collection接口派生的两个子接口它们分别代表了无序集合和有序集合Queue是Java提供的队列实现有点类似于List。 08. 常见集合类的特点 09. 常见集合类的底层数据结构
集合实现类集合底层数据结构是否线程安全ArrayList数组非线程安全LinkedList双向链表非线程安全Vector数组线程安全效率较低使用少HashSetHashMap非线程安全TreeSetTreeMap非线程安全HashMap哈希表非线程安全HashTable哈希表线程安全所有的方法都有synchronized关键字效率较低使用少PropertiesHashMap线程安全key和value只能存储String字符串TreeMap红黑树非线程安全
10. Collection 和 Collections 有什么区别
Collection接口是List、Set和Queue接口的父接口该接口里定义的方法既可用于操作Set集合也可用于操作List和Queue集合。
Collections是一个操作Set、List和Map等集合的工具类该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作还提供了将集合对象设置为不可变、对集合对象实现同步控制等方法。
常用集合框架中的实现类HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap和TreeMap都是线程不安全的。如果有多个线程访问它们而且有超过一个的线程试图修改它们则可能出现错误。Collections提供了多个synchronizedXxx()方法可以把它们包装成线程同步的集合。
public class SynchronizedTest{public static void main(String[] args){//下面程序创建了4个同步的集合对象Collection cCollections.synchronizedCollection(new ArrayList());List listCollections.synchronizedList(new ArrayList());Set sCollections.synchronizedSet(new HashSet());Map mCollections.synchronizedMap(new HashMap());}
}11. List、Set、Map 之间的区别是什么
List一个有序元素存入集合的顺序和取出的顺序一致容器元素可以重复可以插入多个null元素元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector
Set一个无序存入和取出顺序有可能不一致容器不可以存储重复元素只允许存入一个null元素必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及 TreeSet
Map是一个键值对集合存储键、值和之间的映射。 Key无序唯一value 不要求有序允许重复。Map 的常用实现类HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap 12. 怎么确保一个集合不能被修改?
Collections提供了如下三类方法来返回一个不可变的集合
(1) emptyXxx()返回一个空的、不可变的集合对象此处的集合可以是ListSetMap。
(2) singletonXxx()返回一个只包含指定对象只有一个或一项元素的、不可变的集合对象此处的集合可以是ListSetMap。
(3) unmodifiableXxx返回指定集合对象的不可变视图此处的集合可以是ListSetMap。
上面三类方法的参数是原有的集合对象返回值是该集合的“只读”版本。通过Collections提供的三类方法可以生成“只读”的Collection或Map。
public class UnmodifiableTest{public static void main(String[] args){// 创建一个空的、不可改变的List对象List unmodifiableListCollections.emptyList();// 创建一个只有一个元素且不可改变的Set对象Set unmodifiableSetCollections.singleton(Java讲义);// 创建一个普通的Map对象Map scoresnew HashMap();scores.put(语文 , 80);scores.put(Java , 82);//返回普通的Map对象对应的不可变版本Map unmodifiableMapCollections.unmodifiableMap(scores);// 下面任意一行代码都将引发UnsupportedOperationException异常unmodifiableList.add(测试元素); //①unmodifiableSet.add(测试元素); //②unmodifiableMap.put(语文 , 90); //③}
}13. ArrayList 和 Vector 的区别
ArrayList 和 Vector 均是 List 有序集合接口的实现类都提供按照位置进行定位、添加或者删除的操作。
ArrayList是线程不安全的当多个线程访问同一个ArrayList集合时如果有超过一个线程修改了ArrayList集合则程序必须手动保证该集合的同步性但Vector集合则是线程安全的无须程序保证该集合的同步性。因为Vector是线程安全的所以Vector的性能比ArrayList的性能要低。实际上即使需要保证List集合线程安全也同样不推荐使用Vector实现类。可以使用Collections工具类提供的 List list Collections.synchronizedList(new LinkedList());
14. ArrayList 和 LinkedList 的区别
LinkedList与ArrayList、ArrayDeque的实现机制完全不同ArrayList、ArrayDeque内部以动态数组的形式来保存集合中的元素因此随机访问集合元素时有较好的性能LinkedList内部以链表的形式来保存集合中的元素因此随机访问集合元素时性能较差但在插入、删除元素时性能非常出色只需改变指针所指的地址即可。需要指出的是虽然Vector也是以数组的形式来存储集合元素的但因为它实现了线程同步功能所以各方面性能都有所下降。除此之外LinkedList还实现了Deque接口因此它可以被当成双端队列来使用自然也可以被当成“栈”来使用了。
15. ArrayListLinkedListVector的使用场景
如果需要遍历List集合元素对于ArrayList、Vector集合应该使用随机访问方法get来遍历集合元素这样性能更好对于LinkedList集合则应该采用迭代器Iterator来遍历集合元素。
如果需要经常执行插入、删除操作来改变List集合的大小则应该使用LinkedList集合而不是ArrayList。使用ArrayList、Vector集合需要经常重新分配内部数组的大小其时间开销常常是使用LinkedList的时间开销的几十倍效果很差。
如果有多个线程需要同时访问List集合中的元素可考虑使用Collections将集合包装成线程安全的集合。
16. Array 和 ArrayList 有何区别
(1) Array可以包含基本类型和对象类型ArrayList只能包含对象类型。
(2) Array大小是固定的定义后就不可被改变ArrayList的大小是可变的。
(3) ArrayList提供了更多的方法和特性比如addAll()removeAll()iterator()等 。
17. 如何实现数组和 List 之间的转换
(1) List转为数组
直接调用ArrayList中的toArray方法就可以实现List接口中toArray有两个重载的方法
Object[] toArray();
T T[] toArray(T[] a);可见toArray可以用无入参的方式调用返回一个Object数组也可以用指定返回类型的方式调用返回一个指定类型的数组。
Test
public void test() {ListObject rawList new ArrayList();rawList.add(0);rawList.add(1);String[] arr rawList.toArray(new String[rawList.size()]);for(String each:arr) {System.out.println(each);}
}(2) 数组转换为 List
如果需要将数组转为List只需要使用Arrays.asList方法即可。
Test
public void t5() {String[] arr {a,b,c};ListString list Arrays.asList(arr);list.forEach(x - System.out.println(x));
}