------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
集合:
集合可以分为Collection超级接口和Map超级接口两种类型。
特点:
1、可以存储不同数据类型的(其实集合一般存储的也是同一种类型),但只能存储引用类型。
2、集合的长度是可以变化的。
3、存储的元素都有对应的索引,从左边第一位以0开始,直到最后一个元素。
4、每一个集合都有自己的长度,从左边第一位以1开始,直到最后一个元素。
长度的获取方法:集合名.size();
Collection类型的集合:
Collection集合又分为两大类,List类型和Set类型的集合。
具体结构如下图:
List类型集合:
1、根据上图可知道此集合下的所有子类都是有“有序可重复”的特点。
A、有序:并不是说存储进集合后会自动排序,而是表示那个元素先被存储进集合,此元素就先出去,对应的是先进先出的关系。
B、可重复:是指集合里面的元素是可以重复出现的。
2、List集合下,有ArrayList、Vector、LinkedList三种常用集合类,每一个类又有其特点,使用时可以根据自己的需求去选择。如果对此集合类型理解得不深,可以抛开需求,直接使用ArrayList。
为什么需要集合呢?
因为数组长度固定,满足不了长度变化的需求,所以Java就提供了集合,每一个集合类中都具备有增删功能。那么为了获取元素,同时也提供了遍历功能。
ArrayList集合代码举例:
import java.util.ArrayList;
/**
* 需求:自定义String类型的集合,出现与"abc"字符串相同的元素删除掉。
*
* 此题充分体现了集合长度可变化的特性
*/
public class ListDemo {
public static void main(String[] args) {
//创建集合对象
ArrayList<String> al = new ArrayList<>();
//添加元素
al.add("Hello");
al.add("abc");
al.add("World");
al.add("Java");
al.add("abc");
System.out.println(al);
/**
* 未遍历删除之前输出集合:[Hello,abc,World,Java,abc]
* 是先添加Hello,打印在前的也是Hello,顺序依此类推并没有变化,且"abc"重复出现
* 所以这就List集合的有序性和重复性
*/
/**
* List集合下的子类有三种遍历方式:
* 1、获取迭代器遍历
* 2、增强for遍历
* 3、size()方法和get(int index)方法结合普通for循环
*
* 为了获取元素并删除元素,使用第三种方式
*/
for(int i=0;i<al.size();i++){
//获取元素并判断
if(al.get(i).equals("abc")){
//相同就进来删掉元素
al.remove(i);
}
}
System.out.println(al);//遍历删除后输出集合:[Hello,World,Java]
}
}
Set类型集合:
1、Set集合子类的特点是“无序且唯一”的特点。
A、无序:是指将元素添加进集合,打印出来的结果不是按先进先出的关系,而是按照某种排序方式输出。
B、唯一:则是指元素只能出现一个,不能有重复的。既然手动添加多个相同元素,集合也会自动把相同的消灭掉。
2、Set集合有HashSet和TreeSet两种常用集合类,在HashSet类下又有一个子类LinkedHashSet类,都各自有其特点。
HashSet:并不保证按照某种排序恒久不变的输出。
LinkedHashSet:即保证了有序性也保证了唯一性。
TreeSet:默认是按照自然排序,但也可以手动设置排序关系。
如果对此集合类型理解得不深,可以抛开需求,直接使用HashSet。
HashSet集合代码举例:
import java.util.HashSet;
public class SetDemo {
public static void main(String[] args) {
//创建集合对象
HashSet<Integer> hs = new HashSet<>();
hs.add(3);
hs.add(2);
hs.add(3);
hs.add(20);
hs.add(10);
System.out.println(hs);
/**
* 直接输出集合结果:[2,3,20,10]
* 此时发现集合添加和输出的顺序不同,而且"3"也只出现了一个
* 所以这就是Set集合的无序性和唯一性
*/
/**
* List集合下的子类有两种遍历方式:
* 1、获取迭代器遍历
* 2、增强for遍历
*/
//使用增强for遍历
for(Integer i:hs){
System.out.print(i+" ");
}
}
}
Map类型的集合:
特点:具有键值对关系。就是将键映射到值的对象,一个映射不能包含重复的键,每个键只能映射一个对应的值。
注意:如果一个集合添加同一个键的值多次,那么后面进来的值就会把前面的值顶出去,最后输出的结果是此键和最后一个值。
格式:Map<key,value>
Key -->此映射所维护的键的类型
Value -->映射值的类型
Map类型集合下有HashMap和TreeMap两个常用集合类:
具体结构如下图:
根据上图可以知道,Map类型集合的子类与Set类型集合的子类有异曲同工之妙,所以参照Set集合子类即可。
Map集合的遍历:
有两种方法:
1、键找值:
A、获取所有键的集合
B、遍历键的集合,得到每一个键
C、根据键到集合中去找值
以HashMap为例:
此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null 元素。
import java.util.HashMap;
import java.util.Set;
public class MapDemo {
public static void main(String[] args) {
//创建对象
HashMap<Integer, String> hm = new HashMap<>();
//添加元素,键和值要根据对应的类型添加,注意Map集合与Collection集合的添加方法不一样
hm.put(2,"WY");
hm.put(1, "HE");
hm.put(3, "MS");
hm.put(2, "LS");
//获取所有的键的集合
Set<Integer> set = hm.keySet();
//遍历键的集合,得到每一个键
for(Integer key:set){
//根据键到集合中获取值
String value = hm.get(key);
System.out.println(key+":"+value);
/**
* 输出结果:1:WY
* 2:LS
* 3:MS
* 此时并不是按添加的顺序输出,而是按某种顺序输出
* 键2出现两次,存储两次值,但该键只能出现一次,输出的是最后存储的值
* 所以Map集合具有无序性和唯一性
*/
}
}
}
2、键值对对象找键和值:
A、获取所有的键值对对象的集合
B、遍历键值对对象的集合,获取每一个键值对对象
C、根据键值对对象去获取键和值
以TreeMap集合为例:
默认使用元素的自然顺序对元素进行排序,或者根据特有的构造方法使用 Comparator
进行排序。
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class MapDemo {
public static void main(String[] args) {
//创建对象
TreeMap<Integer, String> tm = new TreeMap<>();
//添加元素
tm.put(2,"WY");
tm.put(1, "HE");
tm.put(3, "MS");
//获取所有的键值对对象的集合
Set<Map.Entry<Integer, String>> set = tm.entrySet();
//遍历键值对对象的集合,获取每一个键值对对象
for(Map.Entry<Integer, String> me:set){
//根据键值对对象去获取键和值
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+":"+value);
}
}
}
注意:此方法中getKey()和getValue()方法是在Map.Entry<K,V>接口中。
Collection和Map的区别:
1、Map 存储的是键值对形式的元素,键唯一,值可以重复。夫妻对
2、Collection 存储的是单独出现的元素,子接口Set元素唯一,子接口List元素可重复。光棍
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------