07java基础进阶之集合框架
原创
©著作权归作者所有:来自51CTO博客作者Denial_learn的原创作品,请联系作者获取转载授权,否则将追究法律责任
Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。
其中经常使用到的接口,如图所示:(就是用红框包起来的)
其中:Collections 提供了对集合进行排序、遍历等多种算法实现
Java集合框架包含的内容:
- Collection 接口存储一组不唯一,无序的对象
- List 接口存储一组不唯一,有序(插入顺序)的对象
例如:
- Set 接口存储一组唯一,无序的对象
例如: - Map接口存储一组键值对象,提供key到value的映射
例如:
List接口的实现类:
list 包含两个经常使用到的类:ArrayList和LinkedList
- ArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高
例如: - LinkedList采用链表存储方式。插入、删除元素时效率比较高
例如:
ArrayList集合类的使用:
创建ArrayList列表,并进行存储数据,以及获取长度和逐歌输出内容
//创建四个狗狗对象
… …
List dogs = new ArrayList(); //创建ArrayList对象并存储狗狗
dogs.add(ououDog);//通过add方法进行添加对象
dogs.add(yayaDog);//这里没有使用泛型,不能指定进行添加的类型
dogs.add(meimeiDog);
dogs.add(2, feifeiDog); // 添加feifeiDog到指定位置(2)
System.out.println("共计有" + dogs.size() + "条狗狗。");//size方法拿到这个列表内的存入的对象数目
System.out.println("分别是:");
for (int i = 0; i < dogs.size(); i++) {
Dog dog = (Dog) dogs.get(i);//逐个获取各个元素,没有使用泛指,所以在这里获取到内容之后,需要进行强制转换为Dog的对象类型
… …
}
使用ArrayList移除、判断元素
… …
dogs.remove(0); // 删除下标为0的元素
dogs.remove(feifeiDog);//删除指定狗狗
… …
if(dogs.contains(meimeiDog))//判断是否包含指定狗狗,返回值为boolean类型
System.out.println("\n集合中包含美美的信息");
else
System.out.println("\n集合中不包含美美的信息");
List接口常用方法:在这里插入图片描述
LinkedList集合类的使用:
创建LinkedList列表对象,通过add方法进行添加,获取第一条和最后一条元素信息,删除第一和最后元素(使用到的是LinkedList特有的方法)
// 创建多个狗狗对象
… …
LinkedList dogs = new LinkedList();//创建LinkedList集合对象
dogs.add(ououDog);
dogs.add(yayaDog);//存储狗狗对象
dogs.addLast(meimeiDog);//在第一个位置添加元素
dogs.addFirst(feifeiDog);//在最后一个位置添加元素
Dog dogFirst= (Dog)dogs.getFirst();//获取第一条狗狗信息
System.out.println("第一条狗狗昵称是"+dogFirst.getName() );
//上边也说过 这个没有使用到泛型,这里获取到元素之后,需要进行强制转换
Dog dogLast= (Dog)dogs.getLast();//获取最后一条狗狗信息
System.out.println("最后一条狗狗昵称是"+dogLast.getName());
dogs.removeFirst();//删除第一个狗狗
dogs.removeLast();//删除最后一个狗狗
LinkedList的特殊方法:
ArrayList和LinkedList的区别:
- ArrayList:长度可变的数组,存储空间连续
- LinkedList集合:链表式结构存储
- ArrayList:遍历和随机访问效率高
- LinkedList集合:插入和删除效率高
Map接口:
Map 当中存储的内容分为两个,统称为键值对,由key和value结合(key:value)
废话不多说,直接上代码!
Map countries = new HashMap();//使用HashMap存储多组键值对
countries.put("CN", "中华人民共和国");//Map的特有方法put,进行添加元素
countries.put("RU", "俄罗斯联邦");
countries.put("FR", "法兰西共和国");
countries.put("US", "美利坚合众国");
String country = (String) countries.get("CN");//获取指定元素的值 … …
System.out.println("Map中共有"+countries.size() +"组数据");//获取Map元素个数 ,size方法
countries.remove("FR");//删除指定元素
System.out.println("Map中包含FR的key吗?" +
countries.containsKey("FR"));//判断是否包含指定元素
System.out.println( countries.keySet() ) ;//keySet()显示键集,将所有的键,显示出来
System.out.println( countries.values() );//values()显示值集,将所有的内容(value),显示出来
System.out.println( countries );//显示键值对集,将所有的键值对,显示出来
Map接口常用方法:
迭代器Iterator:
获取Iterator :Collection 接口的iterator()方法
Iterator的方法:
- boolean hasNext(): 判断是否存在另一个可访问的元素
- Object next(): 返回要访问的下一个元素
遍历集合的方法:
以遍历map集合为例,解说迭代器和增强for循环的使用:
创建迭代器和进行遍历(没有进行传入元素,自行添加)
Set keys=dogMap.keySet(); //取出所有key的集合
Iterator 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());
}
先创建map,再进行使用增强for循环
语法:
for(元素类型t 元素变量x : 数组或集合对象){
引用了x的java语句
}
Map<Integer,Integer> a =new HashMap<Integer,Integer>;//创建一个Map,使用到了泛型
a.put(1,1);//添加键值对
a.put(2,2);
a.put(3,3);
a.put(4,4);
a.put(5,5);
//采用了增强的for循环
set b = a.keySet();//将所有的键,取出来保存在b中
for(object o : b){
system.out.print(o)
}
泛型集合:
//创建ArrayList集合对象并存储狗狗
List <Dog> dogs = new ArrayList<Dog>();//标记元素类型,笼统的来说就是那个<>里面存放的是数据类型的包装类,也可以是类;
dogs.add(dog1);
… …
//dogs.add("hello"); 类型不符,出现编译错误
// 显示第三个元素的信息
Dog dog = dogs.get(2); //无需类型强制转换
//使用foreach遍历dogs对象
for(Dog dog:dogs){//无需类型强制转换
… …
}
map当中的使用:
Map<String,Dog> dogMap=new HashMap<String,Dog>();//标记键-值类型<>里面存放的类型是键和值
dogMap.put(ououDog.getName(),ououDog);
… …
/*通过迭代器依次输出集合中所有狗狗的信息*/
Set<String> keys=dogMap.keySet(); //取出所有key的集合
Iterator<String> it=keys.iterator(); //获取Iterator对象
while(it.hasNext()){
String key=it.next(); //取出key,无需类型转换
Dog dog=dogMap.get(key); //根据key取出对应的值,无需类型转换
… …
}
//使用foreach语句输出集合中所有狗狗的信息
for(String key:keys){
Dog dog=dogMap.get(key); //根据key取出对应的值,无需类型转换
… …
}