为什么要有集合?
int[] scores = new int[]{1,4,6,2,3}; 长度固定了,后期无法改变
当我们不确定一个数据到底有多少个的时候,数组根本就不适用
这个时候集合就出现了。
集合相当于是一种容器,这个容器的大小不固定。
可以无限制的往集合添加数据,而不受大小的限制。
数组不能在程序已经执行的过程中动态的扩展数组的大小。
集合可在程序执行的过程中动态的改变集合的容器大小。
集合(Collection)的三种分类:Set List Queue
Collection集合的常用方法:
add(Object e) :往集合中添加元素,集合默认可以添加任何类型的数据
clear() :清空集合数据
contains():判断集合中是否存在某个元素
isEmpty():判断集合是否为空 为空返回true 反之
size() : 集合的大小
把集合打成数组
Object[] objs = hashSet.toArray();
System.out.println(Arrays.toString(objs));
remove(Object o) 从集合删除某个元素
addAll(Collection<? extends E> c) 将其他集合的元素全部加入到自己的集合中
将set1的元素全部加入到set集合中
set.addAll(set1);
Set 基本上跟Collection规范(功能)一致
特征:元素无序不重复
Set依然是一个接口继承了Collection,Set不能直接创建对象
-
Set的实现类HashSet: 元素无序不重复
每个对象都有三个方法:toString equals hashcode(直接拿对象的地址)
为什么不重复:
集合第一步先拿对象的hashcode地址看和其他对象的hashCode地址是否一样。
如果一样,再判断两个对象equals是否相等如果相等才认为重复,重复就会去掉,只保留一个。
如果拿对象的hashcode已经不同,集合就认为两个对象没有重复,同时集合也觉得没有必要再判断equals
集合中:对于对象,一般需要重写对象的hashCode()方法和equals()方法来制定对象的重复规则!!!!
元素无序。 性能比较好。一般可以使用HashCode. -
Hashset集合的遍历:
for循环不能遍历set集合 foreach可以遍历 iterator迭代器可以遍历 jdk1.8以后的forEach函数式表达式可以遍历
-
LinkedHashSet :元素有序不重复:增加了一个链可以记录元素的添加顺序
-
SortedSet 排序集合 重点是TreeSet
元素自动大小排序且不重复 TreeSet中一般不能添加不同类型的元素,TreeSet默认无法比较不同的类型,也不知道怎么比较。 默认一般只有相同类型的数值才可以进行比较 如果添加了对象,应该给对象制定大小比较规则。 注意:如果对象的比较规则返回的是0就说明两个对象的大小是一样的,treeSet会去掉一个
比较规则的两种方法:
– 直接让对象实现比较接口Comparable,重写比较方法compareTo 制定比较规则
– 也可以通过匿名内部类直接给集合一个比较器new Comparator();
–如果TreeSet既有对象比较规则又自己拥有比较器优先使用集合自己的比较器
进行比较。
–如果集合已经存在比较器,对象可以不实现比较器。
List(重点):每个元素都有索引,有序可重复。
-
ArrayList(实现类)
很像数组了,但是大小可变,可添加任何类型的数据
— List集合依然可以使用集合所有的方法,但是因为list有序有索引所以多了一些功能。
— 第一个实现类ArrayList
— get(int index) 返回列表中指定位置的元素。
— list集合的遍历有四种方式:
除了集合的三种遍历, list因为存在索引,而且可以根据索引获取对应位置的元素
所以list可以直接用循环语句来遍历
— ArrayList是开发中常用的,基本上都是用
List<类型> list = new ArrayList<类型>();这个必须掌握。
ArrayList性能比较好 -
Queue:队列
队列:先进先出
offer():入队
poll():出队
栈 :后进先出
push():入栈
pop():出栈
Map集合(重要)
Collection集合是放置的具体类型的元素
Map中的元素都是键值对key=value的形式
而set集合中的元素都是key
Map集合就是set集合对应的元素加上一个附属元素
Map可以存储更加丰富的业务数据。
Map集合的特性跟Set集合是一样的。只是map集合的元素都带有一个附属元素
Map集合的特性是只管元素而不管附属元素。
Set中的元素是: [元素1,元素2,元素3,.......]
Map中的元素是: [元素1=附属元素,元素2=附属元素,....... ]
key = value , key = value (键值对)
-
HashMap(重点)
无序不重复,根据map元素中的key而定的。
特性根据key与HashSet一致。为什么不重复?
map集合第一步先拿对象key的hashcode地址看和其他对象key的hashCode地址是否一样。
如果一样,再判断两个对象key的equals是否相等如果相等才认为重复,重复就会去掉,只保留一个。
如果拿对象key的hashcode已经不同,集合就认为两个对象key没有重复,同时集合也觉得没有必要再判断equals
map集合中: 对于对象key,一般需要重写对象key的hashCode()方法和equals()方法来制定对象key的重复规则!!!!
元素无序。 性能比较好。一般可以使用HashMap.
方法:
put(key,value):添加
get(key):根据key得到相应的value
size():该集合的个数
containsKey(key):判断是否包含某个key
containsValue(value):判断是否包含某个value值
clear():清空集合
isEmpty():集合是否为空
keySet():将map集合的所有key全部提取到一个集合里去 -
LinkedHashMap 有序不重复
根据key与LinkedHashSet特性一样。
-
TreeMap 排序不重复。
根据key与TreeSet特性一样
-
HashTable 下的Properties(Map集合类型) 了解
不允许使用null作为key
Properties集合中的数据是存放在磁盘的文件里面,一般用于做配置文件
而且这个文件一般是 xxxx.properties
Properties也可以将配置文件读成一个集合对象Properties
Map集合的遍历
public class MapBianli1
{
public static void main(String[] args)
{
Map<String,Integer> map = new HashMap();
map.put("admin",60);
map.put("ligang",100);
map.put("xlei",101);
System.out.println(map); // {xlei=101, ligang=100, admin=60}
// for循环不能遍历
// foreach
// {xlei=101, ligang=100, admin=60}
// {元素1, 元素2 , 元素3} = map.entrySet()
// Map.Entry = 元素1,
// kv
for(Map.Entry<String,Integer> kv : map.entrySet()){
String key = kv.getKey();
Integer value = kv.getValue();
System.out.println(key +"---"+value);
}
System.out.println();
// 拿到map集合中所有key的集合
Set<String> keys = map.keySet();
for(String key : keys){
System.out.println(key +"---"+map.get(key));
}
System.out.println();
// JDK 1.8
map.forEach((k,v) -> {
System.out.println(k +"---"+v);
});
}
}
泛型
JDK1.5以后引入泛型
泛型可以规定只能操作某种特定类型。
Set<类型> 变量 = new HashSet<类型>();
Set<类型> 变量 = new HashSet<>();
------------------------------------------
List<类型> 变量 = new ArrayList<>();
Map<类型,类型> 变量 = new HashMap<>();
------------------------------------------
注意:
泛型必须申明引用类型!!!不能使用基本数据类型
// Map<String,int> map = new HashMap(); 错误的定义方式
// Map<String,Integer> map = new HashMap(); 正确的定义方式
集合申明了泛型以后,集合就只能存储泛型对应类型的数据。