目录
1、泛型概述:是JDK5中引入的特性,它提供了编译时类型安全检测机制
一、泛型
1、泛型概述:是JDK5中引入的特性,它提供了编译时类型安全检测机制
2、泛型好处:
- 把运行时期的问题提前到了编译期间
- 避免了强制类型转换
3、泛型类
- 格式:l修饰符 class 类名<类型> { }
- 范例:
package com.gkl.service;
import java.util.ArrayList;
//泛型类
public class Generic<E> {
ArrayList<E> arrayList = new ArrayList<>();
private E value;
public E getValue() {
return value;
}
public void setValue(E value) {
this.value = value;
}
public void Add(E value) {
arrayList.add(value);
}
public void show(){
System.out.println(arrayList);
}
}
4、泛型方法
- 格式:修饰符 <类型> 返回值类型 方法名(类型 变量名) { }
- 范例:
ArrayList<E> arrayList = new ArrayList<>();public void Add(E value) { arrayList.add(value); }
5、泛型接口
泛型接口的使用方式:
- 实现类也不给泛型
- 实现类确定具体的数据类型
泛型接口的定义格式:
- 格式:修饰符 interface 接口名<类型> { }
- 范例:public interface Generic<T> { }
6、泛型通配符
类型通配符上限:<? extends 类型> :它表示的类型是Animal或者其子类型
package com.gkl.test;
import com.gkl.service.Animal;
import com.gkl.service.Cat;
import com.gkl.service.Dog;
import com.gkl.service.Generic;
import java.util.Date;
public class GenericDemo {
public static void main(String[] args) {
Generic generic = new Generic();
generic.setValue("gkl");
generic.Add(generic.getValue());
generic.setValue(new Date());
generic.Add(generic.getValue());
generic.setValue(123);
generic.Add(generic.getValue());
generic.show();
Generic<? extends Animal> generic1 = new Generic<>();
//可以使用 generic1.Add(new Dog());
//可以使用 generic1.Add(new Cat());
//可以使用 generic1.Add(new Animal());
//不行 generic1.Add(new Object());
}
}
类型通配符下限:<? super 类型> :它表示的类型是Animal或者其父类型
package com.gkl.test;
import com.gkl.service.Animal;
import com.gkl.service.Cat;
import com.gkl.service.Dog;
import com.gkl.service.Generic;
import java.util.Date;
public class GenericDemo {
public static void main(String[] args) {
Generic generic = new Generic();
generic.setValue("gkl");
generic.Add(generic.getValue());
generic.setValue(new Date());
generic.Add(generic.getValue());
generic.setValue(123);
generic.Add(generic.getValue());
generic.show();
Generic<? super Animal> generic2 = new Generic<>();
//不行 generic2.Add(new Dog());
//可以使用 generic2.Add(new Object());
}
}
二、Set集合
1、Set集合概述和特点
- 可以去除重复
- 存取顺序不一致
- 没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取,删除Set集合里面的元素
2、TreeSet集合概述和特点
- 不包含重复元素的集合
- 没有带索引的方法
- 可以将元素按照规则进行排序
- 自然排序Comparable的使用:使用空参构造创建TreeSet集合,自定义实现Comparable接口,重写里面的compareTo方法;
-
比较器排序Comparator的使用:lTreeSet的带参构造方法使用的比较器排序对元素进行排序的,比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法,重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写;
实现Comparator接口:
package com.gkl.service;
import com.gkl.entity.Translation;
import java.util.Comparator;
public class TranslateComparator implements Comparator {
@Override
public int compare(Object o1, Object o2) {
Translation translation1=(Translation) o1;
Translation translation2=(Translation) o2;
if (translation1.getEnglish().compareTo(translation2.getEnglish())>0){
return 1;
}
else if (translation1.getEnglish().compareTo(translation2.getEnglish())<0){
return -1;
}
return 0;
}
}
在TreeSet中使用该比较器排序:
Set<Translation> set = new TreeSet<>(translateComparator);
3、HashSet集合概述和特点
- 底层数据结构是哈希表
- 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致
- 没有带索引的方法,所以不能使用普通for循环遍历
- 由于是Set集合,所以元素唯一
哈希值:
- public int hashCode():返回对象的哈希码值
- 同一个对象多次调用hashCode()方法返回的哈希值是相同的
- 默认情况下,不同对象的哈希值是不同的。而重写hashCode()方法,可以实现让不同对象的哈希值相同
三、Map集合
1、Map集合概述
- Interface Map<K,V> K:键的数据类型;V:值的数据类型
- 键不能重复,值可以重复
- 键和值是一一对应的,每一个键只能找到自己对应的值
- 多态的方式
- 具体的实现类HashMap
2、Map的基本功能
方法名 | 说明 |
V put(K key,V value) | 添加元素 |
V remove(Object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(Object key) | 判断集合是否包含指定的键 |
boolean containsValue(Object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
Map集合的基本实现:
package com.gkl.service;
import com.gkl.entity.Translation;
import java.util.*;
public class TranslateTool {
TranslateComparator translateComparator=new TranslateComparator();
Map<String,Translation> map = new TreeMap(translateComparator);
public void FirstAdd(){
map.put("consider",new Translation("consider", "认为;考虑;体谅", "v.动词", "He was considering what to do next.他在考虑下一步怎么办。"));
map.put("involve",new Translation("involve", "使参加;包含;牵连", "v.动词", "There was a serious incident involving a group of youths.有一起涉及一群年轻人的严重事件。"));
map.put("function",new Translation("function", "n.功能;函数;vi.运行;起作用", "n.名词;vi.动词", "The function of the heart is to pump blood through the body.心脏的功能就是把血液输往全身。"));
map.put("responsible",new Translation("responsible", "需负责任的;承担责任的;重要的;有责任感的", "adj.形容词", "Mike is responsible for designing the entire project.迈克负责设计全部工程。"));
map.put("urgent",new Translation("urgent", "急迫的;紧要的", "adj.形容词", "The law is in urgent need of reform.这项法律亟待修订。"));
}
public Translation translate(String text) {
TranslateTool translateTool = new TranslateTool();
System.out.println(map);
Set<String> set= map.keySet();
Iterator<String> iterator = set.iterator();
boolean flog=false;
while (iterator.hasNext()) {
String string = iterator.next();
Translation translation=map.get(string);
if (string.equals(text)) {
return translation;
}else {
flog=true;
}
}
if (flog){
System.out.println("对不起,词库中没有该单词!请录入新的单词:");
Translation translation=translateTool.JoinWord();
map.put(text,translation);
System.out.println(map);
return translation;
}
return translateTool.translate(text);
}
public boolean OutSystem(String text){
if (text.equals("退出")||text.equals("0")){
return true;
}
return false;
}
public Translation JoinWord() {
Translation translation = new Translation();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入英文单词:");
translation.setEnglish(scanner.nextLine());
System.out.println("请输入中文单词意思:");
translation.setChinese(scanner.nextLine());
System.out.println("请输入单词词性:");
translation.setPart(scanner.nextLine());
System.out.println("请输入单词组成的例句:");
translation.setExample(scanner.nextLine());
return translation;
}
}