Collections 是否有基于散列(快速检索)、排序、索引并允许插入的集合?

Collections 是否有基于散列(快速检索)、排序、索引并允许插入的集合?,collections,java-8,Collections,Java 8,对于我的项目,我需要一个具有以下功能的集合 a。基于散列:快速检索,因为我可能需要在多个级别上爬过数千个节点 b。有序:所有节点都必须保持插入顺序。这是必须的 c。索引:我需要经常访问集合的第一个和最后一个元素,而无需迭代 d。快速插入:我可以非常频繁地在两者之间插入一个节点 Java集合中最适合的是LinkedHashSet,但唯一的缺点是它没有索引。所以我不能做像myCollection.last()这样的事情 我所能做的就是 LinkedHashSet<Car> carList

对于我的项目,我需要一个具有以下功能的集合

a。基于散列:快速检索,因为我可能需要在多个级别上爬过数千个节点

b。有序:所有节点都必须保持插入顺序。这是必须的

c。索引:我需要经常访问集合的第一个和最后一个元素,而无需迭代

d。快速插入:我可以非常频繁地在两者之间插入一个节点

Java集合中最适合的是LinkedHashSet,但唯一的缺点是它没有索引。所以我不能做像myCollection.last()这样的事情

我所能做的就是

LinkedHashSet<Car> carList = new LinkedHashSet<Car>();
//Implemented hashCode() and equals()       
carList.add(new Car(new Engine("1234","V2"),"Indica","Tata"));
carList.add(new Car(new Engine("1235","V6"),"RS7","Audi"));
carList.add(new Car(new Engine("1236","V6"),"GT-R","Nissan"));
carList.add(new Car(new Engine("1237","V2"),"Indica","Tata"));
carList.add(new Car(new Engine("1237","V2"),"Indica","Tata"));
carList.add(new Car(new Engine("1238","V2"),"Indica","Tata"));
carList.add(new Car(new Engine("1239","V6"),"RS7","Audi"));
carList.add(new Car(new Engine("1240","V6"),"GT-R","Nissan"));

Car c = (Car)carList.toArray()[carList.size()-1];
System.out.println("Last : "+c); //Find last
LinkedHashSet carList=new LinkedHashSet();
//实现了hashCode()和equals()
添加(新车(新发动机(“1234”、“V2”)、“Indica”、“Tata”);
添加(新车(新发动机(“1235”、“V6”)、“RS7”、“奥迪”);
添加(新车(新发动机(“1236”、“V6”)、“GT-R”、“日产”);
添加(新车(新发动机(“1237”、“V2”)、“Indica”、“Tata”);
添加(新车(新发动机(“1237”、“V2”)、“Indica”、“Tata”);
添加(新车(新发动机(“1238”、“V2”)、“Indica”、“Tata”);
添加(新车(新发动机(“1239”、“V6”)、“RS7”、“奥迪”);
添加(新车(新发动机(“1240”、“V6”)、“GT-R”、“日产”);
Car c=(Car)carList.toArray()[carList.size()-1];
System.out.println(“Last:+c”)//最后找到
但是没有好的方法插入LinkedHashSet,这就是我必须拒绝LinkedHashSet的地方。
只有当其他库以良好的性能满足上述所有要求并允许使用函数式编程和流API时,我才会向它们开放。

基于哈希的集合不允许“爬过数千个节点”。它允许快速检查集合中是否包含元素。ArrayList可能就是您想要的。“爬过…”忽略此部分。很难解释我的意思。无论如何,Arraylist的插入性能很差。无法使用您是否对其进行了基准测试?未进行基准测试,但我知道ArrayList的插入性能较差,因为它们不维护指向上一个和下一个元素的指针,因此插入中的元素会发生移动,这是一种昂贵的操作,而且硬件复制内存块的速度非常快。对其进行基准测试。使用指向上一个和下一个元素的指针会慢得多,因为这些元素不会在内存中并置,从而导致缓存未命中。更不用说,您需要迭代到第n个元素才能插入一个新的元素,这会更慢。不要做假设。量。