目的
了解泛型在Java开发中的应用,掌握Set接口和三个子类的实现,学习Map集合 key-value映射的方法使用
泛型
什么是泛型?泛型的本质是参数化类型,也就是说,泛型就是将所操作的数据类型作为参数的一种语法。泛型有很多种体现,我们可以定义泛型类,泛型方法,泛型数组等,我们只进行简单的了解
如定义一个泛型类
class GenericTest<T>{
int age;
T a1;
T a2;
public void test(T a1, T a2){
this.a1 = a1;
this.a2 = a2;
System.out.println(a1.equals(a2));
}
}
整体使用
public class MyClass {
public static void main(String[] args ){
GenericTest<String>g1 = new GenericTest<String>();
g1.test("jack","Merry");
}
Set
Set是一个不包含重复元素的集合,无序且唯一,Set接口有三个实现子类Hashset,LinkedHashSet,TreeSet。
HashSet
HashSet由哈希表支持,使用HashSet能够最快的获取集合中的元素,效率非常高(以空间换时间)。可以根据hashcode和equals来判断是否是同一个对象,如果hashcode一样,并且equals返回true,则是同一个对象,不能重复存放。
HashSet的一个使用示例
HashSet<String> names = new HashSet<>();
names.add("jack");
names.add("Merry");
names.add("abc");
names.removeIf(ele -> {
return ele.compareTo("c")>0;
});
TreeSet
TreeSet也不能存放重复对象,但是TreeSet会自动排序,使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序(TreeSet要添加哪个对象就在哪个对象类上面实现java.lang.Comparable接口,并且重写comparaTo()方法,返回0则表示是同一个对象,否则为不同对象。),具体取决于使用的构造方法.
TreeSet的一个使用示例
TreeSet<Person> score = new TreeSet<>(new Comparator<Person>() {
@Override
public int compare(Person person, Person t1) {
return person.compareTo(t1);
}
});
Person p1 = new Person("Jack",20);
Person p2 = new Person("Jack",30);
Person p3 = new Person("rose",20);
score.add(p1);
score.add(p2);
score.add(p3);
class Person implements Comparable{
String name;
int age;
public Person(String name, int age){
this.age = age;
this.name = name;
}
@Override
public String toString() {
return super.toString();
}
@Override
public int compareTo(Object o) {
//1.判断o对象是不是Person的一个对象6
if(o instanceof Person){
//自己规定比较的策略
Person o1 = (Person) o;
if(this.age != ((Person) o).age){
return this.age - o1.age;
}else{
//年龄相同的情况下 再比姓名和字母
return this.name.compareTo(o1.name);
}
}else{
return -1;
}
}
}
Map key-value映射(键值对)
Map集合没有继承Collection接口,但是其提供了key到value的映射(Map储存的是一对键值(key和value))。每一个key不能有相同,每个key只能映射一个value值。
注意点:
1.Map支持泛型,形式如:Map<K,V>
2.Map中使用put(K key,V value)方法添加
Map中的方法使用
1.添加对象:键值对
score.put("Chinese",89);
score.put("Math",96);
score.put("English",99);
2.因为每个key只能有一个,也可利用此特性进行value值的改换,如在上面代码的基础上再添加一行
score.put("Chinese",90);
所对应的value值改成了90
3.获取键值对的个数
score.size();
4.获取所有的key
System.out.println(score.keySet());
5.获取所有的value
System.out.println(score.values());
6.获取Entry;键值对
System.out.println(score.entrySet());
7.遍历,一共有两种遍历方法
通过遍历key来得到每一个key对应的值
for(String key: score.keySet()){
int s = score.get(key);
System.out.println("key:"+key+" value:"+s);
}
System.out.println(score);
通过EntrySet 得到Entry对象的集合
一个Entry管理一个键值对 getKey getValue
Set<Map.Entry<String,Integer>> entrys = score.entrySet();
for(Map.Entry entry:entrys){
String key = (String)entry.getKey();
//获取entry对应的值
Integer value = (Integer)entry.getValue();
}
异常处理(Exception)
程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。Java中提供一套处理机制的方法,我们称之为异常处理机制,它能让程序在异常发生时,按照代码的预先设定的异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并继续执行,且保持代码的清晰。异常处理有两种常用的方法
1.try{
}catch(异常类型,接收异常的对象){
}
在try的大括号中,填写执行的代码,这些代码可能出现异常,一旦出现异常 系统自动为我们创建一个异常类,并抛出,catch用来捕获异常,如果有多个异常,可有多个catch,来捕获异常,catch的顺序是从小到大
如果异常出现 后面的代码将不会被执行,所以 try代码块不要抓太多代码
代码示例
public class Exception1 {
public static void main(String[] args) {
int a = 0;
int b = 20;
FileReader fr = null;
try{
int c = b / 1;
System.out.println("hello");//不打印
FileReader fr2 =new FileReader("");
}catch (ArithmeticException e){
System.out.println(e.getMessage());
}
2.使用throws抛出异常 给外部处理,如果有多个异常 用逗号隔开
如
public static void main(String[] args) throws IOException {
...
}
多个异常时
public static void test() throws FileNotFoundException,NullPointerException{
....
}