Java教程 第4页 随机数是任何一种编程语言最基本的特征之一,在技术开发中应用很广泛,因为有时我们需要随机生成一个固定长度的数字、字符串亦或者是需要随机生成一个不定长度的数字、或者进行一个模拟的随机选择等。Java就为我们提供了最基本的工具,可以帮助开发者生成不同条件下需要的随机数。java中产生随机数和c的差不多,一般有两种随机数,一个是Math中random()方法,一个是Random类。不过不管是c还是java,要产生随机数都需要设置随机数种子,如果设置的是一样的话,每次获得的随机数是一样的。下面来汇总一下常见的不同类型的java随机数是如何生成的。 java产生随机数的基本方法 方法一:在j2se里我们可以使用 Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他就是个100以内的随机,这个在j2me中没有。 (数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例1:从1到10的int型随数 (int)(1+Math.random()*(10-1+1)) 例2: 随机生成0~100中的其中一个数 在上面我们已经知道了Math.random()返回的只是从0到1之间的小数,如果要50到100,就先放大50倍,即0到50之间,这里还是小数,如果要整数,就强制转换int,然后再加上50即为50~100。 最终代码: (int)(Math.random()*50) + 50 方法二:在java.util这个包里面提供了一个 Random的类,我们可以新建一个Random的对象来产生随机数,他可以产生随机整数、随机float、随机double,随机long,这个也是我们在j2me的程序里经常用的一个取随机数的方法。 Random random = new Random();//默认构造方法 Random random = new Random(1000);//指定种子数字 在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。 相同种子数的Random对象,相同次数生成的随机数字是完全相同的。也就是说,两个种子数相同的Random对象,第一次生成的随机数字完全相同,第二次生成的随机数字也完全相同。 例:获取[0, 100)之间的int整数。 int i2 = random.nextInt(100); Random 的函数接口: // 构造函数(一): 创建一个新的随机数生成器。 Random() // 构造函数(二): 使用单个 long 种子创建一个新随机数生成器: public Random(long seed) { setSeed(seed); } next 方法使用它来保存随机数生成器的状态。 Random(long seed) boolean nextBoolean() // 返回下一个“boolean类型”伪随机数。 void nextBytes(byte[] buf) // 生成随机字节并将其置于字节数组buf中。 double nextDouble() // 返回一个“[0.0, 1.0) 之间的double类型”的随机数。 float nextFloat() // 返回一个“[0.0, 1.0) 之间的float类型”的随机数。 int nextInt() // 返回下一个“int类型”随机数。 int nextInt(int n) // 返回一个“[0, n) 之间的int类型”的随机数。 long nextLong() // 返回下一个“long类型”随机数。 synchronized double nextGaussian() // 返回下一个“double类型”的随机数,它是呈高斯(“正常地”)分布的 double 值,其平均值是 0.0,标准偏差是 1.0。 synchronized void setSeed(long seed) // 使用单个 long 种子设置此随机数生成器的种子。 Random类中的常用方法: Random 类中的方法比较简单,每个方法的功能也很容易理解。需要说明的是,Random类中各方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的几率是均等的。下面对这些方法做一下基本的介绍: a 、public boolean nextBoolean()该方法的作用是生成一个随机的boolean值,生成true和false的值几率相等,也就是都是50%的几率。 b 、public double nextDouble()该方法的作用是生成一个随机的double值,数值介于[0,1.0)之间,这里中括号代表包含区间端点,小括号代表不包含区间端点,也就是0到1之间的随机小数,包含0而不包含1.0。 c...
2024-04-01
在 Java 面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。 抽象类除了不能实例化对象之外,类的其它功能依然存在,成员变量、成员方法和构造方法的访问方式和普通类一样。 由于抽象类不能实例化对象,所以抽象类必须被继承,才能被使用。也是因为这个原因,通常在设计阶段决定要不要设计抽象类。 父类包含了子类集合的常见的方法,但是由于父类本身是抽象的,所以不能使用这些方法。 抽象类 在Java语言中使用abstract class来定义抽象类。如下实例: /* 文件名 : Employee.java */ public abstract class Employee { private String name; private String address; private int number; public Employee(String name, String address, int number) { System.out.println("Constructing an Employee"); this.name = name; this.address = address; this.number = number; } public double computePay() { System.out.println("Inside Employee computePay"); return 0.0; } public void mailCheck() { System.out.println("Mailing a check to " + this.name + " " + this.address); } public String toString() { return name + " " + address + " " + number; } public String getName() { return name; } public String getAddress() { return address; } public void setAddress(String newAddress) { address = newAddress; } public int getNumber() {...
2024-04-01
继承是所有 OOP 语言和 Java 语言不可缺少的组成部分。 继承是 Java 面向对象编程技术的一块基石,是面向对象的三大特征之一,也是实现软件复用的重要手段,继承可以理解为一个对象从另一个对象获取属性的过程。 如果类 A 是类 B 的父类,而类 B 是类 C 的父类,我们也称类 C 是 A 的子类,类 C 是从类 A 继承而来的。在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类。 继承中最常使用的两个关键字是 extends 和 implements 。 这两个关键字的使用决定了一个对象和另一个对象是否是 IS-A (是一个)关系。 通过使用这两个关键字,我们能实现一个对象获取另一个对象的属性。 所有 Java 的类均是由 java.lang.Object 类继承而来的,所以 Object 是所有类的祖先类,而除了 Object 外,所有类必须有一个父类。 通过 extends 关键字可以申明一个类是继承另外一个类而来的,一般形式如下: // A.java public class A { private int i; protected int j; public void func() { } } // B.java public class B extends A { public int z; public void fund(){ } } 以上的代码片段说明,类 B 由类 A 继承而来的,类 B 是类 A 的子类。而类 A 是 Object 的子类,这里可以不显示地声明。 作为子类,类 B 的实例拥有类 A 所有的成员变量,但对于 private 类型的成员变量类 B 却没有访问权限,这保障了类 A 的封装性。 IS-A 关系 IS-A 就是说:一个对象是另一个对象的一个分类。 下面是使用关键字 extends 实现继承。 public class Animal{ } public class...
2024-04-01
Java round() 方法 Java Number类 round() 方法返回一个最接近的int、long型值。 语法 该方法有以下几种语法格式: long round(double d) int round(float f) 参数 d — double 或 float 的原生数据类型 f — float 原生数据类型 返回值 返回一个最接近的int、long型值,方法会指定返回的数据类型。 实例 public class Test{ public static void main(String args[]){ double d = 100.675; double e = 100.500; float f = 100; float g = 90f; System.out.println(Math.round(d)); System.out.println(Math.round(e)); System.out.println(Math.round(f)); System.out.println(Math.round(g)); } } 编译以上程序,输出结果为: 101 101 100 90 Java Number类
2024-04-01
Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由詹姆斯·高斯林(James Gosling)和同事们共同研发,并在1995年正式推出。 Java分为三个体系: JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版) JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企业版) JavaME(J2ME)(Java 2 Platform Micro Edition,java平台微型版) 2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名以取消其中的数字”2″:J2EE更名为Java EE, J2SE更名为Java SE,J2ME更名为Java ME。 2009年,sun公司被oracle收购. 2018年,开源组织Eclipse基金会宣布将JavaEE(Enterprise Edition)被更名为JakartaEE(雅加达)。 主要特性 Java语言是简单的: Java语言的语法与C语言和C++语言很接近,使得大多数程序员很容易学习和使用。另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的内存回收管理机制,使得程序员不必为内存管理而担忧。 Java语言是面向对象的: Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机制(关键字为implements)。Java语言全面支持动态绑定,而C++语言只对虚函数使用动态绑定。总之,Java语言是一个纯的面向对象程序设计语言。 Java语言是分布式的: Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。 Java语言是健壮的: Java的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。 Java语言是安全的: Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击。除了Java语言具有的许多安全特性以外,Java对通过网络下载的类具有一个安全防范机制(类ClassLoader),如分配不同的名字空间以防替代本地的同名类、字节代码检查,并提供安全管理机制(类SecurityManager)让Java应用设置安全哨兵。 Java语言是体系结构中立的: Java程序(后缀为java的文件)在Java平台上被编译为体系结构中立的字节码格式(后缀为class的文件),然后可以在实现这个Java平台的任何系统中运行。这种途径适合于异构的网络环境和软件的分发。 Java语言是可移植的: 这种可移植性来源于体系结构中立性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。 Java语言是解释型的: 如前所述,Java程序在Java平台上被编译为字节码格式,然后可以在实现这个Java平台的任何系统中运行。在运行时,Java平台中的Java解释器对这些字节码进行解释执行,执行过程中需要的类在联接阶段被载入到运行环境中。 Java是高性能的: 与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。 Java语言是多线程的: 在Java语言中,线程是一种特殊的对象,它必须由Thread类或其子(孙)类来创建。通常有两种方法来创建线程:其一,使用型构为Thread(Runnable)的构造子将一个实现了Runnable接口的对象包装成一个线程,其二,从Thread类派生出子类并重写run方法,使用该子类创建的对象即为线程。值得注意的是Thread类已经实现了Runnable接口,因此,任何一个线程均有它的run方法,而run方法中包含了线程所要运行的代码。线程的活动由一组方法来控制。Java语言支持多个线程的同时执行,并提供多线程之间的同步机制(关键字为synchronized)。 Java语言是动态的: Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类。这也有利于软件的升级。另外,Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。 发展历史 1995年5月23日,Java语言诞生 1996年1月,第一个JDK-JDK1.0诞生 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术 1996年9月,约8.3万个网页应用了JAVA技术来制作 1997年2月18日,JDK1.1发布 1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录 1997年9月,JavaDeveloperConnection社区成员超过十万 1998年2月,JDK1.1被下载超过2,000,000次 1998年12月8日,JAVA2企业平台J2EE发布 1999年6月,SUN公司发布Java的三个版本:标准版(JavaSE,以前是J2SE)、企业版(JavaEE以前是J2EE)和微型版(JavaME,以前是J2ME) 2000年5月8日,JDK1.3发布 2000年5月29日,JDK1.4发布 2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机 2001年9月24日,J2EE1.3发布 2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升 2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0 2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字”2″:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME 2006年12月,SUN公司发布JRE6.0 2009年04月20日,甲骨文74亿美元收购Sun。取得java的版权。 2010年11月,由于甲骨文对于Java社区的不友善,因此Apache扬言将退出JCP。 2011年7月28日,甲骨文发布java7.0的正式版。 2014 年 3 月 18 日,Oracle 公司发表 Java SE 8。 2017 年 9 月 21 日,Oracle 公司发表 Java SE 9 2018 年 3 月 21 日,Oracle 公司发表 Java SE 10 2018 年 9 月 25 日,Java SE 11 发布...
2024-04-01
Java 是由Sun Microsystems公司于1995年5月推出的高级程序设计语言。 Java可运行于多个平台,如Windows, Mac OS,及其他多种UNIX版本的系统。 本教程通过简单的实例将让大家更好的了解JAVA编程语言。 Java 在线工具 JDK 在线中文手册 我的第一个JAVA程序 以下我们通过一个简单的实例来展示Java编程,本实例输出”Hello World”,这也是所有语言入门的第一个实例程序: public class Main{ public static void main(String []args) { System.out.println("Hello World"); } } 尝试一下 开始学习JAVA编程 开始学习Java课程 Java 面向对象课程 Java 高级课程
2024-04-01
Java 实例 以下实例演示了如何使用 retainAll () 方法来删除包含在另外一个数组中的数组元素: 此处说明有些拗口,可以简单的理解为:有两个数组,其中A数组里面有B数组的全部内容,而B数组有A数组没有的内容(也就是说数组B包含数组A),B数组的retainAll()方法可以传入数组A,这样就可以删除B数组里面所有A数组的成分了。 换种说法,retainAll()方法是删除一批元素,而这批元素是以数组的形式传递进去的。 /* author by w3cschool.cn 文件名:Main.java */ import java.util.ArrayList; public class Main { public static void main(String[] args) { ArrayList objArray = new ArrayList(); ArrayList objArray2 = new ArrayList(); objArray2.add(0,"common1"); objArray2.add(1,"common2"); objArray2.add(2,"notcommon"); objArray2.add(3,"notcommon1"); objArray.add(0,"common1"); objArray.add(1,"common2"); objArray.add(2,"notcommon2"); System.out.println("array1 数组元素:"+objArray); System.out.println("array2 数组元素:"+objArray2); objArray.retainAll(objArray2); System.out.println("array2 & array1 数组交集为:"+objArray); } } 以上代码运行输出结果为: array1 数组元素:[common1, common2, notcommon2] array2 数组元素:[common1, common2, notcommon, notcommon1] array2 & array1 数组交集为:[common1, common2] Java 实例
2024-04-01
Java10它号称有109项新特性,包含12个JEP。 需要注意的是,本次Java10并不是Oracle的官方LTS版本,所以咱们可以先了解新特性。然后坐等java11的发布再考虑在生产中使用吧。 特性列表 局部变量的类型推断 var关键字 GC改进和内存管理 并行全垃圾回收器 G1 垃圾回收器接口 线程-局部变量管控 合并 JDK 多个代码仓库到一个单独的储存库中 新增API:ByteArrayOutputStream 新增API:List、Map、Set 新增API:java.util.Properties 新增API: Collectors收集器 其它特性 1、局部变量的类型推断 var关键字 这个新功能将为Java增加一些语法糖 – 简化它并改善开发者体验。新的语法将减少与编写Java相关的冗长度,同时保持对静态类型安全性的承诺。 这可能是Java10给开发者带来的最大的一个新特性。下面主要看例子: public static void main(String[] args) { var list = new ArrayList<String>(); list.add("hello,world!"); System.out.println(list); } 这是最平常的使用。注意赋值语句右边,最好写上泛型类型,否则会有如下情况: public static void main(String[] args) { var list = new ArrayList<>(); list.add("hello,world!"); list.add(1); list.add(1.01); System.out.println(list); } 么都可以装,非常的不安全了。和js等语言不同的是,毕竟Java还是强类型的语言,所以下面语句是编译报错的: public static void main(String[] args) { var list = new ArrayList<String>(); list.add("hello,world!"); System.out.println(list); list = new ArrayList<Integer>(); //编译报错 } 注意:注意:注意:下面几点使用限制 局部变量初始化 for循环内部索引变量 传统的for循环声明变量 public static void main(String[] args) { //局部变量初始化 var list = new ArrayList<String>(); //for循环内部索引变量 for (var s : list) { System.out.println(s); } //传统的for循环声明变量 for (var i = 0; i < list.size(); i++) { System.out.println(i); } } 下面这几种情况,都是不能使用var的 方法参数 全局变量 public static var list = new ArrayList<String>(); //编译报错 public static List<String>...
2024-04-01
Java 9 发布于 2017 年 9 月 22 日,带来了很多新特性,其中最主要的变化是已经实现的模块化系统。接下来我们会详细介绍 Java 9 的新特性。 Java 9 新特性 模块系统:模块是一个包的容器,Java 9 最大的变化之一是引入了模块系统(Jigsaw 项目)。 REPL (JShell):交互式编程环境。 HTTP 2 客户端:HTTP/2标准是HTTP协议的最新版本,新的 HTTPClient API 支持 WebSocket 和 HTTP2 流以及服务器推送特性。 改进的 Javadoc:Javadoc 现在支持在 API 文档中的进行搜索。另外,Javadoc 的输出现在符合兼容 HTML5 标准。 多版本兼容 JAR 包:多版本兼容 JAR 功能能让你创建仅在特定版本的 Java 环境中运行库程序时选择使用的 class 版本。 集合工厂方法:List,Set 和 Map 接口中,新的静态工厂方法可以创建这些集合的不可变实例。 私有接口方法:在接口中使用private私有方法。我们可以使用 private 访问修饰符在接口中编写私有方法。 进程 API: 改进的 API 来控制和管理操作系统进程。引进 java.lang.ProcessHandle 及其嵌套接口 Info 来让开发者逃离时常因为要获取一个本地进程的 PID 而不得不使用本地代码的窘境。 改进的 Stream API:改进的 Stream API 添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询。 改进 try-with-resources:如果你已经有一个资源是 final 或等效于 final 变量,您可以在 try-with-resources 语句中使用该变量,而无需在 try-with-resources 语句中声明一个新变量。 改进的弃用注解 @Deprecated:注解 @Deprecated 可以标记 Java API 状态,可以表示被标记的 API 将会被移除,或者已经破坏。 改进钻石操作符(Diamond Operator) :匿名类可以使用钻石操作符(Diamond Operator)。 改进 Optional 类:java.util.Optional 添加了很多新的有用方法,Optional 可以直接转为 stream。 多分辨率图像 API:定义多分辨率图像API,开发者可以很容易的操作和展示不同分辨率的图像了。 改进的 CompletableFuture API : CompletableFuture 类的异步机制可以在 ProcessHandle.onExit 方法退出时执行操作。 轻量级的 JSON API:内置了一个轻量级的JSON API 响应式流(Reactive Streams) API: Java 9中引入了新的响应式流 API 来支持...
2024-04-01
Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。 新特性 Java8 新增了非常多的特性,我们主要讨论以下几个: Lambda 表达式 − Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法中)。 方法引用 − 方法引用提供了非常有用的语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可以使语言的构造更紧凑简洁,减少冗余代码。 默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。 新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。 Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。 Date Time API − 加强对日期与时间的处理。 Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。 Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它允许我们在JVM上运行特定的javascript应用。 更多的新特性可以参阅官网:What’s New in JDK 8 在关于 Java 8 文章的实例,我们均使用 jdk 1.8 环境,你可以使用以下命令查看当前 jdk 的版本: $ java -version java version "1.8.0_31" Java(TM) SE Runtime Environment (build 1.8.0_31-b13) Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode) 编程风格 Java 8 希望有自己的编程风格,并与 Java 7 区别开,以下实例展示了 Java 7 和 Java 8 的编程格式: import java.util.Collections; import java.util.List; import...
2024-04-01