JAVA9新特性
JAVA9新特性
概述
经过4次推迟,历经曲折的Java9最终在2017年9月21日发布。因为里面加入的模块化系统,在最初设想的时候并没有想过那么复杂,花费的时间超出预估时间。距离java8大约三年时间。
Java 9提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的REPL工具: jshell, JDK编译工具,语法层面的改变:Java公共API和私有代码,以及安全增强、扩展提升、性能管理改善等。可以说Java 9是一个庞大的系统工程,完全做了一个整体改变。
但是这个巨大改变的功劳,都给了java11了,目前oracle对8,11都长期支持,9,10不支持了,只能从历史版本(http://jdk.java.net/)中下载,Java 11 将会获得 Oracle 提供的长期支持服务,直至2026年9月。
从Java9这个版本开始,Java 的计划发布周期是6个月,下一个Java的主版本将于2018年3月发布,命名为Java18.3(java10), 紧接着再过六个月将发布Java18.9(java11).
这意味着Java的更新从传统的以特性驱动的发布周期,转变为以时间驱动的(6个月为周期)发布模式(更快的时间周期,oracle的理念就是小步快跑,快速迭代,像IBM(DB2数据库,保守型内部测试才投入市场)),并逐步的将Oracle JDK原商业特性进行开源。针对企业客户的需求,Oracle将以三年为周期发布长期支持版本(long term support)
- 重大改变:
1 模块化系统
2 jShell命令- 语法层面改变:
1 接口私有方法
2 钻石操作符(泛型<>)使用升级
3 语法改进:try语句- API层面变化:
1 String存储结构变更 (从char类型数组变为byte类型数组)
2 集合特性:of()
3 增强的Stream API(不断迭代,要重视这个Stream)
4 全新的HTTP客户端API(不仅支持HTTP1.1而且还支持HTTP2:从5 以前的HttpUrlConnection-变为现在的HttpClient)
6 Deprecated的 API- 其它变化:
1 javadoc的HTML5支持
2 Js引擎升级:Nashorn(9对8升级了,但是11里又没有了)
3 java的动态编译器
4 多版本兼容jar包
官方提供的新特性的列表
https://docs.oracle.com/javase/9/whatsnew/toc.htm#JSNEW-GUID-C23AFD78-C777-460B-8ACE-58BE5EA681F6
openJDK 可参考源码
http://openjdk.java.net/projects/jdk9/
在线 OracleJDK Documentation 在线文档
https://docs.oracle.com/javase/9/
JDK和JRE的目录的改变
bin 包含命令行开发和调试工具 如javac jar javadoc
include 包含编译本地代码时使用的c/c++头部文件
lib 包含JDK工具的几个jar和其他类型的文件,他有一个tools.jar文件,其中含javac编译器的java类
jre/bin目录 包含基本指令,如java指令,在windows平台上,它包含系统的运行时动态链接
jre/lib包含用户可编辑的配置文件,如properties和.policy文件,包含几个jar文件,rt.jar文件包含运行时的java类和资源文件
bin 包含所有指令,在windows平台上,他继续包含系统的运行时动态链接
conf目录 包含用户可编辑的配置文件,例如之前位于jre/lib目录中的.properties和policy
includes 包含在以前编译本地代码时使用c/c++头文件,他只存在于JDK中
jmods 包含JMOD格式的平台模块,创建自定义运行时映像需要他,它只存在于jdk中
legal 法律声明
lib 包含非windows平台上的动态链接本地库,其子目录和文件不应由开发人员直接编译或使用
从9开始以后的JDK目录结构都是如此
一 语法层次的改变
1_钻石操作符号语法升级
钻石操作符,就是我们泛型使用的符号<>
JAVA8 中,匿名内部类不能使用钻石操作符,如下代码在JAVA8 中是报错的,匿名内部类这里不支持泛型推断,重写的方法不明确泛型
这里匿名内部类中的<>号里必须要和前面的声明保持一致,不能空着不写,这样重写的方法就根据匿名内部类的泛型
但是这种写法在JAVA9 中就允许了
而且在JAVA9中,匿名内部类的语法不仅仅可以用于接口和抽象类,普通类也可以通过匿名内部类写法,在某个实例上完成对某个方法的重写
public class Demo1 {public static void main(String[] args) {/** 匿名内部类仅仅在接口和抽象类上使用,作为一种快速的实现方式* JAVA9中,普通类也可以借助这种语法形式实现对方法的快速临时的重写* */Person<String> person=new Person<>(){@Overridepublic void eat(String s) {super.eat(s);}};person.eat("包子");}
}
class Person<T>{public void eat(T t){System.out.println("Person eat");}
}
2_try结构语法升级
普通的try catch finally语句 要释放的资源可以放到finally语句块中
InputStreamReader reader =null;try{reader =new InputStreamReader(System.in);int read = reader.read();}catch (Exception e){throw new RuntimeException(e);}finally {// 这里可以释放资源if(null != reader){try {reader.close();} catch (IOException e) {e.printStackTrace();}}}
JAVA 8中已经对try语法进行了升级,可以将要释放的资源放到try后面的小括号中,这样就不用通过finally语句块释放资源了,但是要求执行后必须关闭的资源一定要放在try子句中进行初始化,否则编译不通过. 下面的案例中,reader必须放在try后面的小括号中进行初始化
try( InputStreamReader reader=new InputStreamReader(System.in) ){int read = reader.read();}catch (Exception e){throw new RuntimeException(e);}
JAVA 9 资源的关闭操作,我们可以在try子句中使用已经初始化的资源但是此时的资源必须 是final修饰的,final可以省略不写
/*** @Author: Ma HaiYang* @Description: MircoMessage:Mark_7001*/
public class Demo2 {public void testx(){// 传统的 try catch finally语句块InputStreamReader isr =null;try{isr =new InputStreamReader(new FileInputStream("d:/aaa.txt"));isr.read();}catch (Exception e){e.printStackTrace();}finally {if(null != isr){try {isr.close();} catch (IOException e) {e.printStackTrace();}}}}// JAVA8 try语法升级public void testa(){// JAVA8 try catch finally语句块try( InputStreamReader isr =new InputStreamReader(new FileInputStream("d:/aaa.txt"));){isr.read();}catch (Exception e){e.printStackTrace();}}// JAVA9 try语法升级public void testb() throws FileNotFoundException {// JAVA9 try catch finally语句块InputStreamReader isr =new InputStreamReader(new FileInputStream("d:/aaa.txt"));OutputStreamWriter isw =new OutputStreamWriter(new FileOutputStream("d:/aaa.txt"));try( isr; isw){isr.read();}catch (Exception e){e.printStackTrace();}}
}
3_下划线命名标识符的使用限制
标识符命名组成:字母,数字,下划线,美元符
JAVA8 中,可以使用一个 _ 作为标识符的命名
String _ ="宇智波赵四儿";
JAVA9 中,就不可以使用一个_ 作为标识符的命名了,不通过编译,但是标识符中仍然可以使用_,必须配合其他内容
String stu_name="旋涡刘能";
小细节,注意一下即可,一般也没人直接单独用一个_ 作为标识符的命名
二 API层次的改变
1_接口中的私有方法
JAVA7 中,接口只能有抽象方法
JAVA8 中,接口中static(静态不可重写)和default(可以重写)修饰的方法可以拥有方法体
JAVA9 中,接口中可以使用private修饰方法,并拥有方法体,但是接口中的成员变量仍然不能用private修饰
感觉: 接口中的代码越来越靠近抽象类,但是仍然是支持多继承的
/*** @Author: Ma HaiYang* @Description: MircoMessage:Mark_7001*/
public class Demo4 {// 接口,是一种规范和要求// 实现多继承
}
// java7 接口中的方法必须都是抽象的
interface Inter1{void methoda();
}
// java8接口可以定义static/default修饰的非抽象方法
interface Inter2{void methoda();static void methodB(){}default void methodC(){}
}
// java9 允许定义私有的非抽象方法
interface Inter3{void methoda();static void methodB(){}default void methodC(){methodD();}private void methodD(){}
}
2_String底层存储结构的变更
JAVA8 中的String源码
String类内部维护的是一个final修饰的私有char数组,说明String的底层是通过char数组存储字符串的
JAVA9 中String的源码
String类内部维护的是一个final修饰的私有byte数组,说明String的底层是通过byte数组存储字符串的
这么做的原因:大多数String对象只包含latin-1字符。 这样的字符只需要一个字节的存储空间,因此这样的String对象的内部字符数组中有一半的空间没有使用 , 我们建议将String类的内部表示形式从UTF-16字符数组更改为一个字节数组加上一个结束编码标志字段
3_Stream新增4个API
JAVA9 中,Stream接口添加了4个新方法,takeWhile,dropWhile,ofNullable,还有一个iterate 方法的新重载方法,可以通过一个Predicate来指定什么时候结束迭代
/*** 测试Stream新增takeWhile方法* takeWhile 从流中的头开始取元素,直到不满足条件为止*/public static void testTakeWhile(){List<Integer> list = Arrays.asList(1, 89, 63, 45, 72, 65, 41, 65, 82, 35, 95, 100);// 从头开始取所有奇数,直到遇见一个偶数为止list = list.stream().takeWhile(e -> e % 2 == 1).collect(Collectors.toList());//[1, 89, 63, 45]System.out.println(list);}/*** 测试Stream新增dropWhile方法* dropWhile 从头开始删除满足条件的数据,直到遇见第一个不满足的位置,并保留剩余元素*/public static void testDropWhile() {List<Integer> list = Arrays.asList(2, 86, 63, 45, 72, 65, 41, 65, 82, 35, 95, 100);// 删除流开头所有的偶数,直到遇见奇数为止list = list.stream().dropWhile(e -> e % 2 == 0).collect(Collectors.toList());//[63, 45, 72, 65, 41, 65, 82, 35, 95, 100]System.out.println(list);}/*** 测试Stream新增ofNullable方法* ofNullable 允许创建Stream流时,只放入一个null*/public static void testOfNullable(){// of方法获取流 ,允许元素中有多个null值Stream<Integer> stream1 = Stream.of(10, 20, 30, null);// 如果元素中只有一个null,是不允许的Stream<Integer> stream2 = Stream.of(null);// JAVA9中,如果元素为null,返回的是一个空Stream,如果不为null,返回一个只有一个元素的StreamStream<Integer> stream3 = Stream.ofNullable(null);}/*** 测试Stream新增iterate方法* iterate指定种子数,指定条件和迭代方式来获取流*/public static void testNewIterate(){//JAVA8通过 generate方法获取一个StreamStream.generate(Math::random).limit(10).forEach(System.out::println);//JAVA8 通过iterate获取一个StreamStream.iterate(0,t-> t+2).limit(10).forEach(System.out::println);//JAVA9通过重载iterate获取StreamStream.iterate(0,t -> t<10,t-> t+1).forEach(System.out::println);}
除了Stream本身的扩展,Optional和Stream之间的结合也得到了改进,现在可以通过Optional的新方法将一个Optional对象转换为一个Stream对象(可能是空的)
/*** Optional类新增Stream方法,可以将一个Optional转换为Stream*/public static void testOptionalStream(){List<Integer> list =new ArrayList<>();Collections.addAll(list,10,5,45,95,36,85,47);Optional<List<Integer>> optional=Optional.ofNullable(list);// 通过optional的Stream方法获取一个StreamStream<List<Integer>> stream = optional.stream();// 以为内部的每个元素也是一个List,通过flatMap方法,将内部的List转换为Stream后再放入一个大Streamstream.flatMap(x->x.stream()).forEach(System.out::println);}
4_InputStream新增transferTo方法
InputStream新增transferTo方法,可以用来将数据直接传输到OutpuStream,这是在处理原始数据时非常常见的一种方法
InputStream inputStream =new FileInputStream("d:/aaa.txt");OutputStream outputStream=new FileOutputStream("d:/bbb.txt");try (inputStream;outputStream){//将aaa.txt文件写入到bbb.txtinputStream.transferTo(outputStream);} catch (IOException e) {e.printStackTrace();}
5_只读集合的创建
JAVA8 要创建一个只读,不可改变的集合,必须构造和分配他,然后添加元素,然后再包装成一个不可修的集合
List<String> list= new ArrayList<>();list.add("Tom");list.add("Jerry");list.add("Mark");list.add("Jhon");list = Collections.unmodifiableList(list);System.out.println(list);
放入数据后,然后要通过unmodifiableList才能让集合变为只读集合,不能表达为单个的表达式
JAVA9 通过集合工厂方法,创建一个只读集合,只要通过新增的of方法即可完成创建
List<String> list= List.of("TOM","Jerry","Mark","Ben");//[TOM, Jerry, Mark, Ben]System.out.println(list);
上面是List接口的of方法, 同样的,Set接口和Map接口下也新增了of方法,也是返回一个只读集合
三 其他变化
1_JAVA9 模块化
谈到Java9大家往往第一个想到的就是Jigsaw项目(后改名为Modularity)。众所周知,Java已经发展超过20年(95年最初发布),Java和相关生态在不断丰富的同时也越来越暴露出一些问题:
1Java运行环境的膨胀和臃肿。每次JVM启动的时候,至少会有30~ 60MB的内存加载,主要原因是JVM需要加载rt.jar,不管其中的类是否被classloader加载,第一步整个jar都会被JVM加载到内存当中去(而模块化可以根据模块的需要加载程序运行需要的class)
2当代码库越来越大,创建复杂,盘根错节的“意大利面条式代码”的几率呈指数级的增长。不同版本的类库交叉依赖导致让人头疼的问题,这些都阻碍了Java 开发和运行效率的提升。
3很难真正地对代码进行封装,而系统并没有对不同部分(也就是JAR文件)之间的依赖关系有个明确的概念。每一个公共类都可以被类路径之下任何其它的公共类所访问到,这样就会导致无意中使用了并不想被公开访问的API.
本质上讲,模块化,就是在package外面包裹一层->>>说白了项目下有众多 模块
进行项目管理,管理各个模块,比如一个电商项目 下面有支付模块 购物模块,,,模块跟模块之间相互调用,这样代码就更安全,可以指定哪些暴露 哪些隐藏!
模块之间的可访问性是所使用的模块和使用模块之间的双向协议:模块明确地使其公共类型可供其他模块使用,而且使用这些公共类型的模块明确声明对第一个模块的依赖,模块中所有未导出的软件包都是模块的私有的,他们不能在模块之外使用.之前做不到,现在可以考虑这个事了
在jdk9中,项目模块之间的依赖
在JDK9 先准备一个项目,普通java项目即可,然后再项目下准备两个模块,名字为jdk9module1和jdk9module2,如下图
jdk9module1中添加一些类
如何在jdk9module2中使用这个类? 或者说是使用模块1中的类,第一步,在两个模块的src下创建各自的module-info.java
在jdk9module1的module-info.java文件中,设置哪些包可以向外暴露
module jdk9module1 {//设置当前模块可以对外保留的包exports com.llp.pojo;
}
在jdk9module2的module-info.java中引入模块1
module jdk9module2 {requires jdk9module1;
}
但是发现报错了,原因是,我们要把模块1添加为模块2的运行环境,具体操作如下
project structure > modules > jdk9module2 >dependencies >>+module lib > jdk9module1 > apply >>ok
这个是时候,我们在模块2中就可以使用模块1 中的类了
2_可交互的REPL工具:jshell
像Python和Scala 之类的语言早就有交互式编程环境REPL (read -evaluate - print -loop)了,以交互式的方式对语句和表达式进行求值。开发者只需要输入一些代码,就可以在编译前获得对程序的反馈。而之前的Java 版本要想执行代码,必须创建文件、声明类、提供测试方法方可实现。
要想实现REPL,需要一个命令:JShell命令(linux中是shell命令,java中的shell命令)
将环境变量配置为java9,就可以在控制命令台使用jshell命令了:如果电脑上安装了其他版本的JDK,环境变量也是其他版本,大家可以在dos上通过cd 切换到指定版本的bin目录下,就可以使用该版本的jshell了
案例:简单输出语句:
案例:变量定义
案例:方法定义和调用:
导包:
其实jshell中有默认的导入一些包(除了java.lang之外,以下包也可以直接用),可以直接使用不用导包,查看有哪些:
常用命令:
可以将某些常用命令持久化在硬盘上:
jshell不用编译时异常处理:
退出jshell
相关文章:
JAVA9新特性
JAVA9新特性 概述 经过4次推迟,历经曲折的Java9最终在2017年9月21日发布。因为里面加入的模块化系统,在最初设想的时候并没有想过那么复杂,花费的时间超出预估时间。距离java8大约三年时间。 Java 9提供了超过150项新功能特性&#x…...
( 数组和矩阵) 645. 错误的集合 ——【Leetcode每日一题】
❓645. 错误的集合 难度:简单 集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。 给定一个数组 nums 代表了…...
2023年全国最新道路运输从业人员精选真题及答案63
百分百题库提供道路运输安全员考试试题、道路运输从业人员考试预测题、道路安全员考试真题、道路运输从业人员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 119.在危险货物道路运输过程中,(&#x…...
Kettle安装与使用
一、Kettle简介 Kettle最早是一个开源的ETL(Extract-Transform-Load的缩写)工具,全称为KDE Extraction, Transportation, Transformation and Loading Environment。后来Kettle重命名为Pentaho Data Integration 。它由Java开发,…...
C51 - DS18B20
Thermometer 1> 实验概述2> 硬件设计3> DS18B203.1> 原理框图3.2> 数据格式 4> 单总线(1-Wire)通讯协议4.1> 初始化(复位)时序4.2> 写-DS18B20时序4.3> 读-DS18B20时序4.4> 命令 5> 程序设计5.1…...
手把手教你使用vue2搭建微前端micro-app
简述 本文主要讲述新手小白怎么搭建micro-app,几乎是每一步都有截图说明。上手应该很简单。 研究背景 这段时间在网上找了很多有关微前端相关的知识,起初本来是想着先搭建一个single-spa,但是奈何网上能找到的内容都是千篇一律。我也是…...
DDR3(MIG核配置官方demoFPGA代码实现及仿真)
由于直接对 DDR3 进行控制很复杂,因此一般使用 MIG IP 来实现,同时为了更简单地使用 MIG IP,我们采用 AXI4 总线协议进行控制。下面首先介绍 MIG IP 的配置,然后看看官方 demo (里面包含一个仿真要用到的 DDR3 模型&am…...
传奇人物《周兴和》书连载之67 不辱神圣的使命
不辱神圣的使命 这里,先前还是一个十分神秘的地方。 外人和车辆要想进入这片区域,那是绝对不允许的。这片区域隐于群山之中,且戒备森严,外人若想进入,那是要经过好几道政治审查和随身检查的。近年来,随着…...
Spring框架中的单例Beans是线程安全的么?
在Spring框架中,单例Beans默认是线程安全的。 当你在Spring框架中声明一个单例Bean并配置为默认的单例作用域时,Spring会确保对该Bean的并发访问是线程安全的。以下是一个简单的代码演示: 假设我们有一个名为 SingletonBean 的单例 Bean 类…...
AI脚本插件开发-链接图自动建立档名-插件制作源码-illustrator插件开发
文章目录 1.illustrator1.1.app.activeDocument1.2.selection2.模块分析3.源码工程4.功能描述5.作者答疑本文主要分析一款插件的源码,链接图自动建立档名,代码一般较长,读者耐心阅读,对于学习插件开发具有不小的帮助。先介绍了一下基础资料,如有不懂的地方,就去这些资料里…...
rust智能指针
智能指针 智能指针虽然也号称指针,但是它是一个复杂的家伙:通过比引用更复杂的数据结构,包含比引用更多的信息,例如元数据,当前长度,最大可用长度等。引用和智能指针的另一个不同在于前者仅仅是借用了数据…...
Git、Gitee、Github、Gitlab区别与联系
Git:本地软件,无需联网即可使用,实现本地代码的管理。 分布式版本控制系统,是一种工具,用于代码的存储和版本控制。 将本地文件通过一定的操作将其同步上传到Github或Gitee Gitee:是一家中…...
接口优化的策略
1.批处理 批量思想:批量操作数据库,这个很好理解,我们在循环插入场景的接口中,可以在批处理执行完成后一次性插入或更新数据库,避免多次IO。 //批量入库 batchInsert();List的安全操作有以下几种方式: 使…...
android 隐藏底部虚拟按键
方法一 滑动屏幕 可重新显示出来 protected void hideBottomUIMenu() { //隐藏虚拟按键,并且全屏 if (Build.VERSION.SDK_INT <11 && Build.VERSION.SDK_INT < 19) { // lower api View v this.getWindow().getDecorView(); v.setSyst…...
基于电流控制的并网逆变器(Simulink)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
learn_C_deep_9 (汇编角度理解return的含义、const 的各种应用场景)
return 关键字 不知道我们大家是否有一个疑惑:我们下载一个大型游戏软件(王者荣耀),都要花几个小时去下载,但是一旦我们游戏连输,想要删除这个软件的时候,它仅仅只需要十几秒,这是为…...
基于深度学习的OCR技术
随着数字化时代的到来,图片识别技术越来越受到人们的关注。其中,OCR技术作为图片处理的一个重要分支,可以将扫描的图片进行自动识别和分类,极大地提高了工作效率。本文将介绍有道实况OCR技术的相关内容,帮助读者更好地…...
『python爬虫』09. bs4实战之下载精美壁纸(保姆级图文)
目录 爬取思路代码思路1.拿到主页面的源代码. 然后提取到子页面的链接地址, href2.通过href拿到子页面的内容. 从子页面中找到图片的下载地址 img -> src3.下载图片 3. 完整实现代码总结 欢迎关注 『python爬虫』 专栏,持续更新中 欢迎关注 『python爬虫』 专栏&…...
【Linux学习】多线程——线程控制 | 线程TCB
🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言:你只管努力,剩下的交给时间! 线程控制 | 线程TCB 🧰线程控制🎴线程创建🎴线程结束…...
Node 10 接口
接口 简介 接口是什么 接口是 前后端通信的桥梁 简单理解:一个接口就是 服务中的一个路由规则 ,根据请求响应结果 接口的英文单词是 API (Application Program Interface),所以有时也称之为 API 接口 这里的接口指的是『数据接口』&#…...
大型互联网企业大流量高并发电商领域核心项目已上线(完整流程+项目白皮书)
说在前面的话 面对近年来网络的飞速发展,大家已经都习惯了网络购物,从而出现了一些衍生品例如:某宝/某东/拼夕夕等大型网站以及购物APP~ 并且从而导致很多大型互联网企业以及中小厂都需要有完整的项目经验,以及优秀处理超大流量…...
汇编语言学习笔记六
flag 寄存器 CF:进位标志位,产生进位CF1,否则为0 PF:奇偶位,如010101b,则该数的1有3个,则PF0,如果该数的1的个数为偶数,则PF1。0也是偶数 ZF:在相关指令执行后(运算和逻辑指令,传送指…...
多商户商城系统-v2.2.3版本发布
likeshop多商户商城系统-v2.2.3版本发布了!主要更新内容如下 新增 1.用户端退出账号功能 优化 1.平台添加营业执照保存异常问题 2.平台端分销商品优化-只显示参与分销的商品 3.优化订单详情显示营销价格标签 4.平台交易设置增加默认值 5.种草社区评论调整&a…...
科研人必看入门攻略(收藏版)
来源:投稿 作者:小灰灰 编辑:学姐 本文主要以如何做科研,日常内功修炼,常见科研误区,整理日常‘好论文’四个部分做以介绍,方便刚入门的科研者进行很好的规划。 1.如何做科研 1.1 选方向 当我…...
第5章 循环和关系表达式
1. strcmp()//比较字符串数组是否相等| string 可以直接用“”来判断 char word[5] "aaaa"; strcmp(word,"aaab");//相同输出0,不同输出1; 2. 延时函数 #include<ctime>float sec 2.3;long delay sec*CLOCKS_PER_SEC;long start c…...
Scalable Vector Graphics (SVG)中的svg、clipPath、mask元素
Scalable Vector Graphics (SVG)是一种用于描述二维向量图形的XML基础标记语言。使用SVG可以实现丰富的图形效果,而不需要像使用位图那样考虑分辨率和像素密度的问题,可以在不同设备上展示出相同的高质量图像。 在SVG中,除了基本形状如circl…...
Java基础(十五)集合框架
1. 集合框架概述 1.1 生活中的容器 1.2 数组的特点与弊端 一方面,面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储。另一方面,使用数组存储对象方面具有一些弊端,而Java 集合…...
安装gitea
1、安装包(gitea-1.13.1-linux-amd64)上传到服务器,并添加执行权限 链接:https://pan.baidu.com/s/1SAxko0RhVmmD21Ev_m5JFg 提取码:ft07 chmod x gitea-1.13.1-linux-amd64 2、执行 ./gitea-1.13.1-linux-amd64 web…...
Java异常处理传递规范总结
java 异常分类 Thorwable类(表示可抛出)是所有异常和错误的超类,两个直接子类为Error和Exception,分别表示错误和异常。其中异常类Exception又分为运行时异常(RuntimeException)和非运行时异常, 这两种异常有很大的区别…...
2d俯视视角游戏,可以切换多种枪械
文章目录 一、 介绍二、 人物移动、鼠标控制转向三、子弹脚本四、子弹随机抛壳五、 爆炸特效六、 发射子弹七、 子弹、弹壳对象池八、 散弹枪九、 火箭弹、发射火箭十、 下载工程文件 一、 介绍 2d俯视视角游戏。 人物视角跟随鼠标移动 多种枪械 抛壳效果 多种设计效果 对象池…...
做货代的可以在哪些网站打广告/建站平台哪个好
最近在使用遇到一个问题需要把csv格式的文件转成xls,随便新建一个excel,然后打开,选择“开发工具”,找到下图“宏”,如果跟下图一样的话就需要先启用宏,启用之后可以直接把下面的代码直接复制到代码区&…...
深圳专业定制建站公司/线上线下一体化营销
--查询指定供应商指定的一段时间内出票的张数 如果每查询一个月,修改一次时间太麻烦,写个循环的! declare date1 date declare date2 date declare startdate date declare enddate date declare countsum int declare count int set start…...
长沙市做网站/百度竞价推广一个月多少钱
今天在写线性表的链式存储过程中,遇到了一个比较奇葩的问题,就是同一段程序,用for循环可以顺利执行,然而用while循环就提醒我“结点空间申请失败!!!”,考虑了一上午都没有头绪。记录…...
桂林象鼻山门票/深圳优化公司哪家好
“Gotham” by James Gilleard♚作者:Nugine专栏地址:zhuanlan.zhihu.com/c_168195059在本篇文章中,我要向你展示使用 Cython 扩展 Python 的技巧。如果你同时有 C/C和 Python 的编码能力,我相信你会喜欢这个的。我们要造的轮子是…...
婚纱摄影类网站模板/天津百度快照优化公司
Vue入门2与SpringBoot跨域请求Vue项目没有config目录怎么办: 1、引入axios 请参考我的另一篇博客 传送门 2、新建我们自己的测试页面 在views下新建目录test目录,test目录下新建Test.vue 3、然后再路由中心配置router\index.js 1、在单页面应用中࿰…...
效果好的徐州网站建设/营销推广方法有哪些
定位的四种模式:static,relative,absolute,fixed定位的四个位置:left,right,top,bottom定位属性:position,有四种状态值1.static:静态定位,按元素在文档流中的顺序排列,这是默认值,四个位置无效2.relative:相对定位,元素相对于原来它在文档流中的位置进行定位,四个位置有效3.ab…...