Java泛型使⽤介绍
Java泛型介绍
1.为什么要使⽤泛型
前⾯章节我们讲到了集合的使⽤,我们发现⼀个共同的特征就是定义集合变量时通常都会⽤<>传⼊⼀个类型,如:
List<String> list =new ArrayList<>();
Set<Interger> set =new HashSet<>();
Map<Interger, String> map =new TreeMap();
这个<>传⼊的类型对集合中的元素的类型做了约束,⼜很⽅便的解决了元素⼀种集合可以很⽅便的存储各种元素。为了说明泛型上述的优点,我们⾃已实现了⼀个简单的字符串List类SimpleStringList。
package generics;
/**
* [简要描述]:简单的List
* [详细描述]:
*
* @author Smalight Lv
* @version 1.0, 2021/5/7 10:39
* @since JDK 1.8
*/
public class SimpleStringList {
private String[] data;//存放元素的数组
private final int maxSize =1000;//List最⼤容量
private int count;//当前元素数量
SimpleStringList(){
data =new String[maxSize];//分配存贮空间
count =0;//默认List为空,元素数量为0
}
//向List添加元素
public boolean add(String s){
if(count < maxSize){
data[count++]= s;
}else{
return false;
}
return true;
}
//获取List指定下标的元素值
public String get(int index){
checkIndex(index);
return data[index];
}
//判断List是否为空,为空返回true, 否则返回false
public boolean isEmpty(){
return count ==0;
}
/
/返回List⼤⼩,即List中元素的数量
public int size(){
return count;
}
//清空List
//清空List
public void clear(){
count =0;
}
//删除List中指定下标的元素
public boolean remove(int index){
checkIndex(index);
if(count -1- index >=0) System.arraycopy(data, index +1, data, index, count -1- index); data[count -1]= null;
count--;
return true;
}
@Override
public String toString(){
StringBuffer sb =new StringBuffer();
if(count ==0){
return"[]";
}
sb.append("[");
for(int i =0;; i++){
sb.append(data[i]);
if(i >= count -1){
return sb.append("]").toString();
}
sb.append(", ");
}
}
//检查下标是否合法
private void checkIndex(int index){
if(index <0|| index >= count){
throw new IndexOutOfBoundsException("下标越界");
}
}
}
package generics;
/**
* [简要描述]:泛型使⽤
* [详细描述]:
*
* @author Smalight Lv
* @version 1.0, 2021/5/7 10:38
* @since JDK 1.8
*/
public class GenericsTest001 {
public static void main(String[] args){
SimpleStringList list =new SimpleStringList();
list.add("秦可卿");
list.add("妙⽟");
list.add("史湘云");
System.out.println(list);
System.out.println("List⼤⼩:"+ list.size());
list.add("贾探春");
System.out.println(list);
System.out.println("List⼤⼩:"+ list.size());
System.out.println(list);
System.out.println("List是否为空:"+ list.isEmpty());
list.clear();
System.out.println("List是否为空:"+ list.isEmpty());
System.out.println(list);
System.out.println("List⼤⼩:"+ list.size());
}
}
运⾏结果:
[秦可卿,妙⽟,史湘云]
List⼤⼩:3
[秦可卿,妙⽟,史湘云,贾探春]
List⼤⼩:4
[秦可卿,史湘云,贾探春]
List是否为空:false
List是否为空:true
[]
List⼤⼩:0
上述代码我们实现了⼀个简⾳的字符串List的类,通过测试⽤例发现List可以实现List的基本功能。但是我们发现⼀个问题,我们的List只能处理String类的元素,如果我们要处理其他类型的元素,我们就要再写⼀个类。Java提供的类就有⼏千个,⽽且⽤户⾃定义的类数量太多了。我们想通过不断的编写不同的List去处理这些类的元素是不现实的。
当然我们可以写⼀个Object类为基础的List类,这样我们就可以放⼊任何类型的元素,不过这样的⽅式带来了新的问题,如:
list.add("贾元春");
list.add(1);
list.add(new MyClass());
我们发现List上可以放⼊任何类型的类,但是我们取出时会遇到⿇烦。遍历List时我不能预先知道该⽤什么类型的变量来获取相应的元素。如下⾯代码就会出现异常:
String str = (1);//会现现类型⽆法转换的异常。
基于以下两点,我们就需要引⼊泛型:
我们要按照⼀定规则处理各种类元素时,我们希望写⼀个通⽤的模板就可以处理所有类型的元素。
我们希望能对处理的元素做⼀定类型的约束,以避免不同类型的元素混杂时出现错误。
2.泛型使⽤⽅法
2.1在类中使⽤范型
在声明类时在类的名字后⾯⽤<;泛型类型>来说明该类是⼀个引⼊了泛型的类。泛型类型通常⽤⼀个⼤写字母表⽰。如,等。当然⼀个类也可以引⼊多个泛型,<T,K>, <T, M, K>等。在类的内部需要使⽤到范型的地⽅就⽤相应的泛型类型代替。如 T s;
我们前⾯使⽤到的List可以修改如下:
package generics;
/**
* [简要描述]:泛型简单List类
* [详细描述]:
*
* @author Smalight Lv
* @version 1.0, 2021/5/7 10:39
* @since JDK 1.8
*/
//使⽤<T>代表T是⼀个泛型,这个类中所有⽤到T类的地⽅都会被编译器⽤变量声明时⽤户传⼊的类代替
public class SimpleList<T>{
private Object[] data;//存放元素的数组,使⽤Object型
private final int maxSize =1000;
private int count;
SimpleList(){
data =new Object[maxSize];
count =0;
}
//向List添加元素
public boolean add(T s){
if(count < maxSize){
data[count++]= s;
}else{
return false;
}
return true;
}
//获取List指定下标的元素值
public T get(int index){
checkIndex(index);
return(T) data[index];
}
//判断List是否为空,为空返回true, 否则返回false
public boolean isEmpty(){
return count ==0;
}
//返回List⼤⼩,即List中元素的数量
public int size(){
return count;
}
//清空List
public void clear(){
count =0;
}
//删除List中指定下标的元素
//删除List中指定下标的元素
public boolean remove(int index){
checkIndex(index);
for(int i = index; i < count -1; i++){
data[i]= data[i+1];
}
data[count -1]= null;
count--;
return true;
}
@Override
public String toString(){
StringBuffer sb =new StringBuffer();
if(count ==0){
return"[]";
}
sb.append("[");
for(int i =0;; i++){
sb.append(data[i]);
if(i >= count -1){
return sb.append("]").toString();
}
sb.append(", ");
}
}
/
/检查下标是否合法
private void checkIndex(int index){
if(index <0|| index >= count){
throw new IndexOutOfBoundsException("下标越界");
}
}jdk怎么使用
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论