当前位置: 首页 > news >正文

众筹网站建设 网站定制开发韩国虚拟空间网站

众筹网站建设 网站定制开发,韩国虚拟空间网站,福州网站建设优质服务商,西安模板建网站什么是集合 集合就是一个放数据的容器#xff0c;准确的说是放数据对象引用的容器 集合类存放的都是对象的引用#xff0c;而不是对象的本身 集合类型主要有3种#xff1a;set(集#xff09;、list(列表#xff09;和map(映射)。 集合的特点 集合的特点主要有如下两点准确的说是放数据对象引用的容器 集合类存放的都是对象的引用而不是对象的本身 集合类型主要有3种set(集、list(列表和map(映射)。 集合的特点 集合的特点主要有如下两点 集合用于存储对象的容器对象是用来封装数据对象多了也需要存储集中式管理。 和数组对比对象的大小不确定。因为集合是可变长度的。数组需要提前定义大小 集合和数组的区别 数组是固定长度的集合可变长度的。 数组可以存储基本数据类型也可以存储引用数据类型集合只能存储引用数据类型。 数组存储的元素必须是同一个数据类型集合存储的对象可以是不同数据类型。 使用集合框架的好处 容量自增长 提供了高性能的数据结构和算法使编码更轻松提高了程序速度和质量 可以方便地扩展或改写集合提高代码复用性和可操作性。 通过使用JDK自带的集合类可以降低代码维护和学习新API成本。 常用的集合类有哪些 Map接口和Collection接口是所有集合框架的父接口 Collection接口的子接口包括Set接口和List接口 Map接口的实现类主要有HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有HashSet、TreeSet、LinkedHashSet等 List接口的实现类主要有ArrayList、LinkedList、Stack以及Vector等 ListSetMap三者的区别 Java 容器分为 Collection 和 Map 两大类Collection集合的子接口有Set、List、Queue三种子接口。我们比较常用的是Set、ListMap接口不是collection的子接口。 Collection集合主要有List和Set两大接口 List一个有序元素存入集合的顺序和取出的顺序一致容器元素可以重复可以插入多个null元素元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。 Set一个无序存入和取出顺序有可能不一致容器不可以存储重复元素只允许存入一个null元素必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及TreeSet。 Map是一个键值对集合存储键、值和之间的映射。 Key无序唯一value 不要求有序允许重复。Map没有继承于Collection接口从Map集合中检索元素时只要给出键对象就会返回对应的值对象。 Map 的常用实现类HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap 集合框架底层数据结构 Collection List Arraylist Object数组Vector Object数组LinkedList 双向循环链表 SetHashSet无序唯一基于 HashMap 实现的底层采用 HashMap 来保存元素LinkedHashSet LinkedHashSet 继承与 HashSet并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样不过还是有一点点区别的。TreeSet有序唯一 红黑树(自平衡的排序二叉树。) Map HashMap JDK1.8之前HashMap由数组链表组成的数组是HashMap的主体链表则是主要为了解决哈希冲突而存在的“拉链法”解决冲突.JDK1.8以后在解决哈希冲突时有了较大的变化当链表长度大于阈值默认为8时将链表转化为红黑树以减少搜索时间。 LinkedHashMapLinkedHashMap 继承自 HashMap所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外LinkedHashMap 在上面结构的基础上增加了一条双向链表使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作实现了访问顺序相关逻辑。 HashTable 数组链表组成的数组是 HashMap 的主体链表则是主要为了解决哈希冲突而存在的 TreeMap 红黑树自平衡的排序二叉树 哪些集合类是线程安全的 Vector就比Arraylist多了个 synchronized 线程安全因为效率较低现在已经不太建议使用。 hashTable就比hashMap多了个synchronized (线程安全)不建议使用。 ConcurrentHashMap是Java5中支持高并发、高吞吐量的线程安全HashMap实现。它由Segment数组结构和HashEntry数组结构组成。Segment数组在ConcurrentHashMap里扮演锁的角色HashEntry则用于存储键-值对数据。一个ConcurrentHashMap里包含一个Segment数组Segment的结构和HashMap类似是一种数组和链表结构一个Segment里包含一个HashEntry数组每个HashEntry是一个链表结构的元素每个Segment守护着一个HashEntry数组里的元素当对HashEntry数组的数据进行修改时必须首先获得它对应的Segment锁。推荐使用 Stack栈也是线程安全的继承于Vector。 线性不安全的 Hashmap Arraylist LinkedList HashSet TreeSet TreeMap Java集合的快速失败机制 “fail-fast” 是java集合的一种错误检测机制当多个线程对集合进行结构上的改变的操作时有可能会产生fail-fast 机制。 例如假设存在两个线程线程1、线程2线程1通过Iterator在遍历集合A中的元素在某个时候线程2修改了集合A的结构是结构上面的修改而不是简单的修改集合元素的内容那么这个时候程序就会抛出 ConcurrentModificationException 异常从而产生fail-fast机制。 原因迭代器在遍历时直接访问集合中的内容并且在遍历过程中使用一个 modCount 变量。集合在被遍历期间如果内容发生变化就会改变modCount的值。每当迭代器使用hashNext()/next()遍历下一个元素之前都会检测modCount变量是否为expectedmodCount值是的话就返回遍历否则抛出异常终止遍历。 解决办法 在遍历过程中所有涉及到改变modCount值得地方全部加上synchronized。 使用CopyOnWriteArrayList来替换ArrayList 怎么确保一个集合不能被修改 可以使用 Collections. unmodifiableCollection(Collection c) 方法来创建一个只读集合这样改变集合的任何操作都会抛出 Java. lang.UnsupportedOperationException 异常。 示例代码如下 ListString list new ArrayList(); list. add(x); CollectionString clist Collections. unmodifiableCollection(list); clist. add(y); // 运行时此行报错 System. out. println(list. size());迭代器 Iterator 是什么 Iterator 接口提供遍历任何 Collection 的接口。我们可以从一个 Collection 中使用迭代器方法来获取迭代器实例。迭代器取代了 Java 集合框架中的 Enumeration迭代器允许调用者在迭代过程中移除元素。 因为所有Collection接继承了Iterator迭代器 public interface CollectionE extends IterableE{// Query Operations }Iterator 怎么使用有什么特点 Iterator 使用代码如下 ListString list new ArrayList();IteratorString it list. iterator();while(it. hasNext()){String obj it. next();System. out. println(obj);}Iterator 的特点是只能单向遍历但是更加安全因为它可以确保在当前遍历的集合元素被更改的时候就会抛出 ConcurrentModificationException 异常。 如何边遍历边移除 Collection 中的元素 边遍历边修改 Collection 的唯一正确方式是使用 Iterator.remove() 方法如下 IteratorInteger it list.iterator();while(it.hasNext()){*// do something*it.remove();}一种最常见的错误代码如下 for(Integer i : list){list.remove(i)}运行以上错误代码会报 ConcurrentModificationException 异常。这是因为当使用 foreach(for(Integer i : list)) 语句时会自动生成一个iterator 来遍历该 list但同时该 list 正在被Iterator.remove() 修改。Java 一般不允许一个线程在遍历 Collection 时另一个线程修改它。 Iterator 和 ListIterator 有什么区别 Iterator 可以遍历 Set 和 List 集合而 ListIterator 只能遍历 List。 Iterator 只能单向遍历而 ListIterator 可以双向遍历向前/后遍历。 ListIterator 实现 Iterator 接口然后添加了一些额外的功能比如添加一个元素、替换一个元 素、获取前面或后面元素的索引位置。 遍历一个 List 有哪些不同的方式每种方法的实现原理是什么Java 中 List遍历的最佳实践是什么 遍历方式有以下几种 for 循环遍历基于计数器。在集合外部维护一个计数器然后依次读取每一个位置的元素当读取到最后一个元素后停止。 迭代器遍历Iterator。Iterator 是面向对象的一个设计模式目的是屏蔽不同数据集合的特点统一遍历集合的接口。Java 在 Collections 中支持了 Iterator 模式。 foreach 循环遍历。foreach 内部也是采用了 Iterator 的方式实现使用时不需要显式声明Iterator 或计数器。优点是代码简洁不易出错缺点是只能做简单的遍历不能在遍历过程中操作数据集合例如删除、替换。 最佳实践Java Collections 框架中提供了一个 RandomAccess 接口用来标记 List 实现是否支持 Random Access。 如果一个数据集合实现了该接口就意味着它支持 Random Access按位置读取元素的平均时间复杂度为 O(1)如ArrayList。 如果没有实现该接口表示不支持 Random Access如LinkedList。 推荐的做法就是支持 Random Access 的列表可用 for 循环遍历否则建议用 Iterator 或foreach 遍历。 说一下 ArrayList 的优缺点 ArrayList的优点如下 ArrayList 底层以数组实现是一种随机访问模式。ArrayList 实现了 andomAccess 接口因此查找的时候非常快。 ArrayList 在顺序添加一个元素的时候非常方便。 ArrayList 的缺点如下 删除元素的时候需要做一次元素复制操作。如果要复制的元素很多那么就会比较耗费性能。 插入元素的时候也需要做一次元素复制操作缺点同上。 ArrayList 比较适合顺序添加、随机访问的场景。 如何实现数组和 List 之间的转换 数组转 List使用 Arrays. asList(array) 进行转换。 List 转数组使用 List 自带的 toArray() 方法。 代码示例// list to arrayListString list new ArrayListString();list.add(123);list.add(456);list.toArray();// array to listString[] array new String[]{123,456};Arrays.asList(array);ArrayList 和 LinkedList 的区别是什么 数据结构实现ArrayList 是动态数组的数据结构实现而 LinkedList 是双向链表的数据结构实现。 随机访问效率ArrayList 比 LinkedList 在随机访问的时候效率要高因为LinkedList 是线性的数据存储方式所以需要移动指针从前往后依次查找。 增加和删除效率在非首尾的增加和删除操作LinkedList 要比 ArrayList 效率要高因为ArrayList 增删操作要影响数组内的其他数据的下标。 内存空间占用LinkedList 比 ArrayList 更占内存因为 LinkedList 的节点除了存储数据还存储了两个引用一个指向前一个元素一个指向后一个元素。 线程安全ArrayList 和 LinkedList 都是不同步的也就是不保证线程安全 综合来说在需要频繁读取集合中的元素时更推荐使用 ArrayList而在插入和删除操作较多时更推荐使用 LinkedList。 LinkedList 的双向链表也叫双链表是链表的一种它的每个数据结点中都有两个指针分别指向直接后继和直接前驱。所以从双向链表中的任意一个结点开始都可以很方便地访问它的前驱结点和后继结点。 ArrayList 和 Vector 的区别是什么 这两个类都实现了 List 接口List 接口继承了 Collection 接口他们都是有序集合. 线程安全Vector 使用了 Synchronized 来实现线程同步是线程安全的而 ArrayList 是非线程安全的。 性能ArrayList 在性能方面要优于 Vector。 扩容ArrayList 和 Vector 都会根据实际的需要动态的调整容量只不过在 Vector 扩容每次会增加 1 倍而 ArrayList 只会增加 50%。 Vector类的所有方法都是同步的。可以由两个线程安全地访问一个Vector对象、但是一个线程访问Vector的话代码要在同步操作上耗费大量的时间。 Arraylist不是同步的所以在不需要保证线程安全时时建议使用Arraylist。 备注对于 VectorArrayList、HashtableHashMap要记住线程安全的问题记住 Vector 与 Hashtable 是旧的是 java 一诞生就提供了的它们是线程安全的ArrayList 与 HashMap 是 java2 时才提供的它们是线程不安全的。 插入数据时ArrayList、LinkedList、Vector谁速度较快阐述ArrayList、Vector、LinkedList 的存储性能和特性 ArrayList和Vector 底层的实现都是使用数组方式存储数据。数组元素数大于实际存储的数据以便增加和插入元素它们都允许直接按序号索引元素但是插入元素要涉及数组元素移动等内存操作所以索引数据快而插入数据慢。 Vector 中的方法由于加了 synchronized 修饰因此 Vector 是线程安全容器但性能上较ArrayList差。 LinkedList 使用双向链表实现存储按序号索引数据需要进行前向或后向遍历但插入数据时只需要记录当前项的前后项即可所以 LinkedList 插入速度较快。 多线程场景下如何使用 ArrayList ArrayList 不是线程安全的如果遇到多线程场景可以通过 Collections 的 synchronizedList 方法将其转换成线程安全的容器后再使用。例如像下面这样 ListString synchronizedList Collections.synchronizedList(list);synchronizedList.add(aaa);synchronizedList.add(bbb);for (int i 0; i synchronizedList.size(); i) {System.out.println(synchronizedList.get(i));}为什么 ArrayList 的 elementData 加上 transient 修饰 ArrayList 中的数组定义如下 private transient Object[] elementData; 再看一下 ArrayList 的定义 public class ArrayListE extends AbstractListE implements ListE, RandomAccess, Cloneable, java.io.Serializable可以看到 ArrayList 实现了 Serializable 接口这意味着 ArrayList 支持序列化。transient 的作用是说不希望 elementData 数组被序列化重写了 writeObject 实现 private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException{// Write out element count, and any hidden stuffint expectedModCount modCount;s.defaultWriteObject();// Write out array lengths.writeInt(elementData.length);// Write out all elements in the proper order.for (int i0; isize; i)s.writeObject(elementData[i]);if (modCount ! expectedModCount) {throw new ConcurrentModificationException(); }每次序列化时先调用 defaultWriteObject() 方法序列化 ArrayList 中的非 transient 元素然后遍历 elementData只序列化已存入的元素这样既加快了序列化的速度又减小了序列化之后的文件大小。 List 和 Set 的区别 List , Set 都是继承自Collection 接口 List 特点一个有序元素存入集合的顺序和取出的顺序一致容器元素可以重复可以插入多个null元素元素都有索引。常用的实现类有 ArrayList、LinkedList 和 Vector。 Set 特点一个无序存入和取出顺序有可能不一致容器不可以存储重复元素只允许存入一个null元素必须保证元素唯一性。Set 接口常用实现类是 HashSet、LinkedHashSet 以及TreeSet。 另外 List 支持for循环也就是通过下标来遍历也可以用迭代器但是set只能用迭代因为他无序无法用下标来取得想要的值。 Set和List对比 Set检索元素效率低下删除和插入效率高插入和删除不会引起元素位置改变。 List和数组类似List可以动态增长查找元素效率高插入删除元素效率低因为会引起其他元素位置改变Set接口 说一下 HashSet 的实现原理 HashSet 是基于 HashMap 实现的HashSet的值存放于HashMap的key上HashMap的value统一为present因此 HashSet 的实现比较简单相关 HashSet 的操作基本上都是直接调用底层HashMap 的相关方法来完成HashSet 不允许重复的值。 HashSet如何检查重复HashSet是如何保证数据不可重复的 向HashSet 中add ()元素时判断元素是否存在的依据不仅要比较hash值同时还要结合equles 方法比较。 HashSet 中的add ()方法会使用HashMap 的put()方法。 HashMap 的 key 是唯一的由源码可以看出 HashSet 添加进去的值就是作为HashMap 的key并且在HashMap中如果K/V相同时会用新的V覆盖掉旧的V然后返回旧的V。所以不会重复HashMap 比较key是否相等是先比较hashcode 再比较equals 。 以下是HashSet 部分源码 private static final Object PRESENT new Object();private transient HashMapE,Object map;public HashSet() {map new HashMap();}public boolean add(E e) {// 调用HashMap的put方法,PRESENT是一个至始至终都相同的虚值return map.put(e, PRESENT)null;}Set 里的元素是不能重复的那么用什么方法来区分重复与否呢是用 还是equals()它们有何区别 Set 里的元素是不能重复的那么用 iterator() 方法来区分重复与否。 equals() 是判读两个 Set 是否相等 equals() 和 方法决定引用值是否指向同一对象 equals() 在类中被覆盖为的是当两个分离的对象的内容和类型相配的话返回真值. HashSet与HashMap的区别 HashMap HashSet 实现了Map接口 实现Set接口 存储键值对 仅存储对象 调用put向map中添加元素 调用add方法向Set中添加元素 HashMap使用键Key计算Hashcode HashSet使用成员对象来计算hashcode值对于两个对象来说hashcode可能相同所以equals()方法用来判断对象的相等性如果两个对象不同的话那么返回false HashMap相对于HashSet较快因为它是使用唯一的键获取对象 HashSet较HashMap来说比较慢 什么是TreeMap 简介 TreeMap 是一个有序的key-value集合它是通过红黑树实现的。 TreeMap基于红黑树Red-Black tree实现。该映射根据其键的自然顺序进行排序或者根据创建映射时提供的 Comparator 进行排序具体取决于使用的构造方法。TreeMap是线程非同步的。 如何决定使用 HashMap 还是 TreeMap 对于在Map中插入、删除和定位元素这类操作HashMap是最好的选择。然而假如你需要对一 个有序的key集合进行遍历TreeMap是更好的选择。基于你的collection的大小也许向 HashMap中添加元素会更快将map换为TreeMap进行有序key的遍历。 Array 和 ArrayList 有何区别 Array 可以存储基本数据类型和对象ArrayList 只能存储对象。 Array 是指定固定大小的而 ArrayList 大小是自动扩展的。 Array 内置方法没有 ArrayList 多比如 addAll、removeAll、iteration 等方法只有 ArrayList有。 对于基本类型数据集合使用自动装箱来减少编码工作量。但是当处理固定大小的基本数据类型的时候这种方式相对比较慢。 如何实现 Array 和 List 之间的转换 Array 转 List Arrays. asList(array) List 转 ArrayList 的 toArray() 方法。 comparable 和 comparator的区别 comparable接口实际上是出自java.lang包它有一个 compareTo(Object obj)方法用来排序 comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序 一般我们需要对一个集合使用自定义排序时我们就要重写compareTo方法或compare方法当我们需要对某一个集合实现两种排序方式比如一个song对象中的歌名和歌手名分别采用一种排序方法的话我们可以重写compareTo方法和使用自制的Comparator方法或者以两个Comparator来实现歌名排序和歌星名排序第二种代表我们只能使用两个参数版的Collections.sort(). Collection 和 Collections 有什么区别 java.util.Collection 是一个集合接口集合类的一个顶级接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式其直接继承接口有List与Set。 Collections则是集合类的一个工具类/帮助类其中提供了一系列静态方法用于对集合中元素进行排序、搜索以及线程安全等各种操作。 TreeMap 和 TreeSet 在排序时如何比较元素Collections 工具类中的 sort()方法如何比较元素 TreeSet 要求存放的对象所属的类必须实现 Comparable 接口该接口提供了比较元素的compareTo()方法当插入元素时会回调该方法比较元素的大小。TreeMap 要求存放的键值对映射的键必须实现 Comparable 接口从而根据键对元素进 行排 序。 Collections 工具类的 sort 方法有两种重载的形式 第一种要求传入的待排序容器中存放的对象比较实现 Comparable 接口以实现元素的比较 comparable接口实际上是出自java.lang包它有一个 compareTo(Object obj)方法用来排序 comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序 一般我们需要对一个集合使用自定义排序时我们就要重写compareTo方法或compare方法当我们需要对某一个集合实现两种排序方式比如一个song对象中的歌名和歌手名分别采用一种排序方法的话我们可以重写compareTo方法和使用自制的Comparator方法或者以两个Comparator来实现歌名排序和歌星名排序第二种代表我们只能使用两个参数版的Collections.sort(). Collections.sort和Arrays.sort的实现原理 Collection.sort是对list进行排序Arrays.sort是对数组进行排序。 Collections.sort底层实现 Collections.sort方法调用了list.sort方法 list.sort方法调用了Arrays.sort的方法 因此Collections.sort方法底层就是调用的Array.sort方法 Arrays.sort底层实现 Arrays的sort方法如下 如果比较器为null进入sorta方法。如下 因此Arrays的sort方法底层就是 legacyMergeSort(a)归并排序 ComparableTimSort.sort()即Timsort排序。 Timesort排序 Timsort排序是结合了合并排序merge.sort和插入排序insertion sort而得出的排序方法 1.当数组长度小于某个值采用的是二分插入排序算法如下 找到各个run并入栈。 按规则合并run。 poll()方法和 remove()方法的区别 Queue队列中poll() 和 remove() 都是从队列中取出一个元素在队列元素为空的情况下remove() 方法会抛出异常poll() 方法只会返回 null 。 看一下源码的解释吧 /** * Retrieves and removes the head of this queue. This method differs * from {link #poll poll} only in that it throws an exception if this * queue is empty. * * return the head of this queue * throws NoSuchElementException if this queue is empty */ E remove(); /** * Retrieves and removes the head of this queue, * or returns {code null} if this queue is empty. * * return the head of this queue, or {code null} if this queue is empty */ E poll();LinkedHashMap的应用底层原理 LinkedHashMap维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序该迭代顺序可以是插入顺序insert-order或者是访问顺序其中默认的迭代访问顺序就是插入顺序即可以按插入的顺序遍历元素这点和HashMap有很大的不同。 LRU算法可以用LinkedHashMap实现。
http://www.dnsts.com.cn/news/161857.html

相关文章:

  • 中小型网站建设如何网页怎么打不开
  • 网站发展历程爱尚网站建设
  • 上海专业网站建设渠道资讯门户类网站
  • 影响力网站建设网站提交收录软件
  • 网站建设 知乎网站设计和建设
  • 领优惠卷的网站怎么做wordpress onthego
  • 有什么网站可以做微信长寿做网站
  • 网上做图赚钱的网站住建部网站建设部
  • 南开做网站的公司自助贸易网
  • 网站对位wordpress+andriod
  • 做美食网站分类信息网站成都搭建
  • 网站正能量大全天津做网站排名
  • 沈阳制作网站的公司有哪些知名企业名字
  • 网站开发的税率是多少互联网营销师考试
  • 怎样才能建立自已的网站中国广播电视总台官网
  • 学校网站需求住建厅官网证件查询
  • 专门做前端项目的一些网站免费网站建设公司
  • 建设厅工作证查询网站网站为什么要备案登记
  • 最好的设计师网站天猫代运营
  • 做宣传册参考的网站关于网站建设费用的报告
  • 如何做网站海报想学网站开发
  • 建c2c网站wordpress 浏览器缓存
  • 邢台做移动网站青岛网站设计制作
  • 优秀创意网站做爰片免费网站视频
  • 广东省住房建设厅网站首页寻找电商网站建设
  • 网站做成软件做一些网站犯法么
  • 做十来个网站优化免费建筑设计软件
  • 网站开发与技术中国十大企业培训机构排名
  • 大田县建设资讯网站iis架设网站教程
  • 模板网站源码曲阜网站制作