泛型
定义
Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许程序员在编译时检测到非法的类型。
泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。
泛型方法
如何定义泛型方法
- 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分在方法返回类型之前(在下面例子中的
)。 - 每一个类型参数声明部分包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。
- 类型参数能被用来声明返回值类型,并且能作为泛型方法得到的实际参数类型的占位符。
- 泛型方法体的声明和其他方法一样。注意类型参数只能代表引用型类型,不能是原始类型(像int,double,char的等)。
public class GenericMethodTest
{
// 泛型方法 printArray
public static < E > void printArray( E[] inputArray )
{
// 输出数组元素
for ( E element : inputArray ){
System.out.printf( "%s ", element );
}
System.out.println();
}
public static void main( String args[] )
{
// 创建不同类型数组: Integer, Double 和 Character
Integer[] intArray = { 1, 2, 3, 4, 5 };
Double[] doubleArray = { 1.1, 2.2, 3.3, 4.4 };
Character[] charArray = { 'H', 'E', 'L', 'L', 'O' };
System.out.println( "整型数组元素为:" );
printArray( intArray ); // 传递一个整型数组
System.out.println( "\n双精度型数组元素为:" );
printArray( doubleArray ); // 传递一个双精度型数组
System.out.println( "\n字符型数组元素为:" );
printArray( charArray ); // 传递一个字符型数组
}
}
泛型类
和泛型方法一样,泛型类的类型参数声明部分也包含一个或多个类型参数,参数间用逗号隔开。一个泛型参数,也被称为一个类型变量,是用于指定一个泛型类型名称的标识符。因为他们接受一个或多个参数,这些类被称为参数化的类或参数化的类型。
public class MyClass {
public static void main(String[] args){
GenericTest g1 = new GenericTest<>();
g1.test("jack","jack");
}
//E或T都行
class GenericTest{
int age;
E a1;
E a2;
public void test(E a1,E a2){
this.a1 = a1;
this.a2 = a2;
System.out.println(a1.equals(a2));
}
}
集合(补充)
- 集合里面对象不能重复 如果重复 只加一次
内部使用HahMap来实现 键值对 键key不能重复 - 集合是无序的 添加的顺序和存储的顺序无关
使用了默认排序
哈希算法
如何实现HashMap里面的key不相同
计算这个key对应的对象的Hash值
整数:在对象的地址的基础上按照一定的算法算出来的一个整数 如果两个对象相同 那么计算出来的Hash值就相同
HashSet
HashSet names = new HashSet<>();
names.add("JACK");
names.add("MERY");
names.add("abc");
names.removeIf(ele ->{
return ele.compareTo("c") > 0;
});
//可以排序的集合
TreeSet score = new TreeSet<>();
score.add(32);
score.add(2);
score.add(3);
score.add(1);
System.out.println(score);
HashMap
HashMap 集合 存储数据的特点 键KEY值VALUE
key不能重复 可以是任意的对象类型 通常使用字符串String
HashMap score = new HashMap<>();
//添加对象
score.put("Chinese",89);
score.put("Math",94);
score.put("English",92);
//更改某个键对应的值
score.put("Chinese",95);
//获取键值对的个数
score.size();
//获取所有的key
System.out.println(score.keySet());
//获取所有的值
System.out.println(score.values());
//获取Entry:key - value
System.out.println(score.entrySet());
//获取一个键对应的值
System.out.println(score.get("English"));
键值对的遍历
//1.通过遍历key来得到每一个key对应的值
for(String key:score.keySet()){
int s = score.get(key);
System.out.println("key:"+key+"value:"+s);
}
//2.通过EntrySet得到Entry对象的集合
//一个Entry管理一个键值对getKey geyValue
Set> entrys = score.entrySet();
for(Map.Entry entry:entrys){
//得到entry对应的key
String key = (String)entry.getKey() ;
//获取Entry对应的值
Integer value = (Integer)entry.getValue();
System.out.println("key:"+key+" value:"+value);
}
异常处理
处理运行过程中出现的不可控的错误 使程序更健壮
Exception 类的层次
捕获异常
使用 try 和 catch 关键字可以捕获异常。try/catch 代码块放在异常可能发生的地方。
try/catch代码块中的代码称为保护代码。
try{
执行的代码
可能出现异常
一旦出现异常系统自动为我们创建一个异常对象 并抛出
}catch(){
如果需要自己处理异常就catch
}catch(){
如果有多个异常 可以用多个catch来捕获
如果有多个异常 catch的顺序是由小到大
}finally{
不管有没有异常 finally都会被执行
处理资源回收网络连接 数据库连接 I/O流
}
- 如果异常出现 后面的代码将不会执行
- try代码块 不要抓太多代码
throws/throw 关键字
如果一个方法没有捕获到一个检查性异常,那么该方法必须使用 throws 关键字来声明。throws 关键字放在方法签名的尾部。 一个方法可以声明抛出多个异常,多个异常之间用逗号隔开。
eg.
public class className
{
public void withdraw(double amount) throws RemoteException,
InsufficientFundsException
{
// Method implementation
}
//Remainder of class definition
}
体会
今天的内容较简单但有一些琐碎
感觉知识结构体系很混乱,可能需要整理一下