常用的集合类型有,List Set Map
list和set表面最简单的区别是:
list 有序集合,有索引,可以出现重复的元素
set 无序集合,无索引,不能出现重复的元素
集合泛型:
List<String> list3 = new ArrayList<>();
上面这个代码中 <String>就是泛型。泛型可以确定数据的类型,不至于在程序后面出现各种类型的错误。
说明:java中泛型是一个伪泛型,只是在编译的时候存在,编译后的class文件没有泛型,这么做是为了保证程序的安全。
迭代器:
//创建三种集合
List<String> Array = new ArrayList<String>();
Set<String> set = new HashSet<String>();
Map<Integer, String> map = new HashMap<Integer, String>();
//创建集合的迭代器
Iterator<String> iterator = Array.iterator();
Iterator<String> iterator2 = set.iterator();
//Map不能直接迭代,先调用keySet()方法,获得所有key值 放入一个set中
Set<Integer> keySet = map.keySet();
Iterator<Integer> iterator3 = keySet.iterator();
//迭代器的两个常用方法
//如果仍有元素可以迭代,则返回 true。
iterator.hasNext();
//返回迭代的下一个元素。
String next = iterator.next();
List:
list接口常用的子接口有:ArrayList类,LinkedList类
1)ArrayList的底层是基于动态数组,LinkedList的底层是基于链表来完成的。
2)基于(1)的存在,所以在使用查找,或者get(int index)(返回此列表中指定位置上的元素。)、
set(int index,E element)(用指定的元素替代此列表中指定位置上的元素。),方法时ArrayList更 有优势,
而在添加,删除的时候,LinkedList更好。(因为数组大小是确定的,所以如果要在ArrayList里面插入元素,
需要进行数组的复制。因为LinkedList是链表,查找元素的时候需要指针慢慢移动,而数组有索引,相对会更快)
3)但是在实际操作中一般是查找会更多一点所以建议用ArrayList,当然还是以实际情况决定。
//ArrayList&LinkedList的简单的使用,和常用的方法
//接口多态的方式调用
List<String> Array1 = new ArrayList<String>();
List<String> Linked1 = new LinkedList<String>();
//直接new相对应的集合
ArrayList<String> Array2 = new ArrayList<String>();
LinkedList<String> Linked2 = new LinkedList<String>();
//这两种创建集合的方法建议使用第一种,因为代码的扩展性好一些
Array1.add("aaa");
Array1.add("bbb");
Linked1.add("ccc");
Linked1.add("ddd");
System.out.println(Array1);
System.out.println(Linked1);
//打印结果
//[aaa, bbb]
//[ccc, ddd]
//常用的方法
//将指定的元素添加到此列表的尾部
Array1.add("aaa");
//将指定的元素添加到指定的位置,第一个index不能超过集合的长度
Array1.add(2, "ccc");
//移除此列表中所以的元素,但是集合还存在
//Array1.clear();
//查找集合中是否有某个元素,参数是Object类型,有返回true,没有返回false
boolean aaa = Array1.contains("aaa");
//返回下标所对应的元素
String ccc = Array1.get(1);
//判断集合是否为空
boolean empty = Array1.isEmpty();
//删除参数 下标的元素 返回该元素
String remove = Array1.remove(1);
//删除集合中 函数参数的元素 返回成功或失败
boolean remove2 = Array1.remove("aa");
//返回集合的元素个数
int size = Array1.size();
//把集合转化成数组
Object[] array = Array1.toArray();
//因为LinkedArray是基于链表实现的
//所以LinkedArray会有一些对头 和尾操作的方法,详细见API
//基于Collections接口的方法
//对集合进行排序,只能对list排序
Collections.sort(Array1);
//找到集合中最大的值
String max = Collections.max(Array1);
//对集合进行随机排序
Collections.shuffle(Array1);
Set:
set接口常用的子接口有:Hashset类,Linkedhashset类
1)hashset由哈希表(实际上是一个HashMap)支持。它不保证存取的顺序一致,可以存null元素。
2)LinkedHashSet由哈希表和链接列表实现,它可以按照插入的顺序进行迭代(输出)。
3)set的使用方法和list大同小异就不一一列举了。
Map:
这里主要介绍一个HashMap:
1)Map里面的val(值)可以相同,但是key(键)不能相同。如果用put()方法添加的时候(list和set添加是用add,而map使用put),如果键值相同了,那么后面的val覆盖了前面的val。
2)Map里面的key和val都可以为空,但是key只能存一个null(这也和key不能重复相符合)。
3)当key是Integer类型时,按照数字(key)大小依次输出,key值为null排在第一位。
Map常用方法:
//创建一个HashMap
Map<Integer, String> map = new HashMap<Integer, String>();
//HashMap常使用的方法
//添加一个映射关系(简单理解为向Map里面添加一个值)
map.put(1, "aaa");
map.put(2, "bbb");
map.put(3, "ccc");
//从此映射关系里面移除所有映射(Map依然存在)
map.clear();
//分别查看Map里面是否存在此键,或者此值的映射,返回boolean
boolean containsKey = map.containsKey(1);
boolean containsValue = map.containsValue("aaa");
//用key获得相对应的val,参数是key类型,返回值是val类型
String string = map.get(1);
//判断此Map中是否有 键-值 映射关系,返回boolean
boolean empty2 = map.isEmpty();
//通过key移除对应的映射关系,返回val
String remove3 = map.remove(1);
//返回Map中映射关系数(键值对的个数)
int size2 = map.size();
//返回Map中每个键值对哈希值的和
int hashCode = map.hashCode();
//返回Map中所有的键值,装到一个set集合里面
Set<Integer> keySet = map.keySet();
//返回此映射所包含的映射关系的set视图(API上的说明)
//个人理解:返回一个set,set里面存放Entry对象,Entry里面放的是
//相对应的key,val
Set<Entry<Integer, String>> entrySet2 = map.entrySet();
Map的两种遍历:
//Map两种遍历方法(笔者常使用的两种)
//方法一: 使用keySet()方法 + 迭代器 iterator()
//获取存在的所有key
Set<Integer> keySet2 = map.keySet();
//对存储key的set进行迭代
Iterator<Integer> iterator3 = keySet2.iterator();
//使用while循环来遍历
while(iterator3.hasNext()){
//取出每一个key
Integer next = iterator3.next();
//通过key来取val
String string2 = map.get(next.intValue());
System.out.println(next.intValue() +"---"+ string2);
}
//使用增强for来遍历
for (Integer integer : keySet2) {
String string3 = map.get(integer.intValue());
System.out.println(integer.intValue() +"---"+ string3);
}
//方法二:
//获取键值对的 set
Set<Entry<Integer, String>> entrySet3 = map.entrySet();
//用迭代方法取出键值对
Iterator<Entry<Integer, String>> iterator5 = entrySet3.iterator();
//使用while循环遍历
while(iterator5.hasNext()){
//取出每一个键值对对象 next
Entry<Integer, String> next = iterator5.next();
System.out.println(next.getKey() +"---"+ next.getValue());
}
//使用增强for遍历
for (Entry<Integer, String> entry : entrySet3) {
//使用增强for可以不要上面迭代去取键值对的方法和取出每一个键值对对象 next
System.out.println(entry.getKey() +"---"+ entry.getValue());
}
//通过上面来看,推荐使用增强for来遍历,可以减少代码量