1、集合
1.1、集合的定义
- 集合Java中提供的一种用来存储多个数据容器。
1.2、集合的特点
- 对象封装数据,集合用于储存对象。
- 集合是可变长度的。
1.3、集合与数据的区别
- 数组的长度的固定的,集合的长度是可变的。
- 数据可以存储基本数据类型和引用数据类型,但是集合只能储存引用数据类型。
- 数组存储的元素必须是同一个数据类型,集合存储的对象可以是不同的数据类型。
1.4、Collection的分类
Collection接口的子类口:List接口,Queue接口,Set接口。
List接口的实现类有:ArrayList、LinkedList、Stack和Vector。
Set接口的实现类有:HashSet、TreeSet和LinkedHashSet
2、List接口
- List接口的实现类有:ArrayList、LinkedList、Stack和Vector
- 一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以重复,可以插入多个null元素
2.1、泛型的定义
- <>是泛型,用于限制集合中所能保存的数据类型。
- 不同点是泛型的大小是可以自动的变长变短,而数组不可以。
List接口常用的实现类有 ArrayList、LinkedList。
LinkedList和ArrayList由于都是接口List的实现类,所以他们中定义的方法多半都是相同的,可能其中实现的方法不一样,但是功能都是相同的。
2.2、ArrayList添加数据获取集合元素大小方法
方法:集合名.add(e);添加元素
方法:集合名.size();
ArrayList<String> names = new ArrayList<String>();,//等效于数组中元素类型String [] names = new String[];
names.add("xxxx");//向集合中添加数据
names.add("xxx");
names.add("xxxx");
int size = names.size();//获取集合元素大小
System.out.println(size);
2.3、LinkList添加数据获取集合元素大小方法
方法:集合名.add(e);添加元素
方法:集合名.size();
LinkedList<String> namess = new LinkedList<String>();
namess.add("xxxx");//向集合中添加数据
namess.add("xxx");
namess.add("xxxx");
int size1 = namess.size();//获取集合元素大小
System.out.println(size1);
因为ArrayList于LinkList都差不多,我们以ArrayList来讲解,会一个便可知道另一个。
2.4、ArrayList判断是否有函数方法于清空方法
方法:集合名.isEmpty();
方法:集合名.clear();
ArrayList<String> names = new ArrayList<String>();
boolean f= names.isEmpty();//用于判断集合中是否有元素,没有true,有flase
System.out.println(f);
names.clear();//用于清空集合中的元素
2.5、ArrayList的遍历方法
2.5.1、for循环遍历
ArrayList<String> names = new ArrayList<String>();
names.add("xxxx");
names.add("xxx");
names.add("xxxx");
for(int i=0;i<names.size();i++) {
String n = names.get(i);//get方法获取元素方法
System.out.println(n);
}
2.5.2、加强循环遍历
ArrayList<String> names = new ArrayList<String>();
names.add("xxxx");
names.add("xxx");
names.add("xxxx");
for(String str:names) {
System.out.println(str);
}
2.5.3、迭代器遍历
ArrayList<String> names = new ArrayList<String>();
names.add("xxxx");
names.add("xxx");
Iterator<String> iterator = names.iterator();//将集合中数据做转存
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
- hasNext() -判断集合中是否有下一个元素。
- 有的话,就下移并打印出来。
2.6、add方法于set方法
2.6.1、方法:集合名.add(index,element);
List<String> list = new ArrayList<String>();
list.add("xxxx");//多态
list.add("xxx");
list.add(1, "xxxxx");//向特定位置存储数据,原来位置的数据会顺次后移
System.out.println(list);
- ArrayList是List的实现类,所以这时候编译和运行就不一样了,所以其中就存在着多态。
- 方法:集合名.add(index,element);-向特定位置存储数据,原来位置的数据会顺次后移
- 执行结果:输出为[xxxx xxxxx xxx]。
2.6.2、方法:集合名.set(index,element);
List<String> list = new ArrayList<String>();
list.add("xxxx");
list.add("xxx");
list.set(1,"x");
System.out.println(list);
- 方法:集合名.set(index,element);-将指定位置的元素替换成新的元素
- 执行结果:输出为[xxxx x]
3、Set接口
- 一个无序(存入和取出顺序有可能不一致)容器,不可以存储重复元素,只允许存入一个null元素,必须保证元素唯一性。
3.1、Set方法
- 与List类似也拥有add方法,isEmpty方法,clear方法。但是有些方法是没有的。
3.2、Set接口于List接口的区别
3.2.1 、List集合可以保存重复的数据,但是Set不行
Set<String> names = new HashSet<String>();
names.add("Jim");
names.add("Jim");
names.add("kake");
int size = names.size();
System.out.println(size);
- 输出结果:为size的大小为2。进一步证明了Set接口不允许重复的数据。
3.2.2、List集合是按照存储的顺序储存的,Set集合不是。
- Set中HashSet不是按照储存的顺序保存的,具有不确定性;LinkedHashSet是按照用户储存的顺序储存,TreeSet按照自然顺序储存。
Set<String> names = new HashSet<String>();
names.add("Jim");
names.add("John");
names.add("kake");
System.out.println(names);
执行结果如下:循序是不确定的。
3.3、Set接口的遍历方法
- 因为Set集合中他的顺序的不确定的,也没有get方法,所以不能用传统for循环去遍历。
3.3.1、加强循环遍历
Set<String> names = new HashSet<String>();
names.add("Jim");
names.add("John");
names.add("kake");
for(String name: names) {
System.out.println(name);
}
3.3.2、迭代器遍历
Set<String> names = new HashSet<String>();
names.add("Jim");
names.add("John");
names.add("kake");
I terator<String> iterator = names.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
3.4、Set接口add方法的调用
Set<String> names = new HashSet<String>();//调用了HashSet的构造方法
//public HashSet(){
// map = new HashSet();//为了map成员变量赋值,HashMap对象
//}
names.add("Jim");//源码
// public boolean add(E e) {
// return map.put(e, PRESENT)==null;//向Map集合中HashMap容器中添加数据PRESENT为常量,本质:HashSet储存数据时本质时储存到HashMap集合的key
// }
4、Map集合
- Map 的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、Properties。
- Map是一个键值对集合,存储键、值和之间的映射。 Key无序,唯一;value 不要求有序,允许重复。
- 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。
4.1、Map方法
4.1.1、添加数据
方法:集合名.put();
Map<String,Integer> socre = new HashMap<String,Integer>();
socre.put("John", 100);//添加数据
socre.put("kata", 60);
socre.put("John", 60);//Map不允许重复,重复的以最后的一个为主
- 在Map集合中,<String(key),Integer(value)>,其中String用于限定key的数据类型,Integer显示value的数据类型,泛型不能使用基本数据类型
- 在Map集合中,是不允许重复的,如果有重复以最后一个添加数据为主
4.1.2、获取数据
Map<String,Integer> socre = new HashMap<String,Integer>();
int scores = socre.get("John");//获取John的value数据
System.out.println(scores);
4.1.3、其他方法
Map<String,Integer> socre = new HashMap<String,Integer>();
int size = socre.size();
System.out.println(size);
socre.clear();//清空集合
size = socre.size();
System.out.println(size);
boolean flag = socre.isEmpty();//判断是否为空
System.out.println(flag);
socre.put("Jim", 100);
socre.replace("Jim", 0);//替换
scores = socre.get("Jim");
System.out.println(scores);
4.2、遍历方法
4.2.1、加强循环遍历
//加强循环
for(String key : names) {
int value = socre.get(key);
System.out.println(value);
}
4.2.2、迭代器遍历
//迭代器
Iterator<String> iterator = names.iterator();
while(iterator.hasNext()) {
String key = iterator.next();
int value = socre.get(key);
System.out.println(value);
}