DC娱乐网

Java集合用得时候总出问题,代码出BUG如何避坑

Java集合框架像工具箱,里面有很多不同工具。比如ArrayList、HashSet这些类就是不同的工具,但你知道它们内

Java集合框架像工具箱,里面有很多不同工具。比如ArrayList、HashSet这些类就是不同的工具,但你知道它们内部是怎么运作的吗?今天说些实际用处,怎么选才不会出错。

集合框架分两大块,Collection和Map。Collection里面存对象,Map存键值对。每个类别还能再分小类,比如List能存重复元素,Set不能重复。选错容易出错,比如用List存东西却当Set用,搞不好就重复数据。

Iterator和Iterable这两个接口很多人搞混。Iterator是遍历用的,可以删除元素;Iterable是让集合能被for循环遍历的。其实for循环本质也是用Iterator,只是语法糖包装了一下。

HashMap是最常用的Map类型,底层是数组加链表加红黑树。当数据多的时候会转成红黑树,查询更快。但它是线程不安全的,多线程用会出问题。如果数据量稳定,可以提前定好初始容量,减少扩容次数。

TreeMap按顺序排元素,要嘛自然排序,要嘛自己定规则。比如按数字大小或字母顺序排。但操作速度比HashMap慢,适合需要有序的情况。

HashSet底层其实是用HashMap实现的,每个元素当HashMap的key,value都是固定值。所以HashSet的存取速度跟HashMap一样快,但只能存不重复的元素。

ArrayList是数组结构,查数据快,但中间插入删除慢。因为要移动数据。初始容量默认10,不够用就扩容,每次扩大1.5倍。频繁增删选LinkedList更好,它用链表结构,增删快但查得一个个找。

LinkedList既能当队列也能当栈用,不过现在更推荐ArrayDeque。据说ArrayDeque性能更好,虽然原理复杂,但用着方便。

PriorityQueue常用来处理优先级任务,比如VIP用户先处理。底层是堆结构,每次弹出优先级最高的。注意不能放null,元素必须可比较。

有的集合被淘汰了,比如Vector和Hashtable。它们每个方法都加了锁,线程安全但效率低。现在很少用了,除非真需要线程安全,可以用Collections包的同步包装器。

选择哪个集合要看需求。查多的话用ArrayList或HashMap,增删多用LinkedList。要有序用TreeSet,要唯一用HashSet。多线程要小心,最好用Java并发包里的类。

集合出BUG常见原因有三:选错类型导致重复或顺序不对,线程安全问题数据乱,还有遍历时修改数据抛异常。记住Iterator遍历时只能通过remove()方法删元素,否则会出错。

学这些不是为了背知识,而是遇到问题知道为什么。比如用HashMap出现重复key,检查equals和hashCode方法有没有重写。集合选对了,代码就少出问题。