1.集合框架概述
以前我们都是用数组来存储数据,但今天来认识一下集合框架,首先说说数组的一些明显缺陷
1.数组长度固定不变
2.可以通过.length来获取数组的长度,但无法获取其中真实的个数
3.数组采用在内存中分配连续空间的存储方式,根据下标可以找到对应的信息,但在查找的时候效率低下
2.JAVA集合框架包含的内容
接口:表示集合的抽象数据类型,Collection、List、Map、Iterator.
实现类:最常用的实现类:ArraysList、LinkedList、HashMap、HashSet.
算法:Java提供了对集合操作的类,Collections
2.1.Collection接口:存储一组不唯一(允许重复)、无序的对象.
2.2.Set接口继承Collection接口,存储一组唯一(不允许重复)、无序的对象
2.3.List接口继承了Collection接口,存储一组不唯一允许重复()、有序的对象(以元素插入时的顺序放置).
Map接口存储一组成对的键——值,提供Key(键)到Value(值)的映射。Map中的Key不要求有序,不允许重复,Value不要求有序,但允许重复。
Iterator接口是负责定义访问访问和遍历元素的接口。
/**
* 测试ArrayList的add()、size()、get()方法
* */
public class Test03 {
public static void main(String[] args) {
//1.创建狗狗的四个对象
Dog ououDog=new Dog("欧欧","雪瑞多");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","贵宾犬");
Dog feifeiDog=new Dog("菲菲","哈士奇");
//2.创建List对象 ArrayList对数组进行了封装,实现了长度可变的数组
//访问比较多的时候就用ArrayList,修改用LinkedList(实际开发中用ArrayList比较多)
//list是可以重复的而Set是不允许重复的 接口不能new只能new他的实现类
List<Dog> dogs=new ArrayList<Dog>(); //泛型集合
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.add(meimeiDog);
dogs.add(2,feifeiDog);//添加到第二个元素位置
//3.输出数量
System.out.println("狗狗的数量有"+dogs.size());
//4.通过遍历集合来显示狗狗信息
// for (int i = 0; i < dogs.size(); i++) {
// //向下转型需强制转换,返回的是Object类型
// Dog dog=(Dog)dogs.get(i);
// System.out.println(dog.getName()+"\t"+dog.getStrain());
// }
for (Dog dog : dogs) {
System.out.println(dog.getName()+"\t"+dog.getStrain());
}
System.out.println("-----------------");
//5.使用remove来删除*这里是有两种方式一种传的是对象或者index 细节:每次删除后再删除就是重新的集合了位置一定要注意
dogs.remove(0);
dogs.remove(feifeiDog);
System.out.println("狗狗的数量有"+dogs.size());
//6.删除通过遍历集合来显示狗狗信息
for (int i = 0; i < dogs.size(); i++) {
//向下转型需强制转换,返回的是Object类型
Dog dog=(Dog)dogs.get(i);
System.out.println(dog.getName()+"\t"+dog.getStrain());
}
//7.判断里面有没有这个类型 contains
System.out.println(dogs.contains(feifeiDog));
if(dogs.contains(yayaDog)){
System.out.println("有");
}else{
System.out.println("没有");
}
System.out.println("--------------");
//8.新建一个ArrayList集合赋值(这样会打乱里面元素的位置)
List<Dog> dogs2=new ArrayList<Dog>();
dogs2.addAll(dogs);
for (int i = 0; i < dogs2.size(); i++) {
Dog dog=(Dog)dogs.get(i);
System.out.println(dog.getName()+"\t"+dog.getStrain());
}
}
}
List接口中常用方法
/**
* 测试LinkedList的多个特殊方法
* */
public class Test04 {
public static void main(String[] args) {
//1.创建狗狗的四个对象
Dog ououDog=new Dog("欧欧","雪瑞多");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","贵宾犬");
Dog feifeiDog=new Dog("菲菲","哈士奇");
//2.创建LinkedList集合对象并把多个狗狗放入其中
LinkedList<Dog> dogs=new LinkedList<Dog>();
dogs.add(ououDog);
dogs.add(yayaDog);
dogs.addLast(meimeiDog);
dogs.addFirst(feifeiDog);
//3.查看集合中第一条狗狗的昵称 addLast是size()长度减一
Dog dogFrist=(Dog)dogs.getFirst();
System.out.println("第一条狗狗"+dogFrist.getName());
//4.查看集合中最后一条狗狗的昵称
Dog dogLast=(Dog)dogs.getLast();
System.out.println("第一条狗狗"+dogLast.getName());
//5.删除集合中第一条和最后一条狗狗
dogs.removeFirst();
dogs.removeLast();
//6.显示删除部分狗狗后集合中信息
System.out.println("还有几条狗狗"+dogs.size());
for (int i = 0; i < dogs.size(); i++) {
//向下转型需强制转换,返回的是Object类型
Dog dog=(Dog)dogs.get(i);
System.out.println(dog.getName()+"\t"+dog.getStrain());
}
}
}
LinkedList接口中的特殊方法
/**
* 测试HasMap的多个方法
* */
public class Test05 {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
//1.使用HasMap存储国家英文简称和中文 Map是接口只能new它的实现类
Map countries=new HashMap();
//put方法前面的是key后面是value
countries.put("CN", "中华人民共和国");
countries.put("UK", "英国");
countries.put("KR", "大韩民国");
countries.put("JP", "日本");
countries.put("AUS", "澳大利亚");
//2.显示CN对应国家的中文名称 返回的是Object类型需要强转
String country=(String)countries.get("CN");
System.out.println("CN对应的国家是"+country);
//3.显示集合中元素个数
System.out.println("Map中共有"+countries.size()+"组数据");
//4.两次判断Map是否存在FR键值 containsKey方法
System.out.println("Map中包含FR的key吗?"+countries.containsKey("UK"));
countries.remove("UK");
System.out.println("Map中包含FR的key吗?"+countries.containsKey("UK"));
//5.分别显示键集、值集和键-值对集 是全部显示
System.out.println(countries.keySet());
System.out.println(countries.values());
System.out.println(countries);
//6.清空HasMap并判断
countries.clear(); //清空集合里的数据
if(countries.isEmpty()){
System.out.println("已清空Map中数据");
}
}
}
Map的常用方法
Hashtable和HashMap的异同
Hashtable继承Dictionary类,HashMap实现了接口
Hashtable是线程安全,速度没有HashMap块,轻速度、重安全。HashMap线程是非安全的,重速度、轻安全
Hashtable不允许null值(Key和value都不允许),HashMap允许空值(Key和value都允许):开发中最好使用HashMap
Object next():返回要访问的下一个元素
/**
* 测试通过Iterator遍历HashMap
* */
public class Test06 {
public static void main(String[] args) {
//1.创建狗狗的四个对象
Dog ououDog=new Dog("欧欧","雪瑞多");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","贵宾犬");
Dog feifeiDog=new Dog("菲菲","哈士奇");
//2.创建Map集合对象并把多个狗狗对象放入其中
Map<String, Dog> dogMap=new HashMap<String, Dog>();
dogMap.put(ououDog.getName(), ououDog);
dogMap.put(yayaDog.getName(), yayaDog);
dogMap.put(meimeiDog.getName(), meimeiDog);
dogMap.put(feifeiDog.getName(), feifeiDog);
//3.通过迭代器依次输出集合中所有狗狗的信息
System.out.println("使用Iterator遍历,"+"所有狗狗的信息");
Set<String> keys=dogMap.keySet(); //取出所有key的集合
Iterator<String> it=keys.iterator(); //获取Iterator对象
while(it.hasNext()){
String key=(String)it.next();//取出key
Dog dog=(Dog)dogMap.get(key);//根据key取出对应的值
System.out.println(key+"\t"+dog.getStrain());
}
}
}
public class Test061 {
/**
* 使用Iterator遍历List
* */
public static void main(String[] args) {
//创建狗狗对象
Dog ououDog=new Dog("欧欧","雪瑞多");
Dog yayaDog=new Dog("亚亚","拉布拉多");
Dog meimeiDog=new Dog("美美","贵宾犬");
Dog feifeiDog=new Dog("菲菲","哈士奇");
//创建ArrayList集合对象并把对公狗狗放入其中
List<Dog> dog=new ArrayList<Dog>();
dog.add(ououDog);
dog.add(yayaDog);
dog.add(meimeiDog);
dog.add(feifeiDog);
//通过迭代器依次输出集合中所有狗狗的信息
Iterator<Dog> it=dog.iterator();
while(it.hasNext()){
//声明了上面的Iterator只能装Dog类型
Dog dogs=it.next();
System.out.println(dogs.getName()+"\t"+dogs.getStrain());
}
}
}
/**
* 基本类型转换成包装类型
* */
public class BaoZhuangLeiXing {
public static void main(String[] args) {
//定义ArrayList<Object>泛型集合
ArrayList<Object> list=new ArrayList<Object>();
list.add(12);
list.add(25.5);
list.add('男');
list.add(true);
}
}
总结
3.ArraysList和数组采用相同的存储方式,他的优点在于遍历元素和随机访问元素的效率较高。(查询较高,比LinkedList好),LinkedList采用链表方式存储方式,优点在于插入、删除元素时效率较高。(删除和插入等效率比ArraysList效率高)
4.Iterator为集合而生,专门实现集合的遍历。它隐藏各种集合实现类的内部细节提供了集合的统一编程接口。
5.Java中有八个包装类:Byte、Short、Integer、Long、Float、Double、Boolean、Character;
6.使用泛型集合可以避免,ClassCastException异常 。