JAVA 中的集合框架
java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中
一、集合与数组
数组:(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用。(在别的博客转载 https://www.cnblogs.com/leeplogs/p/5891861.html)
集合:(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用。(在别的博客转载 https://www.cnblogs.com/leeplogs/p/5891861.html)
collection 接口存储一组不唯一,无序的对象
list 接口存储一组不唯一,有序(插入顺序)的对象
set 接口存储一组唯一,无序的对象
ArrayList: 实现长度可变的数组,在内存中分配连续的空间.遍历元素和随机访问元素的效率比较高
LinkedList: 采用链表存储方式.插入删除元素时效率比较高
Vector 和 ArrayLis 的 异同
实现原理、功能相同、可以互用
主要区别
vector线程安全,ArrayList 重速度轻安全线程非安全
长度需增长时,vector默认增长一倍ArrayList增长50%
Hshtable 和 HashMap的异同
实现原理、功能相同、可以互用
主要区别
Hashtable 继承 Dictionary 类 HashMap 实现Map接口
Hashtable 线程安全,Hashmap线程非安全
Hashmao 不允许有null值,Hashtable允许null值
在实际开发中最好使用ArrayList 和Hashmap
Collections 相当于一个工具类里面提供了排序等等一系列方法 java.util.Collections包下
1 package TEXT; 2 3 import java.util.ArrayList; 4 import java.util.Collections; 5 import java.util.Random; 6 7 public class Text { 8 // 排序 9 public static void Stringlist() { 10 ArrayList<Integer> stringlist = new ArrayList<>(); 11 Random random = new Random(); 12 int li; 13 for (int i = 0; i < 10; i++) { 14 do { 15 li = random.nextInt(10); 16 } while (stringlist.contains(li)); 17 stringlist.add(li); 18 System.out.println("成功添加" + li); 19 } 20 System.out.println("\n" 21 + "====================排序前=======================" + "\n"); 22 for (int i = 0; i < stringlist.size(); i++) { 23 System.out.println(stringlist.get(i)); 24 } 25 System.out.println("\n" 26 + "====================排序后=======================" + "\n"); 27 Collections.sort(stringlist); 28 for (Integer integer : stringlist) { 29 System.out.println(integer); 30 } 31 } 32 33 /** 34 * @param args 35 */ 36 public static void main(String[] args) { 37 { 38 { 39 Text.Stringlist(); 40 } 41 } 42 } 43 }
下面的几种集合中比较常用的方法
Map coutries=new HashMap();
添加 put(Object key键名,Object value值)
coutries.put("","");
通过key获得值
String conter=(String)coutries.get("填写key值");
显示集合中的个数
coutries.size();
判断是否存在键名 (返回一个bool值)
Boolean bool=coutries.containsKeys("键名")
判断是否存在值 (返回一个bool值)
Boolean bool=coutries.containsValue("值")
删除集合对象
coutries.remove("键名");
键集
coutries.keySet();
值集
coutries.values();
清空coutries集合
coutries.clear();
迭代器只用于单列集合 双列集合要想使用迭代器 先把双列集合装换成单例集合
package day03map; import java.util.Collection; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set; /** 2018年3月10日 */ public class Day01 { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("CBC", "中国建设银行"); map.put("ABC", "中国农业银行"); map.put("ICBC", "中国工商银行"); // 双列的集合遍历方式 不能使用for 下标 因为他没有下标 // 方式一:for : 通过keys集合遍历value Set<String> set = map.keySet(); for (String key : set) { System.out.println(key); // key有了,Value如何获取? System.out.println(map.get(key)); } System.out.println("======================="); // 方式二:直接遍历value Collection<String> collection = map.values(); for (String value : collection) { System.out.println(value); } System.out.println("=========================="); // 方式三:key和Value Set<Entry<String, String>> entrySet = map.entrySet(); for (Entry<String, String> entry : entrySet) { System.out.println(entry.getKey()); System.out.println(entry.getValue()); } // 方案四:使用迭代器遍历 System.out.println("==========================="); Set<String> keySet = map.keySet(); Iterator<String> iterator = keySet.iterator(); // 迭代器需要手工迭代 ,需要使用while while (iterator.hasNext()) { String key = iterator.next(); System.out.println(key); System.out.println(map.get(key)); } System.out.println("最后的晚餐============="); // 方案五:使用迭代器遍历 key+value同时遍历 Iterator<Entry<String, String>> iterator2 = map.entrySet().iterator(); // 见到Iterator就得使用while循环 while (iterator2.hasNext()) { Entry<String, String> entry = iterator2.next(); System.out.println(entry.getKey()); System.out.println(entry.getValue()); } } }
Set类继承了Conllection类,是一种集合类。Set的实现类有三个
HashSet类按照哈希算法来存取集合中的对象,存取速度比较快。
1.Set中是不能出现重复数据的。
2.Set中可以出现空数据。
3.Set中的数据是无序的。
LinkedHashSet
这个相对于HashSet来说有一个很大的不一样是LinkedHashSet是有序的。LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。
TreeSet的特点是:
1.不能写入空数据 2.写入的数据是有序的。 3.不写入重复数据
总结一下集合
定义一个单例集合 默认初始化10个位置,但元素个数为0;
ArrayList 的扩容原理是(乘3/2)+1 也就是 原容量的 0.5倍+1
Vector 的扩容原理是原来的一倍
HashMap:默认初始容量为16 的扩容原理是原来的一倍
HashSet :初始容量也是16 它的扩容也是原来的一倍