1.语言概述
Java学习笔记
第1章、语言概述 Java简史 1991年 Green项目,开发语言最初命名为Oak (橡树) 1994年,开发组意识到Oak 非常适合于互联网 1996年,发布JDK 1.0,约8.3万个网页应用Java技术来制作 1997年,发布JDK 1.1,JavaOne会议召开,创当时全球同类会议规模之最 1998年,发布JDK 1.2,同年发布企业平台J2EE 1999年,Java分成J2SE、J2EE和J2ME,JSP/Servlet技术诞生 2004年,发布里程碑式版本:JDK 1.5,为突出此版本的重要性,更名为JDK 5.0 2005年,J2SE -> JavaSE,J2EE -> JavaEE,J2ME -> JavaME 2009年,Oracle公司收购SUN,交易价格74亿美元 2011年,发布JDK 7.0 2014年,发布JDK 8.0,是继JDK 5.0以来变化最大的版本 2017年,发布JDK 9.0,最大限度实现模块化 2018年3月,发布JDK 10.0,版本号也称为18.3 Java技术体系平台 Java SE(Java Standard Edition)标准版 支持面向桌面级应用(如Windows下的应用程序)的Java平台,提供了完整的Java核 心API,此版本以前称为J2SE Java EE(Java Enterprise Edition)企业版 是为开发企业环境下的应用程序提供的一套解决方案。该技术体系中包含的技术如 :Servlet 、Jsp等,主要针对于Web应用程序开发。版本以前称为J2EE Java ME(Java Micro Edition)小型版 支持Java程序运行在移动终端(手机、PDA)上的平台,对Java API有所精简,并加 入了针对移动终端的支持,此版本以前称为J2ME Java Card 支持一些Java小程序(Applets)运行在小内存设备(如智能卡)上的平台018年9月,发布JDK 11.0,版本号也称为18.9
Java在各领域的应用 • 从Java的应用领域来分,Java语言的应用方向主要表现在以下几个方面: • 企业级应用:主要指复杂的大企业的软件系统、各种类型的网站。Java的安全机制以及 它的跨平台的优势,使它在分布式系统领域开发中有广泛应用。应用领域包括金融、电 信、交通、电子商务等。 • Android平台应用:Android应用程序使用Java语言编写。Android开发水平的高低 很大程度上取决于Java语言核心能力是否扎实。 • 大数据平台开发:各类框架有Hadoop,spark,storm,flink等,就这类技术生态 圈来讲,还有各种中间件如flume,kafka,sqoop等等 ,这些框架以及工具大多数 是用Java编写而成,但提供诸如Java,scala,Python,R等各种语言API供编程。 • 移动领域应用:主要表现在消费和嵌入式领域,是指在各种小型设备上的应用,包括手 机、PDA、机顶盒、汽车通信设备等 1.4 Java语言运行机制及运行过程 Java语言的特点 特点一:面向对象 两个基本概念:类、对象 三大特性:封装、继承、多态 特点二:健壮性 吸收了C/C++语言的优点,但去掉了其影响程序健壮性的部分(如指针、内存的申请与 释放等),提供了一个相对安全的内存管理和访问机制 特点三:跨平台性 跨平台性:通过Java语言编写的应用程序在不同的系统平台上都可以运行。“Write once , Run Anywhere” 原理:只要在需要运行 java 应用程序的操作系统上,先安装一个Java虚拟机 (JVM Java Virtual Machine) 即可。由JVM来负责Java程序在该系统中的运行。 Java语言的特点:跨平台性 因为有了JVM,同一个Java 程序在三个不同的操作系统中都可以执行。这 样就实现了Java 程序的跨平台性
Java两种核心机制 Java虚拟机 (Java Virtal Machine) 垃圾收集机制 (Garbage Collection) 核心机制—Java虚拟机 JVM是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指 令,管理数据、内存、寄存器。 对于不同的平台,有不同的虚拟机。 只有某平台提供了对应的java虚拟机,java程序才可在此平台运行 Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行
核心机制—垃圾回收 不再使用的内存空间应回收—— 垃圾回收。 在C/C++等语言中,由程序员负责回收无用内存。 Java 语言消除了程序员回收无用内存空间的责任:它提供一种系统级线程跟踪存储空 间的分配情况。并在JVM空闲时,检查并释放那些可被释放的存储空间。 垃圾回收在Java程序运行过程中自动进行,程序员无法精确控制和干预。 Java程序还会出现内存泄漏和内存溢出问题吗?Yes!
1.5 Java语言的环境搭建 什么是JDK,JRE JDK(Java Development Kit Java开发工具包) JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)等 JRE(Java Runtime Environment Java运行环境) 包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等, 如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。 JDK、JRE、JVM关系 • JDK = JRE + 开发工具集(例如Javac编译工具等) • JRE = JVM + Java SE标准类库
下载并安装JDK 官方网址: www.oracle.com java.sun.com 安装JDK 傻瓜式安装,下一步即可。 建议:安装路径不要有中文或者空格等特殊符号。 如果操作系统是64位的,软件尽量选择支持64位的(除非软件本身不区分)。 当提示安装 JRE 时,正常在JDK安装时已经装过了,但是为了后续使用Eclipse等开发工具不报错,建议也根据提示安装JRE。
配置全局环境变量(jdk安装路径\bin目录下)
第一个程序 步骤:
- 将 Java 代码编写到扩展名为 .java 的文件中。
- 通过 javac 命令对该 java 文件进行编译。
- 通过 java 命令对生成的 class 文件进行运行。
1.8 注 释(comment)
单行注释 格式: //注释文字 多行注释 格式: /* 注释文字 / 注: 对于单行和多行注释,被注释的文字,不会被JVM(java虚拟机)解释执行。多行注释里面不允许有多行注释嵌套 文档注释(Java特有) 格式:/* @author 指定java程序的作者 @version 指定源文件的版本 */ 注释内容可以被JDK提供的工具 javadoc 所解析,生成一套以网页文件形式体现的该程序的说明文档。 操作方式
小结第一个程序 Java源文件以“java”为扩展名。源文件的基本组成部分是类(class),如 本例中的HelloWorld类。 Java应用程序的执行入口是main()方法。它有固定的书写格式: public static void main(String[] args) {...} Java语言严格区分大小写。 Java方法由一条条语句构成,每个语句以“;”结束。 大括号都是成对出现的,缺一不可。 一个源文件中最多只能有一个public类。其它类的个数不限,如果源文件包含 一个public类,则文件名必须按该类名命名。 /* 对第一个java程序进行总结
- java程序编写-编译-运行的过程 编写:我们将编写的java代码保存在以".java"结尾的源文件中 编译:使用javac.exe命令编译我们的java源文件。格式:javac 源文件名.java 运行:使用java.exe命令解释运行我们的字节码文件。 格式:java 类名 2在一个java源文件中可以声明多个class。但是,只能最多有一个类声明为public的。 而且要求声明为public的类的类名必须与源文件名相同。
- 程序的入口是main()方法。格式是固定的。
- 输出语句: System.out.println():先输出数据,然后换行 System.out.print():只输出数据 5.每一行执行语句都以";"结束。 6.编译的过程:编译以后,会生成一个或多个字节码文件。字节码文件的文件名与java源文件中的类名相同。
*/ public class Hello { public static void main(String[] args) {//public static void main(String a[]) {//arguments:参数 System.out.print("Hello World!"); System.out.println();//换行 System.out.println("Hello World!"); } }
class Person{
}
class Animal{
}
1.9 Java API的文档 (E:\BaiduNetdiskDownload\尚硅谷宋红康Java核心基础_好评如潮(30天入门)\课件笔记源码资料\3_文档资料\API文档) API (Application Programming Interface,应用程序编程接口)是 Java 提供的基本编程接口。 Java语言提供了大量的基础类,因此 Oracle 也为这些基础类提供了相应的API文档,用于告诉开发者如何使用这些类,以及这些类里包含的方法。 下载API: www.oracle.com/technetwork… Additional Resources-Java SE 8 Documentation下载。 详见:JDK8的下载-安装-配置.doc
1.10 良好的编程风格 正确的注释和注释风格 使用文档注释来注释整个类或整个方法。 如果注释方法中的某一个步骤,使用单行或多行注释。 正确的缩进和空白,使用一次tab操作,实现缩进 运算符两边习惯性各加一个空格。比如:2 + 4 * 5。 1.11 常用的Java开发工具 文本编辑工具: 记事本 UltraEdit EditPlus TextPad NotePad Java集成开发环境(IDE): JBuilder NetBeans Eclipse MyEclipse IntelliJ IDEA Eclipse应该是大多数Java程序员使用的第一个IDE。众所周知的、最流行、也最受欢迎的Java开发工具。优点很多:免费、更新快、代码智能化、ANT构建等,拥有众多插件,完全免费、有中文版、上手比较快。缺点也非常明显,安装插件麻烦、插件对版本要求比较严格。eclipse.org/ IntelliJ IDEA被认为是目前Java开发效率最快的IDE工具。是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格。它整合了开发过程中实用的众多功能,智能提示错误,强大的调试工具,Ant,JavaEE支持,CVS整合,最大程度的加快开发的速度。简单而又功能强大。与其他的一些繁冗而复杂的IDE工具有鲜明的对比。 www.jetbrains.com/idea/ 每日一考
- JDK,JRE,JVM三者之间的关系,以及JDK、JRE包含的主要结构有哪些 JDK = JRE + Java的开发工具(javac.exe,java.exe,javadoc.exe) JRE = JVM + Java核心类库
2.为什么要配置path环境变量?如何配置? JAVA_HOME = bin的上一层目录 path = %JAVA_HOME%\bin
3.常用的几个命令行操作都有哪些?(至少4个) cd md 创建 rd 删除文件夹 del 删除文件 cd.. cd/ 4.创建如下的类,使得运行的话可以输出:
创建java文件:ChairMan.java public class ChairMan{ public static void main(String[] args){ System.out.println("姓名:习大大\n");// //System.out.println(); System.out.println("性别:男"); System.out.println("家庭住址:北京中南海"); } } 5.编译和运行上述代码的指令 编译:javac ChairMan.java 运行:java ChairMan
第2章、 Java基本语法(上): 变量与运算符
2.1 关键字与保留字 关键字(keyword)的定义和特点 定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词) 特点:关键字中所有字母都为小写 官方地址: docs.oracle.com/javase/tuto… Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使 用。自己命名标识符时要避免使用这些保留字 goto 、const
2.2 标识符(Identifier) 标识符: Java 对各种变量、方法和类等要素命名时使用的字符序列称为标识符 技巧:凡是自己可以起名字的地方都叫标识符。 定义合法标识符规则: 由26个英文字母大小写,0-9 ,_或 组成 数字不可以开头。 不可以使用关键字和保留字,但能包含关键字和保留字。 Java中严格区分大小写,长度无限制。 标识符不能包含空格。 练习:miles, Test, a++, --a, 4#R,4, #44, apps, class, public, int, x, y, radius Java中的名称命名规范 Java中的名称命名规范: 包名:多单词组成时所有字母都小写:xxxyyyzzz 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ 注意1:在起名字时,为了提高阅读性,要尽量有意义,“见名知意”。 注意2:java采用unicode字符集,因此标识符也可以使用汉字声明,但是不建议使用
2.3 变 量 变量的概念: 内存中的一个存储区域,该区域的数据可以在同一类型范围内不断变化 变量是程序中最基本的存储单元。包含变量类型、变量名和存储的值 变量的作用: 用于在内存中保存数据 使用变量注意: Java中每个变量必须先声明,后使用 声明赋值之后才能调用 使用变量名来访问这块区域的数据 变量的作用域:其定义所在的一对{ }内 变量只有在其作用域内才有效 同一个作用域内,不能定义重名的变量 声明变量 语法:<数据类型> <变量名称> 例如:int var; 变量的赋值 语法:<变量名称> = <值> 例如:var = 10; 声明和赋值变量 语法: <数据类型> <变量名> = <初始化值> 例如:int var = 10; 变量的分类-按数据类型 对于每一种数据都定义了明确的具体数据类型(强类型语言),在内存中分配了不同大小的内存空间。
补充:变量的分类-按声明的位置的不同 在方法体外,类体内声明的变量称为成员变量。 在方法体内部声明的变量称为局部变量。
整数类型:byte、short、int、long Java各整数类型有固定的表数范围和字段长度,不受具体OS的影响,以保证java程序的可移植性。 java的整型常量默认为 int 型,声明long型常量须后加‘l’或‘L’ java程序中变量通常声明为int型,除非不足以表示较大的数,才使用long 浮点类型:float、double 与整数类型类似,Java 浮点类型也有固定的表数范围和字段长度,不受具体操作系统的影响。 浮点型常量有两种表示形式: 十进制数形式:如:5.12 512.0f .512 (必须有小数点) 科学计数法形式:如:5.12e2 512E2 100E-2 float:单精度,尾数可以精确到7位有效数字。很多情况下,精度很难满足需求。 double:双精度,精度是float的两倍。通常采用此类型。 Java 的浮点型常量默认为double型,声明float型常量,须后加‘f’或‘F’。 例如:float d1=12.3f;
字符类型:char char 型数据用来表示通常意义上“字符”(2字节) Java中的所有字符都使用Unicode编码,故一个字符可以存储一个字母,一个汉字,或其他书面语的一个字符。 字符型变量的三种表现形式: 字符常量是用单引号(‘ ’)括起来的单个字符。例如:char c1 = 'a'; char c2 = '中'; char c3 = '9'; Java中还允许使用转义字符‘\’来将其后的字符转变为特殊字符型常量。 例如:char c3 = ‘\n’; // '\n'表示换行符 直接使用 Unicode 值来表示字符型常量:‘\uXXXX’。其中,XXXX代表一个十六进制整数。如:\u000a 表示 \n。 char类型是可以进行运算的。因为它都对应有Unicode码 布尔类型:boolean boolean 类型用来判断逻辑条件,一般用于程序流程控制: if条件控制语句; while循环控制语句; do-while循环控制语句; for循环控制语句; boolean类型数据只允许取值true和false,无null。 不可以使用0或非 0 的整数替代false和true,这点和C语言不同。 Java虚拟机中没有任何供boolean值专用的字节码指令,Java语言表达所操作的boolean值,在编译之后都使用java虚拟机中的int数据类型来代替:true用1表示,false用0表示。———《java虚拟机规范 8版》
基本数据类型转换 自动类型转换:容量小的类型自动转换为容量大的数据类型。数据类型按容量大小排序为:
有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那种数据类型,然后再进行计算。 byte,short,char之间不会相互转换,他们三者在计算时首先转换为int类型(同类的运算也是int如:byte+byte也是转为int)。 boolean类型不能与其它数据类型运算。 当把任何基本数据类型的值和字符串(String)进行连接运算时(+),基本数据类型的值将自动转化为字符串(String)类型。
字符串类型:String(注意一定要有双引号"") String不是基本数据类型,属于引用数据类型;可以8种基本类型做运算(包括boolean) 使用方式与基本数据类型一致。例如:String str = “abcd”; 一个字符串可以串接另一个字符串,也可以直接串接其他类型的数据。例如: str = str + “xyz” ; int n = 100; str = str + n; 示 例—StringTest类 1 public class StringTest { 2 public static void main(String[] args) { 3 int no = 10; 4 String str = "abcdef"; 5 String str1 = str + “xyz” + no;
7 str1 = str1 + "123"; 8 char c = '国';
10 double pi = 3.1416; 11 str1 = str1 + pi; 12 boolean b = false; 13 str1 = str1 + b; 14 str1 = str1 + c; 1 16 System.out.println("str1 = " + str1); 17 } 18 } 自动类型提升 当容量小的数据类型和容量大的数据类型的变量做运算时,结果自动替身为容量大的数据类型 byte 、short、chart--> int--> long--> float--> double--->String 强制类型转换 自动类型转换的逆过程,将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符:(),但可能造成精度降低或溢出,格外要注意。 (例如:下面的是截断操作) 通常,字符串不能直接转换为基本类型,但通过基本类型对应的包装类则可以实现把字符串转换成基本类型。 如: String a = “43”; int i = Integer.parseInt(a); boolean类型不可以转换为其它的数据类型。 变量之进制 关于进制 所有数字在计算机底层都以二进制形式存在。 对于整数,有四种表示方式: 二进制(binary):0,1 ,满2进1.以0b或0B开头。 十进制(decimal):0-9 ,满10进1。 八进制(octal):0-7 ,满8进1. 以数字0开头表示。 十六进制(hex):0-9及A-F,满16进1. 以0x或0X开头表示。此处的A-F不区分大小写。 如:0x21AF +1= 0X21B0
2.4 运算符 运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。 算术运算符 赋值运算符 比较运算符(关系运算符) 逻辑运算符 位运算符 三元运算符 算术运算符 算术运算符的注意问题 如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。 但被模数是负数则不可忽略。此外,取模运算的结果不一定总是整数。 对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。 例如:int x=3510;x=x/1000*1000; x的结果是? “+”除字符串相加功能外,还能把非字符串转换成字符串.例如: System.out.println(“5+5=”+5+5); //打印结果是? 5+5=55 ? 注意类型的转换
2.4.2 运算符:赋值运算符 符号:= 当“=”两侧数据类型不一致时,可以使用自动类型转换或使用强制类型转换原则进行处理。 支持连续赋值。扩展赋值运算符: +=, -=, *=, /=, %= 2.4.3 运算符:比较运算符 比较运算符的结果都是boolean型,也就是要么是true,要么是false。 比较运算符“==”不能误写成“=” 。
2.4.4 运算符:逻辑运算符
逻辑运算符用于连接布尔型表达式,在Java中不可以写成3<x<6,应该写成x>3 & x<6 。 “&”和“&&”的区别: 单&时,左边无论真假,右边都进行运算; 双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。 “|”和“||”的区别同理,||表示:当左边为真,右边不参与运算。 异或( ^ )与或( | )的不同之处是:当左右都为true时,结果为false。理解:异或,追求的是“异”! 2.4.5 运算符:位运算符 用的比较少
2.4.6 运算符:三元运算符 格式: (条件表达式)?表达式1:表达式2; 为true,运算后的结果是表达式1; 为false,运算后的结果是表达式2; 表达式1和表达式2为同种类型 三元运算符与if-else的联系与区别: 1)三元运算符可简化if-else语句 2)三元运算符要求必须返回一个结果。 3)if后的代码块可有多个语句 练习: 获取两个数中的较大数 获取三个数中的较大数
运算符的优先级 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如右表,上一行运算符总优先于下一行。 只有单目运算符、三元运算符、赋值运算符是从右向左运算的。
2.5 程序流程控制 • 流程控制语句是用来控制程序中各语句执行顺序的语句,可以把语句组合成能完成一定功能的小逻辑模块。 • 其流程控制方式采用结构化程序设计中规定的三种基本流程结构,即:顺序结构、分支结构、循环结构
顺序结构 程序从上到下逐行地执行,中间没有任何判断和跳转。 分支结构 根据条件,选择性地执行某段代码。 有if…else和switch-case两种分支语句。 循环结构 根据循环条件,重复性的执行某段代码。 有while、do…while、for三种循环语句。 注:JDK1.5提供了foreach循环,方便的遍历集合、数组元素。 2.5.1 顺序结构 顺序结构 Java中定义成员变量时采用合法的前向引用。如: public class Test{ int num1 = 12; int num2 = num1 + 2; } 错误形式: public class Test{ int num2 = num1 + 2; int num1 = 12; }
2.5.2 程序流程控制:if-else结构 范围大的在上面下面小的范围没有用
- if(条件表达式1){ 执行代码块1; } else if (条件表达式2){ 执行代码块2; } …… else{ 执行代码块n; }
2.5.3 程序流程控制:switch-case结构 switch(表达式){ case 常量1: 语句1; // break; case 常量2: 语句2; // break; … … case 常量N: 语句N; // break; default: 语句; // break; }
switch语句有关规则 switch(表达式)中表达式的值必须是下述几种类型之一:byte,short,char,int,枚举 (jdk 5.0),String (jdk 7.0); case子句中的值必须是常量,不能是变量名或不确定的表达式值; 同一个switch语句,所有case子句中的常量值互不相同; break语句用来在执行完一个case分支后使程序跳出switch语句块;如果没有break,程序会顺序执行到switch结尾 default子句是可任选的。同时,位置也是灵活的。当没有匹配的case时,执行default
switch和if语句的对比 if和switch语句很像,具体什么场景下,应用哪个语句呢? 如果判断的具体数值不多,而且符合byte、short 、char、int、String、枚举等几种类型。虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。 其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。也就是说,使用switch-case的,都可以改写为if-else。反之不成立。 2.5.4 程序流程控制:循环结构 循环结构 在某些条件满足的情况下,反复执行特定代码的功能 循环语句分类 for 循环 while 循环 do-while 循环
循环结构之for循环 语法格式:for (①初始化部分; ②循环条件部分; ④迭代部分){ ③循环体部分; } 执行过程: ①-②-③-④-②-③-④-②-③-④-.....-② 说明: ②循环条件部分为boolean类型表达式,当值为false时,退出循环 ①初始化部分可以声明多个变量,但必须是同一个类型,用逗号分隔 ④可以有多个变量更新,用逗号分隔 循环结构之while循环 语法格式 ①初始化部分 while(②循环条件部分){ ③循环体部分; ④迭代部分; } 执行过程: ①-②-③-④-②-③-④-②-③-④-...-② 说明: 注意不要忘记声明④迭代部分。否则,循环将不能结束,变成死循环。 for循环和while循环可以相互转换 循环结构之do-while循环 语法格式 ①初始化部分; do{ ③循环体部分 ④迭代部分 }while(②循环条件部分);
执行过程:①-③-④-②-③-④-②-③-④-...②
说明:do-while循环至少执行一次循环体。
嵌套循环结构 嵌套循环(多重循环) 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while均可以作为外层循环或内层循环。实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为false时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。 设外层循环次数为m次,内层为n次,则内层循环体实际上需要执行mn次。 打印出质数(算法优化) / 100000以内的所有质数的输出。实现方式一 质数:素数,只能被1和它本身整除的自然数。-->从2开始,到这个数-1结束为止,都不能被这个数本身整除。 对PrimeNumberTest.java文件中质数输出问题的优化 */ class PrimeNumberTest1 { public static void main(String[] args) { boolean isFlag = true;//标识i是否被j除尽,一旦除尽,修改其值 int count = 0;//记录质数的个数 //获取当前时间距离1970-01-01 00:00:00 的毫秒数 long start = System.currentTimeMillis(); for(int i = 2;i <= 100000;i++){//遍历100000以内的自然数 //优化二:对本身是质数的自然数是有效的。 Math.sqrt(i):数据的开方 //for(int j = 2;j < i;j++){ for(int j = 2;j <= Math.sqrt(i);j++){//j:被i去除 if(i % j == 0){ //i被j除尽 isFlag = false; break;//优化一:只对本身非质数的自然数是有效的。 } } // if(isFlag == true){ //System.out.println(i); count++; } //重置isFlag isFlag = true; } //获取当前时间距离1970-01-01 00:00:00 的毫秒数 long end = System.currentTimeMillis(); System.out.println("质数的个数为:" + count); System.out.println("所花费的时间为:" + (end - start));//17110 - 优化一:break:1546 - 优化二:13 } }
2-5-8 特殊关键字的使用:break、continue
break 语句 break语句用于终止某个语句块的执行 { …… break; …… } break语句出现在多层嵌套的语句块中时,可以通过标签指明要终止的是哪一层语句块 break 语句用法举例 public class BreakTest{ public static void main(String args[]){ for(int i = 0; i<10; i++){ if(i==3) break; System.out.println(" i =" + i); } System.out.println("Game Over!"); } } continue 语句 continue只能使用在循环结构中 continue语句用于跳过其所在循环语句块的一次执行,继续下一次循环 continue语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 continue语句用法举例 public class ContinueTest { public static void main(String args[]){ for (int i = 0; i < 100; i++) { if (i%10==0) continue; System.out.println(i); } } } return:并非专门用于结束循环的,它的功能是结束一个方法。 当一个方法执行到一个return语句时,这个方法将被结束。 与break和continue不同的是,return直接结束整个方法,不管这个return处于多少层循环之内
特殊流程控制语句说明 break只能用于switch语句和循环语句中。 continue 只能用于循环语句中。 二者功能类似,但continue是终止本次循环,break是终止本层循环。 break、continue之后不能有其他的语句,因为程序永远不会执行其后的语句。 标号语句必须紧接在循环的头部。标号语句不能用在非循环语句的前面。 很多语言都有goto语句,goto语句可以随意将控制转移到程序中的任意一条语句上,然后执行它。但使程序容易出错。Java中的break和continue是不同于goto的 eclipse的使用
E:\BaiduNetdiskDownload\Java所需软件\软件\03_Eclipse\Eclipse的使用 (注意:需要在project explorer 下创建包才是包) /**+回车:快速注释文档、方法 数组 3.1 数组的概述 数组(Array),是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。 数组的常见概念:数组名、下标(或索引) 、元素、 数组的长度 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。 数组的长度一旦确定,就不能修改。 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。 数组的分类: 按照维度:一维数组、二维数组、三维数组、… 按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)
3.2 一维数组的使用: 声明 一维数组的声明方式:type var[ ] 或 type [ ] var; 例如:int a[ ]; int[ ] a1; double b[ ]; String[ ] c; //引用类型变量数组 Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法
初始化 静态初始化:声明数组的同时赋值;动态初始化:声明数组后只有数组的长度,没有赋值;长度一旦确定就不能修改 动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行 静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
数组元素的引用 定义并用运算符new为之分配空间后,才可以引用数组中的每个元素; 数组元素的引用方式:数组名[数组元素下标] 数组元素下标可以是整型常量或整型表达式。如a[3] , b[i] , c[6*i]; 数组元素下标从0开始;长度为n的数组合法下标取值范围: 0 —>n-1;如int a[]=new int[3]; 可引用的数组元素为a[0]、a[1]、a[2] 每个数组都有一个属性length指明它的长度,例如:a.length 指明数组a的长度(元素个数) 数组一旦初始化,其长度是不可变的 数组元素的默认初始化值 数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。例如: public class Test { public static void main(String argv[]){ int a[]= new int[5]; System.out.println(a[3]); //a[3]的默认值为0 } }
对于基本数据类型而言,默认初始化值各有不同 对于引用数据类型而言,默认初始化值为null(注意与0不同!)
创建基本数据类型数组 (1) Java中使用关键字new来创建数组 如下是创建基本数据类型元素的一维数组 创建基本数据类型数组 (2) 创建基本数据类型数组 (3) 一维数组的内存解析
3.3 多维数组的使用 Java 语言里提供了支持多维数组的语法。 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像右图Excel中的表格一样。 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。 二维数组[][]:初始化 格式1(动态初始化):int[][] arr = new int[3][2]; 定义了名称为arr的二维数组 二维数组中有3个一维数组 每一个一维数组中有2个元素 一维数组的名称分别为arr[0], arr[1], arr[2] 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78; 格式2(动态初始化):int[ ][ ] arr = new int[3][ ]; 二维数组中有3个一维数组。 每个一维数组都是默认初始化值null (注意:区别于格式1) 可以对这个三个一维数组分别进行初始化 arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2]; 注: int[][]arr = new int[][3]; //非法 格式3(静态初始化):int[ ][ ] arr = new int[ ][ ]{{3,8,2},{2,7},{9,0,1,6}}; int[ ] arr[ ] = new int[ ][ ]{{3,8,2},{2,7},{9,0,1,6}}; 定义一个名称为arr的二维数组,二维数组中有三个一维数组 每一个一维数组中具体元素也都已初始化 第一个一维数组 arr[0] = {3,8,2}; 第二个一维数组 arr[1] = {2,7}; 第三个一维数组 arr[2] = {9,0,1,6}; 第三个一维数组的长度表示方式:arr[2].length; 注意特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。 Java中多维数组不必都是规则矩阵形式 多维数组内存解析 获取arr数组中所有元素的和。 提示:使用for的嵌套循环即可。 二维数组的默认初始化值:引用类型的变量要么是地址值要不然就是null
数据结构: 1、数据与数据之间的罗关系:集合、一对一、一对多、多对多 2、数据结构的存储关系: 线性表:顺序表(比如数组)、链表、栈、队列 树形结构:二叉树 图形结构: 算法: 基本的:排序算法、搜索算法