JAVA。需要有一个容器,这个容器中的对象需要可排序,并且会频繁地做插入删除操作,则以下哪种类型的容器更符合需求?并解释一下每个选项容器的特点与适用场景,谢谢
选A LinkList的底层实现了List接口,底层使用的是使用双向链表的形式,存储的数据在空间上很可能不相邻,但是他们都有一个引用连在一起,所以增删起来会很方便。
其次,HashMap实现了Map接口,以键值对的方式存储,需要存储键值对的数据时使用该数据结构。
HashSet实现了Set接口,里面的数据是不能重复的,主要用于去重
ArrayList实现了List接口,底层使用的是数组,存储空间上是相邻的,所以查询起来会很方便,效率也会比LinkedList要高,所以查询比较频繁时使用ArrayList
应该选择C,链表不适合排序
ArrayList是固定长度,连续存储,不适合删除插入
HashSet是Key唯一的,你这里不适合
在 JDK1.2 以前,如果一个对象不被任何变量引用,则程序无法再次使用这个对象,这个对象最终会被 GC(GabageCollection:垃圾回收)。但是如果之后可能还会用到这个对象,就只能去新建一个了,这其实就降低了 JVM 性能,没有达到最大的优化策略。
从 JDK1.2 开始,提供了四种类型的引用:强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。主要有两个目的:1.可以在代码中决定某些对象的生命周期;2.优化JVM的垃圾回收机制。
需要一个可以频繁做插入删除操作且可排序的JAVA容器,请问哪种类型的容器最适合我的需求?请详细解释每种选项容器的特点及适用场景,谢谢。
答:根据提供的需求,最适合的数据结构是TreeSet。
TreeSet是SortedSet的唯一实现类,可以确保集合中的元素处于有序状态。TreeSet中的元素必须实现Comparable接口。TreeSet是基于 TreeMap实现的,该集合保证集合中的元素按照升序排列,或者根据在构造函数中提供的Comparator排序集合中的元素。
TreeSet是线程不安全的,若要保证线程安全,需要通过 Collections 的synchronizedSortedSet方法解决,但这种方式效率非常低下,最好的方式是使用ConcurrentSkipListSet,这是Java并发包中专门提供的一种高效并发有序集合,它是基于跳表实现的。ConcurrentSkipListSet也是SortedSet的唯一实现类,一个显著的特点是具有高效的并发性能。
因此,在高并发场景下,推荐使用ConcurrentSkipListSet类型的容器。但由于不需要对线程安全有更高的要求,TreeSet肯定是首选。
Hash中的数据都是无序的
linked仅修改指针的值,效率高,易插入删除
Arrays中内容过多,效率过低
因此linkedList更为合适