继续谈谈java中的Key

1.KeyGenerator的使用。

如下

static Key genKey(byte[] key){
		//获取AES算法的KeyGenerator实例对象
		KeyGenerator kg = KeyGenerator.getInstance("AES");
		//获取SecureRandom对象
		SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
		//设置种子
		random.setSeed(key);
		//初始化key生成器
		kg.init(128, random);
		//获取秘钥对象
		SecretKey secretKey = kg.generateKey();
		//获取秘钥字节数组
		byte[] enCodeFormat = secretKey.getEncoded();
		//返回使用AES秘钥加密的对象
		return new SecretKeySpec(enCodeFormat,"AES");
}

 

2 MessageDigest类使用,

消息摘要是采用任意大小的数据并输出固定长度散列值的安全单向散列函数

javadoc中支持的算法有:

<p> Every implementation of the Java platform is required to support
 * the following standard {@code MessageDigest} algorithms:
 * <ul>
 * <li>{@code MD5}</li>
 * <li>{@code SHA-1}</li>
 * <li>{@code SHA-256}</li>
 * </ul>

 但是java平台支持的摘要算法远远不止这些。

//MessageDigest对象初始化

MessageDigest md = MessageDigest.getInstance("MD5");

//摘要计算

byte[] result =  md.digest(byte[]  data)

 

 

SHA-256 加密返回的字节数组长度固定为32,一个字节长度是8位 ,32*8=256位,SHA256 算法的哈希值大小为 256 位。

 

以下两段代码的意思一样:

//转为两位的16进制
byte b = -5;
//将一个负数转化为256+b
Integer.toString(( b & 0xff) + 0x100, 16).subString(1)
//转为两位的16进制
String str;
String tempStr = (Integer.toHexString(b & 0xff));
if (tempStr.length() == 1) {
    str = str + "0" + tempStr;
}
else {
    str = str + tempStr;
}

 

 

<think>嗯,用户让我谈谈Java的泛型,我需要先理清楚泛型的基本概念和作用。泛型是Java SE 5引入的一个重要特性,主要是为了提高代码的类型安全性和重用性。首先,我应该解释什么是泛型,为什么要用泛型,以及它解决了什么问题。 用户可能对泛型有基本的了解,但需要更深入的解释。比如,在没有泛型之前,集合类使用Object来存储元素,这样会导致取出时需要强制类型转换,容易出错。泛型通过类型参数化,让编译器在编译时检查类型,避免运行时错误。这时候需要举一个例子,比如List<String>这样只能添加字符串,取出时不需要强制转换。 接下来,可能需要介绍泛型的使用方式,比如泛型类、泛型接口和泛型方法。例如,泛型类的定义是public class Box<T> { ... },而泛型方法可以是public <T> void method(T t) { ... }。要说明类型参数的作用域,比如类上的T和方法上的T是不同的。 然后,用户可能想了解类型通配符,比如<? extends T>和<? super T>,也就是上界和下界通配符。这部分有点复杂,需要解释PECS原则(Producer Extends, Consumer Super),比如在读取数据时使用extends,写入时使用super。例如,List<? extends Number>可以接受Number的子类列表,而List<? super Integer>可以接受Integer的父类列表。 还有类型擦除的问题,Java的泛型是通过类型擦除实现的,这意味着在运行时泛型类型信息会被擦除,转换成原始类型。例如,List<String>在运行时只是List,而泛型类型参数String会被擦除。这可能导致一些限制,比如不能实例化泛型类型参数,如new T()是不允许的,因为运行时无法知道具体的类型。 另外,可能需要提到泛型的一些限制,比如不能使用基本类型作为类型参数,必须使用包装类;不能创建泛型数组;不能抛出或捕获泛型类的实例等。这些限制都是由于类型擦除导致的。 用户可能对泛型的实际应用场景感兴趣,比如在集合框架中的广泛使用,或者如何设计泛型类和方法来提高代码的灵活性和安全性。比如,Collections工具类中的很多方法都是泛型方法,如Collections.sort(),Comparator接口也是泛型接口。 还有可能涉及到泛型与反射的结合使用,但由于类型擦除,反射获取泛型信息比较困难,可能需要通过TypeToken等方式来保留类型信息,比如Gson库中的TypeToken。 最后,需要总结泛型的好处:类型安全,减少类型转换,提高代码重用性,同时也要指出其局限性,比如类型擦除带来的某些不便。 在解释过程中,要注意使用具体的例子来帮助理解,避免过于抽象。同时,检查是否有遗漏的重要概念,比如通配符的使用场景,类型擦除的具体机制,以及泛型在实际项目中的应用实例。 可能用户在学习过程中遇到了泛型的困惑,比如类型擦除导致的运行时类型信息丢失,或者在使用泛型时遇到的编译器错误,需要解释清楚这些现象背后的原因,以及如何正确使用泛型来避免这些问题。 总之,结构上应该从基本概念入手,逐步深入到高级特性和使用技巧,同时结合实际例子和常见问题,帮助用户全面理解Java泛型的核心内容和应用方法。</think>Java泛型是JDK 5引入的一项重要特性,它通过参数化类型的概念增强了代码的类型安全性和重用性。以下从6个关键维度系统解析泛型: 1. **核心价值** - 编译期类型检查:编译器验证集合元素的类型合法性,避免ClassCastException ```java List<String> names = new ArrayList<>(); names.add("Alice"); // 合法 names.add(123); // 编译错误 ``` - 消除类型强制转换:自动处理类型转换逻辑 ```java List<String> oldList = new ArrayList(); String s = (String)oldList.get(0); // 泛型前需要强制转换 List<String> newList = new ArrayList<>(); String s = newList.get(0); // 泛型自动处理 ``` 2. **实现架构** - 类型参数化:用<T>声明类型占位符 ```java public class Box<T> { private T content; public void set(T t) { this.content = t; } public T get() { return content; } } ``` - 类型擦除机制:运行时泛型信息被擦除为原始类型 ```java // 编译时类型检查 List<String> list = new ArrayList<>(); // 运行时等价于 List list = new ArrayList(); ``` 3. **应用形态** - 泛型类(核心容器实现) ```java public class Pair<K, V> { private K key; private V value; // 构造器及方法 } ``` - 泛型方法(工具类常用) ```java public static <T> T getMiddle(T[] a) { return a[a.length/2]; } ``` - 泛型接口(Comparable典型) ```java public interface Comparator<T> { int compare(T o1, T o2); } ``` 4. **通配符系统** - 上界通配符:<? extends T> 适用于生产者场景 ```java void processNumbers(List<? extends Number> list) { Number n = list.get(0); // 安全读取 } ``` - 下界通配符:<? super T> 适用于消费者场景 ```java void addIntegers(List<? super Integer> list) { list.add(Integer.valueOf(42)); // 安全写入 } ``` 5. **约束与局限** - 类型擦除导致的限制 ```java // 编译错误:不能实例化类型参数 public <T> void create() { T obj = new T(); } // 编译错误:不可用基本类型参数 List<int> primitiveList; ``` - 数组限制 ```java // 编译错误:不能创建泛型数组 List<String>[] array = new List<String>[10]; ``` 6. **进阶模式** - 边界类型参数(类型约束) ```java public static <T extends Comparable<T>> T max(Collection<T> coll) { // 实现比较逻辑 } ``` - 类型安全的异构容器 ```java class TypeSafeContainer { private Map<Class<?>, Object> map = new HashMap<>(); public <T> void put(Class<T> type, T instance) { map.put(type, type.cast(instance)); } public <T> T get(Class<T> type) { return type.cast(map.get(type)); } } ``` **最佳实践建议** 1. 优先使用泛型方法而非Object类型转换 2. 在API设计中合理使用边界通配符提升灵活性 3. 避免在泛型代码中使用原生类型(raw types) 4. 利用@SuppressWarnings("unchecked")时需严格限定作用域 通过合理运用泛型,开发者可以构建出更健壮、更易维护的代码体系。尽管存在类型擦除等实现限制,但泛型仍然是现代Java工程中不可或缺的核心技术要素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值