Java -- 容器使用 Set, List, Map, Queue

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:
1. ArrayList
ArrayList<String> c = new ArrayList<String>();
c.add("hello");
c.add("world");
String a = new String("aya");
c.add(a);
for( Object obj : c  )
{
System.out.println( (String)obj );
}
c.set(2, "111");
Iterator<String> it = c.iterator();
while(it.hasNext())
{
System.out.println( (String)it.next() );
}
ArrayList 的迭代器还有 ListIterator 可以有正反两种查询,先hasNext知道最后 hasPrevious才能有值
[java] view plaincopy
ListIterator<String> it2 = c.listIterator();
while(it2.hasNext())
{
System.out.println( "hasNext " + (String)it2.next() );
}
while(it2.hasPrevious())
{
System.out.println( "hasPrevious " + (String)it2.previous() );
}
   2. HashSet 集合是无序的。
  HashSet集合判断两个元素相等的标准是两个对象通过equals 方法比较相等,并且两个对象的hashCode()方法返回值也相等。
  向HashSet中添加可变对象时,必须小心,如果修改HashSet集合中的对象有可能导致该对象与集合中其他对象相等,从而导致Hashset无法准确访问该对象。

3. TreeSet 集合有序
  由于TreeSet有序, 所有有访问第一个,前一个,后一个,最后一个并可以截取子集。
  排序的顺序并不是根据插入的顺序,而是根据元素实际值来排序。
TreeSet<Integer> nums = new TreeSet<Integer>();
nums.add(4);
nums.add(3);
nums.add(2);
nums.add(1);
System.out.println(nums);  //整个集合
System.out.println(nums.first());
System.out.println(nums.last());
System.out.println(nums.headSet(3)); //小于3,但不包括3
System.out.println(nums.tailSet(3)); //大于等于3
System.out.println(nums.subSet(1, 3));  大于等于1,小于3
  结果为
  [1, 2, 3, 4]
  1
  4
  [1, 2]
  [3, 4]
  [1, 2]
  TreeSet自然排序:根据元素大小,升序排列。 对于TreeSet判断两个元素相等的标准是,两个对象通过equals方法比较返回true,并且通过compareTo(Object obj)比较 返回0。
  和HashSet一样集合中为可变对象时,修改对象值后可能容易出错,为了健壮性,HashSet和TreeSet推荐放入不可变对象。
  TreeSet定序排列: 使用comparator接口帮助。
   4. EnumSet 是一个专为枚举类设计的集合类,其中所有的值都是指定枚举类型的枚举值。没有暴露构造器,必须用静态方法创建。
enum Season
{
SPRING,SUMMER,FALL,WINTER;
}
public class Main {
public static void main(String[] args) {
EnumSet es1 = EnumSet.allOf(Season.class); //创建一个EnumSet集合,集合元素就是Season枚举类的全部枚举值
System.out.println(es1);
EnumSet es2 = EnumSet.noneOf(Season.class); //空集合,但指定其中的元素是Season类的枚举值
System.out.println(es2);
es2.add(Season.SPRING);
es2.add(Season.SUMMER);
System.out.println(es2);
EnumSet es3 = EnumSet.of(Season.SPRING, Season.SUMMER); // 以指定枚举值创建EnumSet
System.out.println(es3);
EnumSet es4 = EnumSet.range(Season.SPRING, Season.FALL); // 范围值
System.out.println(es4);
EnumSet es5 = EnumSet.complementOf(es4); //Season中 除去es4里剩下的部分 为es5
System.out.println(es5);
}
}
  输出结果:
  [SPRING, SUMMER, FALL, WINTER]
  []
  [SPRING, SUMMER]
  [SPRING, SUMMER]
  [SPRING, SUMMER, FALL]
  [WINTER]
   5. LinkedList 不仅可以当做双向队列使用,还可以当做“栈”使用,其包含有 pop出栈 和 push入栈 方法
LinkedList<String> books = new LinkedList<String>();
books.offer("test1");  //加入队列尾部
books.push("test2");   //入栈
books.offerFirst("test3"); //放入头部
for(int i=0; i<books.size(); i++)
{
System.out.println( books.get(i) );
}
System.out.println( books.peekFirst() ); //访问不删除
System.out.println( "log1: " + books );
System.out.println( books.pollFirst() );  //访问并删除
System.out.println( "log2: " + books );
  输出结果:
  test3
  test2
  test1
  test3
  log1: [test3, test2, test1]
  test3
  log2: [test2, test1]
   6. Map
  HashMap 和 HashTable 判断Value相等的条件只需要equals方法返回true即可,判断Key相等的条件是equals()和hashCode()返回值都相等。
  LinkedHashMap以链表来维护内部顺序。性能低于HashMap,消耗低于TreeMap。
  TreeMap key的排序也是根据红黑树排列,有两种排序方式,自然排序和定制排序。
  WeekHashMap 只保留key对应对象的弱引用,可能被垃圾回收。
enum Season
{
SPRING,SUMMER,FALL,WINTER;
}
public class Main {
public static void main(String[] args) {
HashMap<Integer, String> map1 = new HashMap<Integer, String>();
map1.put(1, "hello");
map1.put(2, "world");
System.out.println(map1);
System.out.println(map1.containsKey(3));
System.out.println(map1.containsValue("world"));
map1.put(2, "aya");
System.out.println(map1);
for(Map.Entry<Integer, String> m : map1.entrySet())
{
System.out.println(m);
System.out.println(m.getKey());
}
EnumMap map2 = new EnumMap(Season.class);
map2.put(Season.SPRING, "spring");
map2.put(Season.SUMMER, "summer");
System.out.println(map2);
}
}


最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
7月前
|
人工智能 Java
Java 中数组Array和列表List的转换
本文介绍了数组与列表之间的相互转换方法,主要包括三部分:1)使用`Collections.addAll()`方法将数组转为列表,适用于引用类型,效率较高;2)通过`new ArrayList&lt;&gt;()`构造器结合`Arrays.asList()`实现类似功能;3)利用JDK8的`Stream`流式计算,支持基本数据类型数组的转换。此外,还详细讲解了列表转数组的方法,如借助`Stream`实现不同类型数组间的转换,并附带代码示例与执行结果,帮助读者深入理解两种数据结构的互转技巧。
387 1
Java 中数组Array和列表List的转换
|
10月前
|
算法
你对Collection中Set、List、Map理解?
你对Collection中Set、List、Map理解?
163 18
你对Collection中Set、List、Map理解?
|
10月前
|
存储 缓存 安全
只会“有序无序”?面试官嫌弃的List、Set、Map回答!
小米,一位热衷于技术分享的程序员,通过与朋友小林的对话,详细解析了Java面试中常见的List、Set、Map三者之间的区别,不仅涵盖了它们的基本特性,还深入探讨了各自的实现原理及应用场景,帮助面试者更好地准备相关问题。
188 20
|
12月前
|
Java 程序员 编译器
Java|如何正确地在遍历 List 时删除元素
从源码分析如何正确地在遍历 List 时删除元素。为什么有的写法会导致异常,而另一些不会。
298 3
|
12月前
|
Java 程序员
Java|List.subList 踩坑小记
不应该仅凭印象和猜测,就开始使用一个方法,至少花一分钟认真读完它的官方注释文档。
212 1
|
6天前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
44 1
|
3月前
|
存储 缓存 JavaScript
Set和Map有什么区别?
Set和Map有什么区别?
282 1
|
4月前
|
存储 JavaScript 前端开发
for...of循环在遍历Set和Map时的注意事项有哪些?
for...of循环在遍历Set和Map时的注意事项有哪些?
270 121
|
7月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
191 2