java学习的第六天:
4.2.5 泛型:
存储一个对象到集合后,集合会“忘记”这个对象的类型,当该对象从集合中取出时,这个对象的编 译类型就变成了 Object类型。那么在取出元素时,如果进行强制类型转换就很容易抛出异常。下面通过案例演示这种情况,如文件4-4所示。
package com.itheima.Example09;
import java.util.*;
public class example09 {
public static void main(String[] args) {
ArrayList list=new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add(18); //添加Integer类型
for(Object obj: list){
String str=(String) obj; //强制转换成String类型
}
}
结果如下:
在取出这些元素时,都将它们强制转换为 String类型,由于Integer对象不能转换为 String 类型,因此在程序运行时抛出了类转换异常。
为了解决这个问题,Java引入了“参数化类型(parameterizedtype)”这个概念,即泛型,它可以限定方法操作的数据类型,在定义集合类 时,使用“<参数化类型>”的方式指定该类中方法操作的数据类型。
ArrayList<参数化类型>list=new ArrayList<参数化类型>();
将 ArrayList list=new ArrayList();替换成 ArrayList<String> list=new ArrayList<String>();
将得到以下结果:
4.3set接口:
4.3.1 set接口简介
Set接口继承自 Collection接口,与 Collection接口中的方法基本一致,没有对Collection接口进行功能上的扩充,但比 Collection接口更加严格。与 List接口不同的是,Set接口中的元素无序,并且都会以某种规则保证存入的元素不会出现重复。 Set接口主要有两个实现类,分别是 HashSet和 TreeSet。
4.3.2Hashset集合:
HashSet按 Hash算法存储集合中的元素,(根据对象的哈希值确定元素在集合中的存储位置)因此具有很好的存取和查找性能,并且存储的元素是无序的和不可重复的。
package com.itheima.example11;
import java.util.*;
public class example11 {
public static void main(String[] args) {
HashSet hashSet =new HashSet(); //创建HashSet集合
hashSet.add("zhangsan");
hashSet.add("lisi");
hashSet.add("wangwu");
hashSet.add("lisi"); //添加重复元素
Iterator it=hashSet.iterator(); //得到Iterator对象
while(it.hasNext()){ //通过 while 循环,判断集合中是否有元素
Object obj=it.next(); //如果有元素,则使用迭代器的 next()方法获取元素
System.out.println(obj);
}
}
}
结果如下:
**注意:**HashSet集合不出现重复的元素的原因,是因为在向Set中添加对象时,会先调用此对象所在类的hashCode()方法,计算此对象的哈希值,此哈希值决定了此对象在 Set 中的存储位置。若此位置之前没有对象存储,则将这个对象直接存储到此位置。若此位置 已有对象存储,再通过equals()比较这两个对象是否相同,如果相同,则后一个对象就不能 再添加进来
4.4map接口:
4.4.1map接口简介:
Map集合是一种双列集合,集合中的每个元素都包含一个键对象Key和一个值对象Value,键和值是一一对应的关系,称为映射。也就是说,根据键就能找到对应的值,类似于生活中一张身份证对应一个人一样。
方 法 声 明 | 功 能 描 述 |
---|---|
Object remove(int index) | 删除index索引处的元素 |
void add(int index,Object element) | 将元素element插入到 List集合的index处 |
boolean addAll(int index,Collection c) | 将集合c所包含的所有元素插入到 List集合的index处 |
Object get(int index) | 返回集合索引index处的元素 |
Object set(int index,Object element) | 将索引index处元素替换成element对象,并将替换后的元素返回 |
int indexOf(Object o) | 返回对象o在 List集合中出现的位置索引 |
int lastIndexOf(Object o) | 返回对象o在 List集合中最后一次出现的位置索引 |
List subList(int fromIndex,int toIndex) | 返回从索引fromIndex(包括)到toIndex(不包括)处所有元素集合组成的子集合 |
4.4.2 HashMap集合:
HashMap集合是基于哈希表的 Map接口的实现,它用于存储键值映射关系,但不保证映射的顺序
package com.itheima.example11;
import java.util.*;
public class example11 {
public static void main(String[] args) {
HashMap hashMap =new HashMap(); //创建 HashMap 集合
hashMap.put("001","zhangsan"); //存储键和值
hashMap.put("002","lisi");
hashMap.put("003","wangwu");
Set keySet=hashMap.keySet(); //获取键的集合
Iterator it= keySet.iterator(); //迭代键的集合
while(it.hasNext()){
Object key=it.next();
Object value=hashMap.get(key); //获取每个键所对应的值
System.out.println(key+"="+value);
}
}
}
/*首先调用 HashMap集合的 KeySet()方法,获得存储 Map中所有键的 Set集合,然后通过Iterator迭代 Set集合的每一个元素,即每一个键,最后通过调用 get (Stringkey)方法,根据键获取对应的值*/
运行结果:
首先调用 HashMap集合的 KeySet()方法,获得存储 Map中所有键的 Set集合,然后通过Iterator迭代 Set集合的每一个元素,即每一个键,最后通过调用 get (Stringkey)方法,根据键获取对应的值
package com.itheima.example11;
import java.util.*;
public class example11 {
public static void main(String[] args) {
HashMap hashMap =new HashMap();
hashMap.put("001","zhangsan");
hashMap.put("002","lisi");
hashMap.put("003","wangwu");
Set entrySet=hashMap.entrySet();
Iterator it= entrySet.iterator();
while(it.hasNext()){
Map.Entry entry=(Map.Entry)it.next(); //获取集合中键值对映射关系
Object key=entry.getKey(); //获取 Entry 中的键
Object value=entry.getValue(); //获取 Entry 中的值
System.out.println(key+"="+value);
}
}
}
/*首先调用 Map对象的entrySet()方法获得存储在 Map中所有映射的 Set集合,这个集合中存放了 Map.Entry类型的元素(Entry是 Map内部接口),每个 Map. Entry对象代表 Map中的一个键值对,然后迭代 Set集合,获得每一个映射对象,并分别调 用映射对象的getKey()和getValue()方法获取键和值。*/
4.4.3 Properties 集合:
Properties主要用于存储字符串类型的键和值,由于 Properties类实现了 Map接口,因此,Properties类本质上是一种简单的 Map集合。在实际开发中,经常使用 Properties集合存取应用的配置项。
代码如下:
针对字符串的存取提供了两个专用的方法:setProperty() 和getProperty()。其中,setProperty()方法用于将配置项的键和值添加到 Properties集合 中,getProperty()方法用于根据键获取对应的值。在第10行代码中通过调用 Properties的 stringPropertyNames()方法得到一个所有键的 Set集合,然后在遍历所有的键 时,通过调用getProperty()方法获得键所对应的值。