起因 JDK1.4以前类型不明确 装入集合的类型都被当做Object对待,从而失去自己的类型 从集合中取出时往往需要转型,效率低,容易产生错误 解决办法 在定义集合的时候同时定义集合中的对象的类型 好处 增强程序的可读性和稳定性 示例 import java.util.*; public class Test{ public static void main(String[] args) { List<String> c = new ArrayList<String>();
Java JDK1.5: 泛型 新特性的讲解说明图片每博一文案听到过这样一句话:“三观没有标准。在乌鸦的世界里,天鹅也有罪。”环境、阅历的不同,造就了每个人独有的世界观、人生观、价值观。 泛型的设计背景集合容器类在设计阶段/声明阶段不能确定这个容器到底实际存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为 Object,JDK1.5 之后使用泛型来 解决。 从 JDK1.5 以后,java 引入了 “参数化类型 (Parameterized type)” 的概念,允许我们在创建集合时再指定集合元素的类型,正如: List<String> ,这表明该 List JDK1.5 改写了集合框架中全部接口和类,为这些接口,类增加了泛型支持,从而可以在声明集合变量,创建集合对象时传入 类型实参。2.
是指将变量的值一一列出来,变量的值只限于列举出来的值的范围内。举例:一周只有7天,一年只有12个月等。
第一个坑,idea在jdk1.5支持问题 使用Intellij Idea加载ysoserial的代码,将JDK版本更改为1.5,发现idea新版本不支持jdk1.5环境,没法调试代码。 idea11以jdk1.5导入ysoserial后,报一大堆错误,于是将几个必备的依赖jar包替换成较低版本的,以备可以兼容jdk1.5环境。 第3个坑 CC链不适用于JDK1.5 weblogic低版本应该是存在CC链的反序列化漏洞的,本地尝试了各种CC链,发现在JDK1.5下是没法弹计算器的。 发现weblogic9.x成功弹出计算器 Part3总结 Jdk7u21利用链可用于JDK1.5,但是必须以JDK1.5环境编译。 Weblogic9.x默认依赖于JDK1.5。 CC链貌似不能用于JDK1.5。 permit-reflect组件改源码,然后导入ysoserial中,因为官网的jar包版本不支持JDK1.5。
JDK1.5之前,我们如果想要使用Java线程来完成相关任务,一般涉及两个类,一个是Thread类,一个Thread对象在启动(start)之后会创建一个关联的本地操作系统线程,随后会自动回调run 因此,在JDK1.5的JUC包中,对Java的多线程应用做了一次全面的扩展,比如新lock锁、并发容器等,还有一个重要的扩展就是出现了Executor执行框架。 JDK1.5的时候,出现了Executor线程池。 异步执行结果 JDK1.5之前,在线程任务启动之后,对于线程任务监控几乎没有,我们不知道任务有没有完成,也没办法定义任务的返回值等一系列信息。 JDK1.5的时候,出现了Future接口以及它的各种实现。这个接口体系代表了线程任务异步计算的结果,通常与Callable线程任务连用。
在JDK1.5以下的版本,封装类只能当类来使用,也就是要new出对象才可以使用,但是在JDK1.5以后的版本则可以当做一个数据类型直接使用。 如果在JDK1.5以下的版本直接作为类型使用时就会报语法错误的。例如: ? JDK1.5以下版本: ? 直接作为类型申请就会报语法错误,只能构建对象来进行使用。 JDK1.5以上则两种都可以写: ?
自JDK1.5引入以来,Closeable已成为JavaI/O库乃至整个JDK生态中几乎所有可关闭资源(如InputStream,OutputStream,Socket,Channel等)的共同父接口。 从JDK1.5的统一契约,到JDK1.7的try-with-resources自动化,再到今天2026年云原生环境下对资源效率的极致追求,Closeable始终是构建可靠、高效Java应用不可或缺的一环
自动拆箱、装箱是从JDK1.5开始才有的特性,其实它主要就是指基本类型与包装类的自动转换。 如int 与Integer类型。 int 是基本类型,而Integer是int的包装类,在JDK1.5之前,int类型的值是不能直接赋给Integer类型的值 的,也就是说 Integer integer = 5; 会报错,因为5是基本类型 所以在JDK1.5开始,它们之间的转换不在须要程序员再去进行转换了,JDK已经将它自动进行了转换,这种操作就叫自动拆箱、装箱。 int i = 5; Integer ii = i; //这种写法在JDK1.5及以后的版本是正确的,因为系统会自动将int向Integer进行转换,这种操作就叫自动装箱。
前言 之前发布了关于java开发环境配置的文章,经过与网友的交流,我了解到在jdk1.5以后,java开发环境配置的时候,确实不需要对classpath进行配置,但市面上的书籍,以及一些博客、还是老一套 在JDK1.5以后,classpath并不是必须配置了,在JDK1.5之前,是没有办法在当前目录下加载类的(找不到 JDK目录下lib文件夹中的.jar文件),所以我们需要通过配置classpath,但 JDK1.5之后,JRE能自动搜索目录下类文件,并且加载dt.jar和tool.jar的类。 总结: 在JDK1.5之后的版本,配置Java环境变量的时候我们不再需要配置classpath,只需要配置Java_Home以及path即可!
Java开发环境不再需要配置classpath java入门请不要放弃.png 前言: 之前发布了关于java开发环境配置的文章,经过与网友的交流,我了解到在jdk1.5以后,java开发环境配置的时候 在JDK1.5以后,classpath并不是必须配置了,在JDK1.5之前,是没有办法在当前目录下加载类的(找不到 JDK目录下lib文件夹中的.jar文件),所以我们需要通过配置classpath,但 JDK1.5之后,JRE能自动搜索目录下类文件,并且加载dt.jar和tool.jar的类。 tool.jar这两种属于java平台自身的包就不需要添加到classpath中,只有一些第三方类或者自定义类需要,也并不推荐使用配置CLASSPATH的方法,更推荐使用-classpath选项 总结: 在JDK1.5
我们可以将这种差异解释为对自动装箱功能的滥用,而此功能自JDK1.5我们就已开始使用。先不管造成差异的原因,让我们来仔细琢磨下Java中“自动装箱”和“自动拆箱”的概念。 JDK1.5以后,编译器帮我们执行以上操作,所以我们节省了不少代码量。 ? JDK1.5以后,编译器已经自动改变上述代码段为以下代码: ? 因此,我们可以说我们的第一段代码已经被修改为下面的代码。
注意:jdk1.5 之后系统可以自动找到自带的类路径(dt.jar 和 tools.jar),而大多数人都是用 Eclipse 写程序,Eclipse 会自动配置开发者所编写的类路径,不设 classpath jdk1.5 之后就不用再配置 CLASSPATH 了。当然某时为了保证向下兼容,也可以配置上为好。 在 JDK1.5 之后的版本,配置 Java 环境变量的时候我们不再需要配置 classpath,只需要配置 JAVA_HOME 以及 path 即可! 在 JDK1.5 以后,CLASSPATH 并不是必须配置了,在 JDK1.5 之前,是没有办法在当前目录下加载类的(找不到 JDK 目录下 lib 文件夹中的 .jar 文件),所以我们需要通过配置 CLASSPATH,但 JDK1.5 之后,JRE 能自动搜索目录下类文件,并且加载 dt.jar 和 tool.jar 的类。
言归正传,进入本周总结: 一、一个古老的接口Enumeration jdk1.5之前的版本常用,jdk1.5以后,使用的是迭代器Iterator进行代替。 以后在维护系统时,很多代码是jdk1.5之前的代码,所以了解这个接口主要是为了熟悉此接口,避免以后的运维过程中不认识此接口。
List接口 2.1 特点:有序、对象可以重复 2.2 遍历方式 2.2.1 下标 2.2.2 foreach(>=jdk1.5) 2.2.3 迭代器Iterator 泛型 JDK1.5之后 以类型作为参数的类就叫泛型 作用:提高程序健壮性,简化代码 泛型的默认值是Object package com.zking.Collection.util 装箱、拆箱 值类型->引用类型 装箱 引用类型->值类型 拆箱 jdk1.5之后引入了自动装箱及自动拆箱功能 public static void main(String[ ] args) { //泛型:以类型作为参数的类叫做泛型 //作用:提高程序的健壮性、简化代码 //泛型的默认类型:object //JDK1.5 if(unm%2==0) { System.out.println(unm); } } //装箱、拆箱jdk1.5
2.2 遍历方式 2.2.1 下标 2.2.2 foreach(>=jdk1.5) 2.2.3 迭代器Iterator(原理) 2.3 List优化 泛型 JDK1.5之后 以类型作为参数的类就叫泛型 作用:提高程序健壮性,简化代码 泛型的默认值是Object package com.zking.Collection.util 装箱、拆箱 值类型->引用类型 装箱 引用类型->值类型 拆箱 jdk1.5之后引入了自动装箱及自动拆箱功能 public static void main(String[] args ) { //泛型:以类型作为参数的类叫做泛型 //作用:提高程序的健壮性、简化代码 //泛型的默认类型:object //JDK1.5之后 List lst=new ArrayList Integer.valueOf(val.toString()); //获取偶数 if(unm%2==0) { System.out.println(unm); } } //装箱、拆箱jdk1.5
在JDK1.5之前,可以通过继承实现这种泛型思想。 查看ArrayList(JDK1.5)之前的定义如下: public class ArrayList extends AbstractList implements List, RandomAccess 如下面的代码: //JDK1.5之前的ArrayList的用法 ArrayList arrayList = new ArrayList(); //可以随意添加任意类型的对象 arrayList.add java.lang.Integer at pers.hanchao.generics.before.BeforJDK5.main(BeforJDK5.java:29) 为了解决上面的问题,JDK1.5 22:15 INFO HelloWorld:67 - 5211314 2018-02-12 17:22:15 INFO HelloWorld:67 - 521 4.其他说明 泛型是向前兼容的:JDK1.5
XXXXXX of type XXXXXXXXX must override a superclass method 上网搜索原来原因是: 实现类里面使用了 @Override,那么在JDK1.5 Compiler compliance level : 1.6 查看发现设置是1.6,并非1.5,我很疑惑, 后来才发现原来是必须是将项目的JDK1.5改为1.6,关键是“项目”两个字, 我就点击“
JDK1.5之前的volatile JDK1.5之前,volatile还是比较好理解的,即volatile是设计被用来简单解决变量可见性的。听上去很玄乎?容我来说明一下。 ? 拼接代码 SharedObj so = new SharedObj; new CalcJob(so).start(); new ShowJob(so).start(); 看起来还不错,但是在JDK1.5 为此,JDK1.5做了一个巨大的改进。 JDK1.5之后的volatile JDK1.5实现了一个规范"JSR133"——Java Memory Model and Thread Specification Revision。 不过目前相信你能够理解,通过volatile关键字可以保证JDK1.5之前会出错的代码可以正确执行。 volatile足够了吗? 答案明显是否定的。
deprecated的方法和字段 Exceptions 方法表中 方法声明的异常 LocalVariableTable Code属性中 方法的局部变量描述 LocalVariableTypeTable 类中 JDK1.5 Synthetic 类中、方法表中、字段表中 标识方法或字段为编译器自动产生的 RuntimeVisibleAnnotations 类中、方法表中、字段表中 JDK1.5中新增的属性,为动态注解提供支持 RuntimeInvisibleAnnotations 类中、方法表中、字段表中 JDK1.5中新增的属性,作用与RuntimeVisibleAnnotations相反用于指明哪些注解是运行时不可见的。 RuntimeVisibleParameterAnnotations 方法表中 JDK1.5中新增的属性,作用与RuntimeVisibleAnnotations类似,只不过作用对象为方法的参数。 RuntimeInvisibleParameterAnnotations 方法表中 JDK1.5中新增的属性,作用与RuntimeInvisibleAnnotations类似,只不过作用对象为方法的参数
JDK1.5新增的enum关键字用于定义枚举类。 列出的实例系统会自动添加public static final修饰; 所有的枚举类都提供了一个values方法,该方法可以很方便地遍历所有的枚举值; JDK1.5中可以在switch表达式中使用枚举类的对象作为表达式