集合
定义
集合是指由相同数据类型的一组数据构成的数据结构。
数组结构相似,但是二者也由许多不同点
**1.二者的声明方式不同 **
2.数组的长度是固定不变的,但是集合的长度是动态变化的。
3.数组只提供了有限的方法去操作数据,但是集合给了可以操作数据的许多方法。
分类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NHS3NeIw-1604995711029)(C:\Users\hu\Desktop\新建文件夹\QQ截图20201029144654.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTSm6d6z-1604995711035)(C:\Users\hu\Desktop\新建文件夹\QQ截图20201029144709.png)]
1.List
由上图可知,List继承Collection接口。由ArraryList和vector两个实现类。这里主要介绍ArrayList集合
//声明一个ArrayList集合
List<String> list = new ArrayList<String>();//多态,泛型list为上转型对象,同时List<String>指定集合中元素数据类型只能为String类型。
//a.泛型,即在声明集合的时候,指定类集合中存放的数据类型。如果不指定,存放的是Object类型。因此这里必须使用引用类型,不能使用基础数据类型。
//b.不定义存放的数据类型,即可以存放所有类型的数据
AaaraList中提供的方法
/*List方法
size:返回集合长度
clear:清空数据
isEmpty:判断集合是否为空,空返回true,非空返回false
get:获得元素
set:设置新的元素
remove:删除某个元素
contain:判断某个元素在不在集合中*/
contains源码分析:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;
}
//如果是基本数据类型变量,调用的是包装类中的equals的方法
//如果是类类型,调用类类型中的equals方法。如果没有重写Object的equal方法,则调用的Object的equals方法
ArrayList特点
list数组是有序的,也就是说元素的存储顺序按照你的添加顺序进行存储,同时可以存储重复的数据,因为存储数据是按照输入顺序存储的,因此可以存储重复的数据,只是他们存储的位置不同,所以互相不会影响。
遍历
for(String s:names) {
System.out.println(s);
}
//使用多态定义集合
//泛型定义中只能使用Object及其子类,不能使用基础数据类型
List<Integer> I = new ArrayList<Integer>();
I.add(1);
I.add(2);
I.add(3);
I.add(4);
//迭代器遍历
Iterator<Integer> iterable = I.iterator();//将集合中的元素转存到迭代器中进行遍历
/**
* hasNext判断下一个集合元素是否为空,不为空返回true,为空返回false结束整个循环
* next,将指针向后移一位,并且将当前的数据返回
*/
while(iterable.hasNext()) {
System.out.println(iterable.next());
}
2.Set
Set集合与Map集合类似,而且在JVM中Set集合的某些方法也调用了Map集合中的方法。
声明方式
//与list声明方式一致
Set<String> set = new HashSet<String>();
/*
调用HashSet的构造方法,而在hashSet构造方法中,是将一HashMap对象赋值给map成员变量,由此完成hashSet的创建
public HashSet() {
map = new HashMap<>();
}
*/
方法:
与List方法一致,只是实现的方式不一样
1.add方法
set.add("zhangsan");/*JVM源码:
public boolean add(E e) {
return map.put(e,PRESENT)==null;
向map集合中hashmap容器添加数据PRESENT常量。hashset存储数
据本质是将数据存放到了hashmap集合中的key值中
}*/
遍历
Iterator<String> it = set.iterator();
while(it.hasNext()) {
System.out.println(it.next());
}
for(String s:set) {
System.out.println(s);
}
特点
1.list可以保存重复的数据,set不能保存重复的数据
* 2.list集合是根据存储顺序进行保存,但Set中的hashSet不是按照保存顺序,具有很强的不确定性
* TreeSet按照存储顺序进行存储,LinkSet是按照自然顺序进行存储,
3.Map
与前两个集合不同的是,Map存放的是键值对,一个键(key)对应一个值(value)。但是也不能重复的存储数据,如果输入重复的键值,就会将之前的value值覆盖掉。
声明
Map<String,Integer> score = new HashMap<String,Integer>();
方法
size:获取个数
* clear:清空 * isEmpty:判断是否为空
* replace:替换数据
* put(key,value):增加元素 //增加元素时,不允许重复key值,如果重复那么以最后为主,
* get(key):获取key值对应的数据
遍历
/*
* 遍历集合
* 1.将集合的key值存放到一个set集合中,之后遍历key值得到value值
* 2.将所有的键值对放到一个entry集合中,遍历entry集合进行遍历获得key值,之后通过key值获得value值
*/
/*
* 1.通过set集合获得key值。key之后进行输出
*/
Set<String> keys = score.keySet();
//增强for循环遍历
for(String key:keys) {
String Key = key;
System.out.println(score.get(Key));
}
//迭代器
Iterator<String> it = keys.iterator();
while(it.hasNext()) {
String key = it.next();
int i = score.get(key);
System.out.println(i);
}
/*
* 2.仍然使用一个Set集合进行接收,但是Set集合的类型是一个Entry<String,Integer>,也就是说将原先的HashMap的键值对放到
* Entry集合的键值对中。对Entry键值对进行遍历得到数据。
*/
Set<Entry<String, Integer>> entris = score.entrySet();
//增强for循环
for(Entry<String, Integer> entie:entris) {
//得到一个每一个键值对应的key
String key = entie.getKey();
//通过key值获得value值
int i = score.get(key);
System.out.println(i);
}
//迭代
/*
迭代器得到的是一个Entry集合,遍历返回的也是一个Entry类对象,得到该对象后,调用get值得到value值
*/
Iterator<Entry<String,Integer>> it2 = entris.iterator();
while(it2.hasNext()) {
Entry<String,Integer> key = it2.next();
//String Key = key.getKey();
int value = key.getValue();
System.out.println(value);
}
tring,Integer>> it2 = entris.iterator();
while(it2.hasNext()) {
Entry<String,Integer> key = it2.next();
//String Key = key.getKey();
int value = key.getValue();
System.out.println(value);
}