JAVA 集合框架
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JAVA 集合框架,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含6675字,纯文字阅读大概需要10分钟。
内容图文
![JAVA 集合框架](/upload/InfoBanner/zyjiaocheng/603/4f1bfbc95734491abe92d8b1da375850.jpg)
JAVA 集合框架总览
1,集合框架概述
集合可以看作是一种容器,用来存储对象信息。所有集合类都位于java.util包下,但支持多线程的集合类位于java.util.concurrent包下。
数组与集合的区别如下:
- 数组长度不可变化而且无法保存具有映射关系的数据;集合类用于保存数量不确定的数据,以及保存具有映射关系的数据。
- 数组元素既可以是基本类型的值,也可以是对象;集合只能保存对象。
2,Java集合常见接口及实现类
1)List
List集合代表一个有序、可重复集合,集合中每个元素都有其对应的顺序索引。List集合默认按照元素的添加顺序设置元素的索引,可以通过索引(类似数组的下标)来访问指定位置的集合元素。
实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
(1) ArrayList
- ArrayList 是一个动态数组,它底层是由数组实现,允许插入任何符合规则的元素包括 null
- ArrayList 初始容量为 10 ,每次扩容 0.5 倍(奇数先减一)
- ArrayList 擅长访问,同时是非线程安全的
ArrayList 扩容测试:
package com.zgjt.design.collection;
import java.lang.reflect.Field;
import java.util.ArrayList;
public class ListDemo {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
ArrayList<String> arrayList = new ArrayList<>();
for(int i = 0; i < 50;i++){
arrayList.add("测试");
getArrayListCapacity(arrayList);
}
}
public static void getArrayListCapacity(ArrayList<?> arrayList) throws NoSuchFieldException, IllegalAccessException {
Class<ArrayList> arrayListClass = ArrayList.class;
Field field = arrayListClass.getDeclaredField("elementData");
field.setAccessible(true);
Object[] objects = (Object[])field.get(arrayList);
System.out.println( objects.length + ":" + arrayList.size());
System.out.println("--------------------------");
}
}
(2) LinkedList
- Linked 是链表实现,LinkedList 还实现了 Deque 接口,可以当作双端队列来使用
- 随机访问效率较差,增删元素效率较高
(3) Vector 和 Stack
- Vector 与 ArrayList 相似,但是 Vector 是同步的。所以说 Vector 是线程安全的动态数组。它的操作与 ArrayList 几乎一样。
- Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
2) Set
Set 集合与 Collection 的方法相同,而且 Set 集合不允许存储相同的元素
(1)HashSet
- 不能保证元素访问顺序
- HashSet 是线程非安全的
- 集合元素可以是 null
- HashSet 实现:是一个 HashMap,值存在 hashMap 的 key 中。当向HashSet集合存储一个元素时,HashSet会调用该对象的hashCode()方法得到其hashCode值,然后根据hashCode值决定该对象的存储位置。HashSet集合判断两个元素相等的标准是(1)两个对象通过equals()方法比较返回true;(2)两个对象的hashCode()方法返回值相等。因此,如果(1)和(2)有一个不满足条件,则认为这两个对象不相等,可以添加成功。如果两个对象的hashCode()方法返回值相等,但是两个对象通过equals()方法比较返回false,HashSet会以链式结构将两个对象保存在同一位置,这将导致性能下降,因此在编码时应避免出现这种情况。
(2)linkedHashSet
- LinkedHashSet是HashSet的一个子类,具有HashSet的特性,也是根据元素的hashCode值来决定元素的存储位置。但它使用链表维护元素的次序,元素的顺序与添加顺序一致。由于LinkedHashSet需要维护元素的插入顺序,因此性能略低于HashSet,但在迭代访问Set里的全部元素时由很好的性能。
(3)TreeSet
- TreeSet时SortedSet接口的实现类,TreeSet可以保证元素处于排序状态,不允许空值,它采用红黑树的数据结构来存储集合元素。TreeSet支持两种排序方法:自然排序和定制排序,默认采用自然排序。
3) Map
Map 接口采用键值对 Map<K,V> 的存储方式,保存具有映射关系的数据,key 和 value 可以是任意引用类型的数据,key 值不允许重复,可以为 null
(1)HashMap
- HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变
- HashMap 基于 hashing 原理,它调用建对象的 hashCode() 方法来计算 hashCode 值,然后找到 bucket 位置来储存值对象,HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会存储在链表的下一个节点中。jdk1.8 后,当链表长度超过 8 时,自动转换为红黑树实现。
- HashMap 扩容:默认初始化长度为 16,可以指定长度。指定长度最好是 2 的 n 次方(如果不是,也会自动变成)。当 hashmap 中的元素个数超过数组大小 * loadFactor 时,就会进行数组扩容,loadFactor 的默认值为0.75,扩容为原来的 2 倍。
- 和 HashMap 的区别:
1. HashMap 是线程不安全,HashTable 是线程安全的。
1. HashMap 可以使用 null 值最为 key 或 value;Hashtable 不允许使用 null 值作为 key 和 value,如果把 null 放进 HashTable 中,将会发生空指针异常
(2)LinkedHashMap
- linkedhashMap 保证插入顺序,性能略低于 HashMap
- linkedHashMap 是 HashMap 的子类,在 HashMap 的基础上维护了一个链表,负责维护 Map 的迭代顺序。
(3)Properties
- 用来读配置文件
username = 张三
age = 28
package com.zgjt.design.collection;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;
public class PropertiesDemo {
public static void main(String args[]) throws IOException {
Properties properties = new Properties();
BufferedReader bufferedReader = new BufferedReader(new FileReader("D:\\项目文件\\test.properties"));
properties.load(bufferedReader);
System.out.println( properties.getProperty("username") );
}
}
(4) TreeMap
- treeMap 排序,不允许存入 null 值。
- TreeMap是SortedMap的实现类,是一个红黑树的数据结构,每个key-value对作为红黑树的一个节点。TreeMap存储key-value对时,需要根据key对节点进行排序。
两种排序方式:
- 自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则会抛出ClassCastException。
- 定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。
4) Iterator
Iterator是一个接口,它是集合的迭代器。集合可以通过Iterator去遍历集合中的元素。
package com.zgjt.design.collection;
import java.util.*;
public class IteratorDemo {
public static void main(String[] args){
List<String> stringList = new ArrayList<>();
stringList.add("张三");
stringList.add("李四");
stringList.add("王五");
stringList.add("马六");
Iterator<String> iterator = stringList.iterator();
/*遍历*/
while(iterator.hasNext()){
System.out.println(iterator.next());
}
System.out.println("------------------------");
/*删除*/
iterator = stringList.iterator();
while(iterator.hasNext()){
if(iterator.next().equals("李四")){
iterator.remove();
}
}
for(String str : stringList){
System.out.println(str);
}
System.out.println("---------------------");
/* ListIterator */
ListIterator<String> listIterator = stringList.listIterator();
while(listIterator.hasNext()){
System.out.println(listIterator.next());
}
System.out.println("---------------------");
while(listIterator.hasPrevious()){
System.out.println(listIterator.previous());
}
}
}
5)其他常用集合
(1) ConcurrentHashMap
- 1, ConcurrentHashMap 相较于 HashMap 是线程安全的,位于 java.util.concurrent 包中,key 和 value 都不允许 null 值。
- 2, ConcurrentHashMap 在 jdk1.7 是使用分段锁来保证线程安全,jdk1.8 之后是使用 cas 乐观锁 + synchronized 锁
- 3, ConcurrentHashMap 链表转换红黑树的条件:一个是链表长度达到 8,一个是数组长度超过 64
内容总结
以上是互联网集市为您收集整理的JAVA 集合框架全部内容,希望文章能够帮你解决JAVA 集合框架所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。