集合和泛型
学习集合要求掌握集合容器的:增加 删除 修改 查询(CRUD) 判断 遍历 这6种操作。
1.List, set, map 是不是都是继承与collection
不是,集合被分成Collection和Map两类,
Collection,List, Set,,Map都是接口,ArrayList和HashMap是他们的具体实现类
正常只使用ArrayList和HashMap
2.List集合和Set的区别
集合存储的不是基本数据类型而是对象
List接口存储一组不唯一,有序(插入顺序) 的对象
Set接口存储一组不唯,无序的对象
3.ArrayList和LinkedList的区别
ArrayList长度可变的数组,在内春中分配来连续的空间,遍历元素和随机访问元素的效率比较高
LinkedList采用链表存储方式,插入、删除元素时效率比较高
4.Set集合是如何保证存储数据的唯一性的
Set如何保证数据的唯一性:hashCode(),equals()
当给hashset中存放元素的时候会先调用对象的hashCode方法,计算哈希值,根据哈希值来决定当前对象在集合中的存储位置。
在存储时,如果两个值哈希值相同,调用equals方法,判断两个值是否相同,相同就不会继续存储,不同则会在
相同位置再开一个空间存储
5.HashMap存储数据的特点
特点:一次存一组数据,key一定要保证唯一,value是可以重复的
Map接口存储一组键对象,提供key和value的映射
Collection接口下的所有集合只能保存对象,但无法维护对象和对象之间的对应关系,统称为单列集合
Map集合主要用来保存具有一定对应关系的数据,这个一组对象之间有一定的对应关系,因此把Map集合称为双列集合。
6.如何对HashMap进行遍历
1.使用keySet(),将key全部提取组成一个set集合,再通过foreach循环取出来
2.使用entrySet(),获取map中所有的键值对组成一个set集合,在foreach中通过getKey()和getValue()拿到key,value
ArrayList
package collection1;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) {
// List接口的实现类:ArrayList、LinkedList
// ArrayList长度可变的数组,在内春中分配来连续的空间,遍历元素和随机访问元素的效率比较高
// LinkedList采用链表存储方式,插入、删除元素时效率比较高
// 存储的数据是有序的,可重复的
List list = new ArrayList(); //创建一个集合,这个集合底层是一个object类型的数组
// 添加数据
list.add("孔明");
list.add("刘备");
list.add(100);
list.add(200);
list.add(300);
System.out.println(list);
// 删除数据,有两种方法
list.remove(2); //1.根据下标删除,只要是数字就默认是下标
list.remove("刘备"); //2.根据内容删除,只会删除第一个
// Integer.valueOf():因为数字默认是下标,所以要将数字转换成对象操作
list.remove(Integer.valueOf(200));
System.out.println(list);
// 修改,注意最大的下标,使用add会扩容,使用set不会扩容
list.set(0, "关羽"); //通过下标来修改内容
System.out.println(list);
// 查询,get方法一定有返回值
Object obj = list.get(0);
System.out.println(obj);
// 判断
// 判断集合中是否包含一个对象,返回boolean值
boolean c = list.contains(10);
System.out.println(c);
// 长度:size()
int size = list.size();
System.out.println(size);
// 遍历 = 循环
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
for (Object o : list) {
System.out.println(o);
}
}
}
HashSet
package collection3;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class Demo_set {
public static void main(String[] args) {
// Set集合存储数据的特点:无序,不可重复,带hash的都是无序
// Set如何保证数据的唯一性:hashCode(),equals()
// 当给hashset中存放元素的时候会先调用对象的hashCode方法
// 计算哈希值,根据哈希值来决定当前对象在集合中的存储位置。
// 在存储时,如果两个值哈希值相同,调用equals方法,判断两个值是否相同
// 相同就不会继续存储,不同则会在相同位置再开一个空间存
Set set = new HashSet();
set.add("msksabb");
set.add("kadfghk");
set.add(354656);
set.add(346351);
System.out.println(set);
// Set没有get方法
// Set不能用for循环取出内容,因为他是无序的没有下标
// set集合的遍历方法:foreach,迭代器
for (Object o : set) {
System.out.println(o);
}
// 迭代器
Iterator i = set.iterator(); //获取迭代器对象
while (i.hasNext()) {
Object obj = i.next();
System.out.println(obj);
}
}
}
HashMap
package collection4;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Demo {
public static void main(String[] args) {
// Map集合
Map map = new HashMap();
// 新增
map.put("lili", "南京");
map.put("baba", "上海");
map.put("mama", "扬州");
System.out.println(map);
// 删除
map.remove("lili"); //通过key删除内容
System.out.println(map);
// 修改:Map中没有提供修改的方法,但我们可以利用可以的唯一性进行修改
map.put("baba", "杭州");
System.out.println(map);
// 查询:根据key获取value的数值,get(key)
Object obj = map.get("baba");
System.out.println(obj);
// size()获取key-value对应关系的个数
int size = map.size();
System.out.println(size);
// 判断:可以判断key或者判断value
// 判断map是否包含指定的key,有就返回true
boolean containsKey = map.containsKey("baba");
System.out.println(containsKey);
// 判断map是否包含指定的value,有就返回true
boolean containsValue = map.containsValue("杭州");
System.out.println(containsValue);
// 判断map集合是否为null,是就返回trun
boolean empty = map.isEmpty();
System.out.println(empty);
// 遍历:将容器中的每个值取出来
Set keys = map.keySet(); //将map中所有的key拿出来,组成一个set集合
for (Object key : keys) {
// 通过key来获取对应的值
Object value = map.get(key);
System.out.println(key+" ======== "+value);
}
System.out.println("=======================");
// entry是一个key,value结构,但他提供get方法
// Set集合现在存的是一组一组的键值对
Set entrys = map.entrySet(); //entrySet()将Map容器转换成Set容器
for (Object en : entrys) {
// 强制类型转换:将Object转换成entry类型
Entry e = (Entry)en;
// 通过getKey()拿到key
Object key = e.getKey();
// 通过getValue()拿到value
Object value = e.getValue();
System.out.println(key+" ======== "+value);
}
}
}
泛型
1:介绍
当把数据存储到集合中后,数据就会提升到Object类型,在取出的时候,取出来的数据依然Object类型,如果要使用对象特有功能,特有数据时,就需要向下转型,在取出集合中的元素时,由于元素的数据类型不统一,导致在转型的时候可能会报ClassCastException,为了不报异常可以使用泛型,在集合定义的时候让数据类型统一
2:简单运用
泛型技术,是编译时期技术,在编译源码的时候,会判断泛型指定的类型统一问题,当编译完成之后,生成的class文件中是没有泛型内容。
语法格式
<>尖括号中书写的类型是引用数据类型。不能是基本数据类型。
package collection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo {
public static void main(String[] args) {
// 这个集合只能存储字符串
List<String> list = new ArrayList<String>();
// map的key只能是字符串,value是Object
Map<String, Object> map = new HashMap<String, Object>();
}
}