<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>集合 on 庞玉栋个人博客</title><link>https://pangyd.com/tags/%E9%9B%86%E5%90%88/</link><description>Recent content in 集合 on 庞玉栋个人博客</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Fri, 20 Oct 2017 20:21:19 +0800</lastBuildDate><atom:link href="https://pangyd.com/tags/%E9%9B%86%E5%90%88/index.xml" rel="self" type="application/rss+xml"/><item><title>Java集合面试问题和答案</title><link>https://pangyd.com/post/140-java/</link><pubDate>Fri, 20 Oct 2017 20:19:28 +0800</pubDate><guid>https://pangyd.com/post/140-java/</guid><description>&lt;p style="text-align: justify">&lt;span>1.Java集合框架是什么？说出一些集合框架的优点？&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;img class="" data-ratio="0.41541353383458646" data-src="https://pangyd.com/uploads/2017/10/74c10f869f038762.jpeg" data-type="jpeg" data-w="532" height="221" width="532" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>2.&lt;/span>&lt;span>集合框架中的泛型有什么优点？&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;img class="" data-ratio="0.3899782135076253" data-src="https://pangyd.com/uploads/2017/10/74c10f869f038762.jpeg" data-type="jpeg" data-w="459" height="179" width="459" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>3.Java集合框架的基础接口有哪些？&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;img class="" data-ratio="0.6123348017621145" data-src="https://pangyd.com/uploads/2017/10/74c10f869f038762.jpeg" data-type="jpeg" data-w="454" height="278" width="454" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/p>&lt;p style="text-align: justify">&lt;span>　&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>4.为何Collection不从Cloneable和Serializable接口继承？&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;img class="" data-ratio="0.6563876651982379" data-src="https://pangyd.com/uploads/2017/10/74c10f869f038762.jpeg" data-type="jpeg" data-w="454" height="298" width="454" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/p>&lt;p style="text-align: justify">&lt;span>&lt;br>&lt;/span>&lt;/p>&lt;p style="text-align: justify">&lt;span>5.为何Map接口不继承Collection接口？&lt;/span>&lt;/p>&lt;p style="text-align: center">&lt;img class="" data-ratio="0.3356009070294785" data-src="https://pangyd.com/uploads/2017/10/74c10f869f038762.jpeg" data-type="jpeg" data-w="441" height="148" width="441" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/p>&lt;p style="text-align: center">&lt;img class="" data-ratio="0.4796875" data-src="https://pangyd.com/uploads/2017/10/74c10f869f038762.jpeg" data-type="jpeg" data-w="640" height="378" width="787" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='480' height='120'%3E%3Crect width='480' height='120' fill='%230E1012' stroke='%231B1E22'/%3E%3Ctext x='240' y='66' fill='%235C6069' font-family='monospace' font-size='13' text-anchor='middle'%3E%5B%E5%8E%9F%E5%9B%BE%E5%B7%B2%E5%A4%B1%E6%95%88%5D%3C/text%3E%3C/svg%3E" data-fail="0">&lt;/p></description></item><item><title>Java集合类</title><link>https://pangyd.com/post/96-java/</link><pubDate>Fri, 08 Sep 2017 21:07:49 +0800</pubDate><guid>https://pangyd.com/post/96-java/</guid><description>&lt;p>看了一些所谓大&lt;a target="_self" href="https://pangyd.com/contribute/">公司&lt;/a>的JAVA面试问题，发现对于JAVA集合类的使用都比较看重似的，而自己在这方面还真的是所真甚少，抽空也学习学习吧。&lt;/p>&lt;p>&lt;/p>&lt;p>java.util包中包含了一系列重要的集合类，而对于集合类，主要需要掌握的就是它的内部结构，以及遍历集合的迭代模式。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>接口：Collection&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Collection是最基本的集合接口，一个Collection代表一组Object，即Collection的元素（Elements）。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类，Java SDK提供的类都是继承自Collection的“子接口”如List和Set。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>所有实现Collection接口的类都必须提供两个标准的构造函数：无参数的构造函数用于创建一个空的Collection，有一个Collection参数的构造函数用于创建一个新的Collection，这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>主要的一个接口方法：boolean add(Ojbect c)&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>虽然返回的是boolean，但不是表示添加成功与否，这个返回值表示的意义是add()执行后，集合的内容是否改变了（就是元素的数量、位置等有无变化）。类似的addAll，remove，removeAll，remainAll也是一样的。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>用Iterator模式实现遍历集合&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>Collection有一个重要的方法：iterator()，返回一个Iterator（迭代器），用于遍历集合的所有元素。Iterator模式可以把访问逻辑从不同的集合类中抽象出来，从而避免向客户端暴露集合的内部结构。典型的用法如下：&lt;/p>&lt;blockquote>&lt;p>Iterator it = collection.iterator(); // 获得一个迭代器&lt;/p>&lt;p>while(it.hasNext()) {&lt;/p>&lt;p>Object obj = it.next(); // 得到下一个元素&lt;/p>&lt;p>}&lt;/p>&lt;/blockquote>&lt;p>不需要维护遍历集合的“指针”，所有的内部状态都由Iterator来维护，而这个Iterator由集合类通过工厂方法生成。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>每一种集合类返回的Iterator具体类型可能不同，但它们都实现了Iterator接口，因此，我们不需要关心到底是哪种Iterator，它只需要获得这个Iterator接口即可，这就是接口的好处，面向对象的威力。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>要确保遍历过程顺利完成，必须保证遍历过程中不更改集合的内容（Iterator的remove()方法除外），所以，确保遍历可靠的原则是：只在一个线程中使用这个集合，或者在多线程中对遍历代码进行同步。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>由Collection接口派生的两个接口是List和Set。 　&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>List接口&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>List是有序的Collection，使用此接口能够精确的控制每个元素插入的&lt;a target="_self" href="https://pangyd.com/contribute/">位置&lt;/a>。用户能够使用索引（元素在List中的位置，类似于数组下标）来访问List中的元素，这类似于Java的数组。和下面要提到的Set不同，List允许有相同的元素。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>除了具有Collection接口必备的iterator()方法外，List还提供一个listIterator()方法，返回一个ListIterator接口，和标准的Iterator接口相比，ListIterator多了一些add()之类的方法，允许添加，删除，设定元素，还能向前或向后遍历。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>实现List接口的常用类有LinkedList，ArrayList，Vector和Stack。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>LinkedList类&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>LinkedList实现了List接口，允许null元素。此外LinkedList提供额外的get，remove，insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈（stack），队列（queue）或双向队列（deque）。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>注意LinkedList没有同步方法。如果多个线程同时访问一个List，则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List：List list = Collections.synchronizedList(new LinkedList(...));&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>&lt;span>&lt;span>ArrayList类&lt;/span>&lt;/span>&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>ArrayList实现了可变大小的数组。它允许所有元素，包括null。ArrayList没有同步。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>size，isEmpty，get，set方法运行时间为常数。但是add方法开销为分摊的常数，添加n个元素需要O(n)的时间。其他的方法运行时间为线性。&lt;/p>&lt;p>每个ArrayList实例都有一个容量（Capacity），即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加，但是增长算法并没有定义。当需要插入大量元素时，在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。&lt;/p>&lt;p>&lt;br>&lt;/p>&lt;p>和LinkedList一样，ArrayList也是非同步的（unsynchronized）。&lt;/p>&lt;p>&lt;br>&lt;/p></description></item></channel></rss>