Java学习日记(一)
第一部分语法基础
- 第一章概述
- 1.1计算机组成部分
- 1.2人机交互方式
- 1.3计算机语言
- 1.4软件与软件开发
- 1.5java语言介绍
- 1.6Java开发环境搭建
- 1.7运行Java程序
- 1.8常见错误
- 1.9编程练习题
- 第二章 基本数据与运算
- 2.1关键字
- 2.2标识符
- 2.3注释
- 2.4常量与进制
- 2.5变量
- 2.6数据类型
- 2.7运算符
- 2.8常见错误
- 2.9编程练习题
- 第三章 流程控制语句
- 3.1if条件语句
- 3.2switch分支语句
- 3.3for循环
- 3.3while循环
- 第四章 常用类
- 4.1 Math类
- 4.2 Scanner类
- 4.3 Random类
- 4.4 String类
- 4.5 Character类
- 第五章 函数
- 5.2 函数的运行原理
- 5.3 函数重载
- 5.4 函数的递归
- 第六章 数组
- 6.1 数组的概念及定义
- 数组的定义方式
- 6.2 常用数组操作
- 数组遍历问题
- 数组最值问题
- 数组扩容问题
- 选择排序算法
- 冒泡排序算法
- 插入排序算法
- 计数排序算法
- 基数排序算法
- 二分查找算法
- 可变长参数列表
- 6.3 二维数组
- 二维数组的定义
第一章概述
1.1计算机组成部分
计算机主要分为两大类:硬件和软件。
硬件是可以看得到的一些物理部分,都是一些电子元件器件
软件是看不到的部分,它是一些列的命令,这些指令主要用于控制硬件来完成一些列特定的工作
常见的硬件:
1、CPU:Center Processing Unit中央处理器 主要指令控制和数值计算功能(日常工作任务)
2、内存:临时性存储数据的存储设备RAM,当内存不通电的时候,这数据也就消失了
3、显卡GPU:Graphic Processing Unit 图形图像处理单元 主要用于计算图形数据(图形图像任 务)
4、存储设备:永久性存储设备ROM 任何数据都是以二进制的形式存储的机械硬盘、固态硬盘、U盘、 光盘、移动硬盘。
5、输入输出设备
- 键盘:输入字符数据
- 鼠标:输入定位数据
- 显示器:输出图形图像数据
- 扬声器:输出声音数据
- 麦克风:输入声音数据
- 打印机:输出图形图像文本数据
- 扫描仪:输入图形图像文本数据
6、网络设备 - 输入:从互联网上下载数据
- 输出:从本地上传数据到互联网
1.2人机交互方式
我们如何与计算机打交道的
图形化界面操作方式:操作简单,表现直观,容易上手操作,步骤繁琐,占用空间大
命令行操作方式 CMD(Command win+R 输入cmd回车)窗口:操作复杂,命令较多,不容易上手,步骤简单,占用空间小,适合远程操作
常用dos命令
c: 进入C盘根目录
d: 进入D盘根目录
cd xxx 进入xxx目录
dir 查看当前目录下有什么文件和目录
cd / 进入到当前所在盘符的根目录
cd … 返回上一级目录
cls 清屏
exit 退出cmd窗口
1.3计算机语言
计算机本身就是有一系列物理硬件组成的,它们之间的沟通方式就是电信号,高低电压-二进制数据。
所以和计算机之间打交道,就得通过二进制来做,早期的编程语言/命令都是以二进制形式存在。
(1)机器语言
根据平台的不同其所表现的形式也不同,为了让计算机能够懂得人类的目的,人类必须以二进制的形式向计算机输入数据。计算机能懂,人不太懂,对初学者十分不友好的。
(2)汇编语言
通过一些单词也叫助记符,将一些常用的操作用单词表示,在程序中慢慢出现了人类的语言。比如计算2+3的结果,在汇编语言里是一下结果。这种代码计算机读不懂,还得将这些助记符包括数据转换成对应的二进制提交给计算机进行计算。转换的工具,称之为汇编器。汇编语言它的计算方式,还是依赖于计算机的计算方式的。想学好汇编语言,还得事先了解计算机的工作原理。
(3)高级编程语言
从20世纪50年代产生,第一个众所周知的高级编程语言:C语言->C++语言->Java语言->C#-Python高级编程语言完全由单词,符号和数字组成,并且书写流程也是符号人类流程。比如计算2+3如下代码所示,更容易让人类去理解。同样计算机不能够读懂这段代码,还得将代码进行转换二进制提交给计算机。转换的形式:编译,解释
(4)静态编译语言:C C++ Java
静态:在定义变量的时候有明确的数据类型的区分
编译:将源代码全部进行编译 生成一个可执行的二进制文件 计算机去执行这个二进
制文件来运行程序。(翻译一本英文书)
(5)动态解释语言:Python JS
动态:在定义变量的时候没有明确的数据类型的区分
解释:将源代码从头到尾 读取一行 编译一行 运行一行(同声传译)
1.4软件与软件开发
(1)软件的定义
软件 是 指一系列按照特定顺序组织的 计算机数据与指令 的 集合
举例:向西走50米 然后 左转向前走20米
输入三个点的坐标通过三边来计算一个三角形的面积?
说明:再用编程去解决一个问题的时候,先去获取该问题所需要的数据,然后再根据数据讨论计算的具体流程,最后再用编程语言去实现这个计算的流程
(2)软件的分类
两类:
系统软件:也称之为是操作系统,主要是用来控制和管理底层硬件的一套指令,操作系统为用户提供最基本的计算机功能。
应用软件:基于系统软件之上的,为用户带了特定领域服务的软件
(3)软件开发
软件开发的定义就是去编写上述软件,软件开发的流程是什么?
- 需求分析
- 编码实现
- 测试编码
- 上线运维
- 更新迭代
- 下线
(4)软件岗位
- 移动端软件研发 Anroid IOS - 物联网
- Web前端研发 - 数据可视化工程师
- PC端研发
- 后端研发
1.5java语言介绍
Java语言的前身Oak(橡树),1994年詹姆斯高斯林和他的团队开发出来的嵌入式编程语言。随着互联网的发展,紧随潮流编程互联网应用程序开发语言(面向对象),一直到2010年Sun公Oracle收购,Java就属于Oralce的子产品。
Oracle公司主要业务:
- 数据库 Oralce数据库 随后也把民间产品MySQL也收购了
- Linux服务器操作系统Solaris(redhat Ubuntu 深度 SUSE)
- 编程语言Java
Microso公司主要业务: - SQL Server
- Windows/Windows Server
- C++/C#
Java技术架构 - JavaSE Java Standard Edition Java标准版:桌面型应用程序
- JavaEE Java EnterpriseEdition Java企业版:服务器应用程序
- JavaME Java Micro Edition Java微型版:嵌入式应用程序
Java最大的特点——跨平台
跨平台的意思就是说,一个软件可以在多个平台上运行,而不用更改软件的内容。
是因为JVM的功劳:JVM(Java Virtual Machine)Java虚拟机。
Java源代码文件后缀名为xxx.java 所编译出来的二进制文件后缀名为xxx.class
JVM主要负责将java语言的字节码文件转换为本地操作系统指令的一个工具软件。
所以,最终是字节码文件在跨平台!
1.6Java开发环境搭建
JRE与JDK
JRE(Java Runtime Environment)Java运行环境:如果我们的计算机仅仅想运行Java程序的话,装这个软件即可。JRE = JVM + 核心类库。
JDK(Java Development Kit)Java开发工具包:如果我们的计算机想要去开发一个Java程序的话,装这个软件即可。JDK = 开发工具 + JRE。
JDK的下载与安装
- 先登录注册Oracle
- 去Oralce官网下载JDK,最新JDK15,我们目前用JDK8 https://www.oracle.com
- 点击Products
- 点击SoWare下的Java
- 右上角DownloadJava
- 找到JavaSE8 点击JDK Download
- 下拉 在下载列表中选择Windows X64
- 双击打开jdk安装程序
- 点击下一步
- JDK不需要更改目录 直接下一步
- JRE不需要更改目录 直接下一步
- 安装完成 点击关闭即可
- 验证jdk是否安装成功
- win+r 打开cmd 输入 java -version
java version "1.8.0_77"
Java(TM) SE Runtime Environment (build 1.8.0_77-b03)
Java HotSpot(TM) 64-Bit Server VM (build 25.77-b03, mixed mode)
说明安装成功!
jdk安装目录介绍
bin目录:binary放的都是开发工具
javac.exe:java编译工具
用法: javac
java.exe:java运行工具
用法: java [-options] class [args…]
(执行类)
或 java [-options] -jar jarfile [args…]
(执行 jar 文件)
db目录:放的是支持数据库开发的一些工具包
include目录:放的是一些链接底层的一些C头文件代码
jre目录:jdk自带的运行环境
lib目录:library 存放的是一些第三方Java库
javafx-src.zip:javafx图形化界面开发的源码包
src.zip:Java本身的源代码包
C:\Users\hmd>cd /
C:>cd “Program Files”
C:\Program Files>cd Java
C:\Program Files\Java>cd jdk1.8.0_77
C:\Program Files\Java\jdk1.8.0_77>cd bin
配置path环境变量
- 复制jdk中bin目录的绝对地址 C:\Program Files\Java\jdk1.8.0_77\bin
- 右键此电脑 点击属性
- 点击高级系统设置
- 点击环境变量
- 系统变量中选择Path
- 右上角 新建 将地址复制进去即可
- 一路确定出去
- 重启cmd 再去尝试javavc java
1.7运行Java程序
VSCode代码编辑器 https://code.visualstudio.com/
汉化:左下角管理 Extension 搜索Chinese 选择Chinese中文简体汉化包 点击绿色install 右下角提示重启 重启即可
主题:管理 颜色主题 自选
编码:管理 设置 文本编辑器 文件 Encoding 选择gbk结尾
字体:管理 设置 文本编辑器 字体 font size
关联代码所在的文件夹:文件 打开文件夹 选择javaday01code
步骤一:新建Java源代码文件并写入类
点击新建文件按钮,输入Java源代码文件名称和后缀名,例如Sample01.java
在文件中写入如下代码:
public class Sample01 {}
public class Sample01 中的 Sample01 是类名,而且在Java源代码中,可以存在多个类,但是
最多只能有一个public开头的类,并且该类的类名必须与文件名保持一致!!!
步骤二:编译该源代码文件
打开控制台窗口cmd,将目录切换到javaday01code目录下
C:\Users\hmd>cd Desktop
C:\Users\hmd\Desktop>cd javaday01cide
再输入 javac Sample01.java 对源代码文件进行编译
C:\Users\hmd\Desktop\javaday01code>javac Sample01.java
如果没有任何输出,则表明编译成功,并生成同名的字节码文件 Sample01.class
步骤三:运行该字节码文件
输入 java Sample01 即可
C:\Users\hmd\Desktop\javaday01code>java Sample01
错误: 在类 Sample01 中找不到 main 方法, 请将 main 方法定义为:
public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application
此时发现运行工具提示错误,对于任何一个程序而言,程序的运行都需要主函数,所以将主函数写
入其中。
public class Sample01 {public static void main(String[] args) {System.out.println("Happy New Year!");}
}
再重新编译和运行
C:\Users\hmd\Desktop\javaday01code>javac Sample01.java
C:\Users\hmd\Desktop\javaday01code>java Sample01
Happy New Yaer!
1.8常见错误
语法错误
指在编译的过程中出现的一些错误,这种错误的原因主要由那些因素产生呢?
单词评写:main—main
遗漏分号:System.out.println(“Happy New Year!”)(缺少分号)
使用中文符号的问题
大括号不匹配:(缺少大括号)
遗漏关键字单词:Static等运行错误
是指编译能够通过,但是在运行期间出现的问题
编译器只检查语法问题,但不检查算法是否运用正确,只要语法正确都能编译成功,而运行出来的结果可能与自己的需求不符合。逻辑错误
代码的运行结果和自己认为的结果不一样!比如 / 整除只会保留整数部分,舍去小数部分。
遗漏括号
遗漏分号
遗漏引号
非法使用中文符号
单词拼写错误
1.9编程练习题
public class Demo01{public static void main(String[] args){System.out.print((9.5 * 4.5 - 2.5 * 3)/(45.5 - 3.5));}
}
public class Demo02{public static void main(String[] args){System.out.println(4 * (1.0 - 1.0 / 3 + 1.0 / 5 - 1.0 / 7 + 1.0 / 9 - 1.0 / 11));System.out.println(4 * (1.0 - 1.0 / 3 + 1.0 / 5 - 1.0 / 7 + 1.0 / 9 - 1.0 / 11 + 1.0 / 13));}
}
public class Demo03{public static void main(String[] args){double radius = 5.5;System.out.println("周长 = " + 2 * radius * 3.14 + "面积 = " + radius * radius * 3.14);}
}
public class Demo04{public static void main(String[] args){System.out.print(14/ 1.6 / (45 * 60 + 30) * 3600 + "英里/小时");}
}
public class Demo05{public static void main(String[] args){double hour = 1 + (40.0 * 60.0 + 35) / 3600;double km = 24 * 1.6;double speed = km / hour;System.out.println(speed + "公里/小时");}
}
public class Demo06{public static void main(String[] args){double a = 3.4;double b = 50.2;double c = 2.1;double d = 0;double e = 44.5;double f = 5.9;double x = (e * d - b * f) / (a * d - b * c);double y = (a * f - e * c) / (a * d - b * c);System.out.println("x = "+ x + "y = "+ y );}
}
第二章 基本数据与运算
2.1关键字
关键字是指被高级编程语言赋予特殊含义的一些单词,关键字一般都是由小写字母组成。好比是汉语当中的一些专有名词:北京,天安门,兵马俑。不能乱用。
- 用于定义数据类型的关键字:byte short int long float double char boolean void class
interface - 用于定义数据类型值的关键字:true false null
- 用于定义流程控制语句的关键字:if else switch case default while do for break
continue return - 用于定义访问权限修饰符的关键字:public protected private
- 用于定义继承关系的关键字:extends implements
- 用于定义实例对象的关键字:new this super instanceof
- 用于定义函数类型的关键字:static final abstract synchronized
- 用于处理异常的关键字:try catch finally throw throws
- 用于包的关键字:package import
- 其他的一些修饰关键字:native assert volatile transient
2.2标识符
标识符指的是我们在程序中对变量、函数、类、接口、常量所定义的名称,也就是说这些名称是我们自定义的。
标识符必须满足以下组成规则:
- 标识符可以由数字、字母、下划线 _ 、美元符 $ 组成
- 标识符不能以数字开头,当然下划线和美元符其实是可以开头的,但不推荐
- 标识符不能是关键字
- 标识符也不能是Java内置类的名称
- 标识符可以为任意长度,但必须是一个连续的词
- 标识符严格区分大小写
标识符是为那些抽象的数据进行的自定义起名,为了方便程序的阅读和理解,起名尽量要有含义,不要通篇都是a b c d e f g…。在一些特殊的情况下(循环里 特殊数学符号),可以使用i j km n 之类的。
标识符命名的规范:
- 大驼峰式:主要针对类名,接口名。所有单词的首字母大写
- 小驼峰是:主要针对于变量名,函数名。除了第一个单词之外,其他单词首字母大写
- 常量规范:所有单词字母大写,单词与单词之间用下划线分隔
- 包名规范:所有单词字母小写,单词与单词之间用句号 . 分隔
myAge 变量名
getMax() 函数名
MyMoney 类名 接口名
MAX_VALUE 常量名
com.oupeng.java 包名
2.3注释
注释是用于注解和说明程序的一些程序中的内置文本信息的,但这些内置文本不属于代码的范畴。
所以在对含有注释的源代码进行编译时,所生成的字节码中不含有注释。注释给人看的!
注释主要有三种:
- 单行注释 //注释内容 直到换行为止
- 多行注释 /* 注释内容 内部可以进行换行 */
- 文档注释 /** 注释内容 内部可以进行换行 */ :文档注释可以被编译器识别,并生成相应的程序说明书。对某一个类进行文档生成时,该类必须是public型。
额外的,注释除了有解释说明程序的功能之外,还可以用来调试程序。多行注释中,不能再出现多行注释。在写代码时,一定要先写注释,并且,注释最好详细一些。
2.4常量与进制
常量就是指在程序中直接出现的一些数据,也叫字面量
常量都有哪些:
- 整数常量:十进制D 二进制B 八进制O 十六进制H
- 小数常量: 科学计数法 1.23e3=1230
- 字符常量:由一个字母、数字、符号被单引号( ‘’ )标识的数据。可以打印单个汉字、字母、打印符号需要加一个\进行转义,\n换行,\t缩进
- 字符串常量:由若干个字母、数字、符号被双引号( “” )标识的数据。"",里面不写内容也可以打印,叫做空串。null真空。
- 布尔类型常量:true false表示真假
- null常量
负数的二进制
-29的二进制 将正数部分的二进制先取反 再加1 即为负数的二进制
00011101 =>取反 11100010 =>加1 11100011
2.5变量
指的是变化的量。
变量的本质就是在内存中程序所处的进程中的一个临时存储区域。
- 该区域的存储值有限制的
- 该区域值的变化必须是同类型的或向下兼容的
- 该区域有其自身的物理内存地址-指针
- 该区域中 存储值的限制 和 数据的变化类型 由 数据类型 来决定
- 该区域中 其空间的分配 和 空间的物理内存地址 由计算机底层来决定
为了便于理解数据类型,我们对指针进行一个回顾
#include<stdio.h>
void main(){//指针: 数据类型 * 指针名 ---变量名 int * pint *p;int a = 3; //创建了一个一级指针p = &a;// //*指针运算符:(间接寻址符): 与&互为逆运算,作用就是通过操作对象的地址,获取存储的内容//&取地址运算符:用来操作对象的地址。int ** q;//创建了一里指向个二级指针 一个二级指针只能存放一级指针的内容q = &p;//不能写&aprintf("%d\n",p);//a的地址printf("%d\n",&a);//a的地址printf("%d\n",q);//p的地址printf("%d\n",*q);//a的地址printf("%d\n",&*q);//p的地址printf("%d\n",&*&*&*q);//p的地址
2.6数据类型
在Java当中,数据类型主要分为两大类:
1、基本数据类型:在变量的空间中存储数据
整型
- byte 1字节 28 256 -128~127 -27 ~ 27 - 1
- short 2字节 216 65536 -32768-32767
- int 4字节 max = 231-1
- long 8字节
浮点型
- float 4字节
- double 8字节
字符型
- char 2字节
布尔型
- boolean 不确定
在常量中,整型常量默认int类型,小数常量默认是double类型。
布尔类型,如果是单一变量的话,在JVM中true被认为是1 false被认为是0 所以是4字节存。
如果是布尔类型数组的话,在JVM中true和false被认为是byte类型 1字节。
2、引用数据类型:数据是在堆内存中存储,变量仅仅存放的是数据在堆内存中的地址
- 字符串
- 数组
- 对象
在Java中,但凡存储在堆内存中的数据,统称为对象
2.7运算符
算术运算符
算术运算符 | 含义 | 备注 |
---|---|---|
+ | 加法 | 1+2=3如+左右有字符串,则加号为连接符 |
- | 减法 | |
* | 乘法 | |
/ | 除法 | 3/2=1 3.0/2 =1.5 除号左边为整型,则整除;为浮点型,则为小数 |
% | 取余 | 9%4=1 |
a++ | 前置自增加法 | a自身加一,使用原来的值 |
++a | 后置自增 | a自身加一,使用加之后的值 |
a– | 后置自减 | a自身减一,使用原来的值 |
–a | 前置自减 | 减a自身减一,使用加之后的值 |
赋值运算符
搡作符 | 名称 | 示例 | 等价于 |
---|---|---|---|
+= | 加法賦值操作符 | i += 8 | i = i + 8 |
-= | 减法賦值搡作符 | i -= 8 | i = i - 8 |
*= | 乘法賦值操作符 | i *= 8 | i = i * 8 |
/= | 除法賦值搡作符 | i /= 8 | i = i / 8 |
%= | 求余賦值操作符 | i %= 8 | i = i % 8 |
比较运算符
运算的结果为布尔类型
大于
< 小于
= 大于等于
<= 小于等于
!= 不等于
逻辑运算符
& 单与
| 单或
^ 异或
! 非
&& 双与
|| 双或
public class Sample {public static void main(String[] args) {int x = 0;
int y = 0;
System.out.println(x++ > 0 & y++ > 0);
System.out.println(x);
System.out.println(y);
x = 0;
y = 0;
System.out.println(x++ > 0 && y++ > 0);
System.out.println(x);
System.out.println(y);
//&& 如果左边为假 则右边不用执行
//|| 如果左边为真 则右边不用执行
//相同为假 不同为真
System.out.println(true ^ true);
System.out.println(true ^ false);
System.out.println(false ^ false);
System.out.println(false ^ true);
}
}
位运算符
右移
<< 左移
& 位与
| 位或
^ 位异或
public class Sample {public static void main(String[] args) {int x = 7;
int y = 12;
System.out.println(x & y);
/*
0111
1100 &
0100 4
*/
System.out.println(x | y);
/*
0111
1100 |
1111 15
*/
System.out.println(x ^ y);
/*
0111
1100 ^
1011 11
*/
System.out.println(x << 3);
/*
0111
0111000
x * 2^3
*/
System.out.println(56 >> 2);
/*
111000
1110
56 / 2^2
*/
}
}
三目运算符
数据类型 变量名 = 布尔表达式?值1:值2;
int number = 10 % 2 == 0? 10 : 2;
补充问题:变量交换问题
int a = 3;
int b = 7;
//方法一:
int c = a;
a = b;
b = c;
System.out.println(a);
System.out.println(b);
//方法二:
a = a + b;
b = a - b;
a = a - b;
System.out.println(a);
System.out.println(b);
//方法三:
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a);
System.out.println(b);
2.8常见错误
- 未声明变量,未初始化变量而使用变量
- 整型溢出问题
- 取整错误
(1)一个是小数的问题,小数主要去的是近似值 想要得到一个0.5这个值的话 有可能会得到0.4999999
(2)一个是整数的问题,1/3 = 0.3333 * 3 = 0.99999 数学上1 - 超出预期的除法问题
(1)/左右两边是整数,结果为整数,如果出现小数则结果为小数 - 额外冗余的输入对象
import java.util.Scanner;
public class Sample {public static void main(String[] args) {Scanner scanner1 = new Scanner(System.in);
System.out.print("请输入整数:");
int num1 = scanner1.nextInt();
//下面scanner2对象就是一个多余的
Scanner scanner2 = new Scanner(System.in);
System.out.print("请输入小数:");
double num2 = scanner2.nextDouble();
/*
Sample.java:3: 错误: 找不到符号
Scanner scanner = new Scanner(System.in);
^
符号: 类 Scanner
位置: 类 Sample
*/
}
}
2.9编程练习题
public class Demo07 {/*
数据:总毫秒数 总秒数 总分钟数 总小时数
当前小时 当前分钟 当前秒
*/public static void main(String[] args) {//1.获取总毫秒数long millis = System.currentTimeMillis();
//2.计算总秒数long seconds = millis / 1000;
//3.计算总分钟数long minutes = seconds / 60;
//4.计算总小时数long hours = minutes / 60;
//5.计算当前小时数long currentHours = hours % 24;
//6.计算当前分钟数long currenrMinutes = minutes % 60;
//7.计算当前秒数long currentSeconds = seconds % 60;System.out.println(currentHours + ":" + currenrMinutes + ":" +currentSeconds);}
}
import java.util.Scanner;
public class Demo08{public static void main(String[] args){Scanner input = new Scanner(System.in);System.out.println("请输入总钱数:");double money = input.nextDouble();//讲总钱数转换成一美元money = money * 100;int dollar = (int) money / 100;money = money % 100;//转换成quarterint quarter = (int) money / 25;money = money % 25;//转换成1角int dime = (int) money / 10;money = money % 10;//转换成5分int nickel = (int) money / 5;money = money % 5;int penny = (int) money;System.out.print(dollar + "dollar " + quarter + "quarter " + dime + "dime " + nickel + "nickel " + penny +"penny" );}
}
import java.util.Scanner;
public class Demo09 {/*
数据:华氏温度 摄氏温度
*/public static void main(String[] args) {//1.提示用户输入摄氏温度Scanner input = new Scanner(System.in);
System.out.print("Enter a degree in Celsius:");double cel = input.nextDouble();
//2.利用已知公式计算华氏温度double fah = cel * 9 / 5 + 32;
//3.输出计算结果System.out.println(cel + " Celsius is " + fah + " Fahrenheit");}
}
import java.util.Scanner;
public class Demo10{public static void main(String[] args){Scanner input = new Scanner(System.in);System.out.println("Enter the radius and length of cylinder:");double radius = input.nextDouble();double height = input.nextDouble();double p = 3.14;double area = radius * radius * p;double volume = area * height;System.out.println("The area is" + area + "The volume is" + volume);}
}
import java.util.Scanner;
public class Demo11 {/*
数据:输入的0~1000的数字
个位a 十位b 百位c
*/public static void main(String[] args) {//1.提示用户输入一个数字Scanner input = new Scanner(System.in);System.out.print("Enter a number:");int number = input.nextInt();//2.分别计算a b c int a = number % 10;number /= 10;int b = number % 10;number /= 10;int c = number % 10;int sum = a + b + c;//3.输出结果System.out.println("The sum of digits is " + sum);}
}
import java.util.Scanner;public class Demo12 {public static void main(String[] args) {Scanner input = new Scanner(System.in); long totalMilliseconds = System.currentTimeMillis();long totalSeconds = totalMilliseconds / 1000;long currentSecond = totalSeconds % 60;long totalMinutes = totalSeconds / 60;long currentMinute = totalMinutes % 60;long totalHours = currentMinute / 60;long currentHour = totalHours % 24; System.out.print("Enter the time zone offset to GMT:");byte utc = input.nextByte();System.out.println("Current time is " + (currentHour + utc) + ":"+ currentMinute + ":" + currentSecond + "GMT");}
}
import java.util.Scanner;
public class Demo13{public static void main(String[] args){Scanner input = new Scanner(System.in);System.out.print("Enter the amount of water in kilograms:");double kilograms = input.nextDouble();System.out.print("Enter the initial temperature:");double InitalT = input.nextDouble();System.out.print("Enter the final temperature:");double FinalT = input.nextDouble();double energy = kilograms * (FinalT - InitalT) * 4184;System.out.println("The energy needed is " + energy);}
}
import java.util.Scanner;
public class Demo14{public static void main(String[] args){Scanner input = new Scanner(System.in);System.out.print("Enter the monthly saving amount:");double money = input.nextDouble();double totalmoney = 0;double rate = 1.00417;int month = 1;for(month = 1; month <= 12; month++ ){ totalmoney = (totalmoney +money) * rate;System.out.println("The month is" + month + ",The account value is" + totalmoney);}}
}
import java.util.Scanner;
public class Demo15 {/*
数据:两个点坐标 x1 y1 x2 y2 距离
*/public static void main(String[] args) {//1.提示用户输入两个点的坐标Scanner input = new Scanner(System.in);System.out.print("Enter x1 and y1:");double x1 = input.nextDouble();double y1 = input.nextDouble();System.out.print("Enter x2 and y2:");double x2 = input.nextDouble();double y2 = input.nextDouble();//2.计算两点间距离double distance = Math.sqrt(Math.pow(x2 - x1 , 2) + Math.pow(y2 - y1 , 2));//3.输出结果System.out.println("The distance between the two points is " + distance);}
}
import java.util.Scanner;
public class Demo16{public static void main(String[] args){Scanner input = new Scanner(System.in);System.out.print("Enter three points for a tringle:");double x1 = input.nextDouble();double y1 = input.nextDouble();double x2 = input.nextDouble();double y2 = input.nextDouble();double x3 = input.nextDouble();double y3 = input.nextDouble();double d1 = Math.sqrt(Math.pow(x1 - x2,2) + Math.pow(y1 - y2,2));double d2 = Math.sqrt(Math.pow(x2 - x3,2) + Math.pow(y2 - y3,2));double d3 = Math.sqrt(Math.pow(x3 - x1,2) + Math.pow(y3 - y1,2));double s = (d1 + d2 + d3) / 2;double area = Math.sqrt(s * (s - d1) * (s - d2) * (s - d3));System.out.print("The area of the triangle is" + area);}
}
第三章 流程控制语句
3.1if条件语句
单分支语句
...CodeA
if(布尔表达式){语句组;}
...CodeB
双分支if-else语句
...CodeA
if(布尔表达式){语句组A;
}else{语句组B;}
...CodeB
多分支if-else-if语句
...CodeA
if(布尔表达式1){语句组A;
}else if(布尔表达式2){语句组B;
}else if(布尔表达式){语句组C;
}else{语句组D;
}
...CodeB
3.2switch分支语句
与if分支语句一样,都是对条件的判断。switch一般用在条件较多的情况下,但是有一个重要的细节及时,if语言可以对区间值或固定值进行判断,switch只能对固定值进行判断。
switch (变量) {case 值1: //if (变量==值1) {语句组A;}
语句组A;
break;
case 值2:
语句组B;
break;
...
case 值n: //if (变量==值n) {语句组N;}
语句组N;
default: // else {语句组N+1;}
语句组N+1;
break;
}
switch的一些小细节
- switch
所传入的变量
,char,byte,short,int,String或者枚举型
,java SE7开始,case标签还可以是字符串字面量。 - 值1,值2,一直到值n,这几个值必须是同一个数据类型
- 当变量匹配的相关casee的值的时候,执行case中的语句,直到遇到break结束;如果该case语句中没有break,则继续向下执行,直到遇到另外一个break结束。
public class Sample {public static void main(String[] args) {int a = 3;switch (a) {case 1:System.out.println("case 1");break;case 2:System.out.println("case 2");break;case 3:System.out.println("case 3");case 4:System.out.println("case 4");case 5:System.out.println("case 5");break;default :System.out.println("default");break;}}
}
3.3for循环
循环主要解决具有规律性且具有在重复性的代码问题,避免代码冗余。
循环四要素
- 循环的初始化:循环的第一次执行从哪里开始
- 循环的继续条件:循环从当前轮是否先后执行一轮
- 循环体:需要被循环执行的部分
- 循环的步长、周期:当前循环到下一轮循环之间的变化
我们常见的循环问题可以分为两大类:
- 已知循环次数的
- 未知循环次数但是已知循环结束条件 一般用while语句做
for(1循环的初始化;2循环的继续条件;4循环的步长){3循环体}
for循环演示
import java.util.Scanner;
public class Sample {public static void main(String[] args) {/*******/for (int i = 1; i <= 5; i++) {System.out.print("*");}System.out.println();System.out.println("=============================");/**********************/for (int j = 1; j <= 4; j++) {for (int i = 1; i <= 5; i++) {System.out.print("*");}System.out.println();}System.out.println("=============================");/******************************/for (int line = 1; line <= 7; line++) {for (int i = 1; i <= line; i++) {System.out.print("*");}System.out.println();}System.out.println("=============================");/***********************/for (int line = 6; line >= 1; line--) {for (int i = 1; i <= line; i++) {System.out.print("*");}System.out.println();}System.out.println("=============================");
/* i j* 1 1** 2 1 2*** 3 1 2 3**** 4 1 2 3 4***** 5 1 2 3 4 5****** 6 1 2 3 4 5 6 j <= i***** 7 1 2 3 4 5**** 8 1 2 3 4*** 9 1 2 3** 10 1 2* 11 1 j <= 12 - ij <= i && j <= 12 - i
*/for (int i = 1; i <= 11; i++) {for (int j = 1; j <= i && j <= 12 - i; j++) {System.out.print("*");}System.out.println();}System.out.println("=============================");
/* i |i - 6|* 1 -5** 2 -4*** 3 -3**** 4 -2***** 5 -1****** 6 0***** 7 1**** 8 2*** 9 3** 10 4* 11 5
*/for (int i = 1; i <= 11; i++) {for (int k = 1; k <= Math.abs(i - 6); k++) {System.out.print(" ");}for (int j = 1; j <= i && j <= 12 - i; j++) {System.out.print("* ");}System.out.println();}System.out.println("=============================");
/* j* 1* * 1 2* * 1 2 3* * 1 2 3 4* * 1 2 3 4 5* * 1 2 3 4 5 6* * 1 2 3 4 5* * 1 2 3 4* * 1 2 3* * 1 2* 1j == 1 j == i j + i == 12
*/for (int i = 1; i <= 11; i++) {for (int k = 1; k <= Math.abs(i - 6); k++) {System.out.print(" ");}for (int j = 1; j <= i && j <= 12 - i; j++) {if (j == 1 || j == i || j + i == 12) {System.out.print("* ");} else {System.out.print(" ");}}System.out.println();}}
}
3.3while循环
while循环主要用于解决循环次数未知,但循环结束条件已知的情况。
while其实和for循环是可以相互转换的,是因为都逃不开循环四要素。
for (int i = 1; i <= 5; i++) {System.out.println(i);
}
可以转换为while循环
int i = 1;
while (i <= 5) {System.out.println(i);
i++;
}
while的语法格式:
1.循环的初始化
while (2.循环继续条件) {3.循环体
4.循环的步长、周期
}
3.5do …while
do…while语法格式
do
{循环语句(循环体)
}
do…while循环与while循环的区别
do…while 先执行循环条件再执行判断
while 先执行判断是否需要执行循环
3.6continue和break
break在循环语句中叫做终止语句,终止的是break最近的一层循环。
continue在循环语句中叫做跳过语句,跳过本次循环开启下一轮循环。
import java.util.Scanner;
public class Sample {public static void main(String[] args) {for (int i = 1; i <= 5; i++) {if (i == 3) {break;} else {System.out.println(i);}}//结果 1 2for (int i = 1; i <= 5; i++) {if (i == 3) {continue;} else {System.out.println(i);}}//结果 1 2 4 5}
}
第四章 常用类
4.1 Math类
Math类是用于数学计算的一个工具类。在程序中使用的时候,可以用Math.函数名()来调用,也可以手动导入import static java lang.Math.*
。
对于工具类而言,里面的大部分成员都是静态的static
自带常量
- static double E:自然对数
- static double PI:圆周率
取整方法
- static double ceil(double a):向上取整
- static double floor(double a):向下取整
- static long round(double a):四舍五入
三角函数
- static double sin(double a):正弦函数 参数是弧度值
- static double cos(double a):余弦函数
- static double tan(double a):正切函数
- static double toDegrees(double a):将弧度转角度
- static double toRadians(double angles):将角度转弧度
- static double asin(double a):反正弦函数
- static double acos(double a):反余弦函数
- static double atan(double a):反正切函数
指数函数
- static double pow(double a, double b):求a的b次幂
- static double sqrt(double a):求a的平方根
- static double cbrt(double a):求a的立方根
其他方法
- static double abs(double a):求a的绝对值
- static double hypot(double deltX, double deltY):返回 两点间距离
- static double max(a,b):返回a和b之间的最大值
- static double min(a,b):返回a和b之间的最小值
- static double random():返回[0,1)之间的随机小数
4.2 Scanner类
主要用于负责数据输入的类,底层是和IO流相关。
- String next():获取直到遇到空格为止的一个字符串
- String nextLine():获取直到遇到回车为止的一个字符串
- int nextInt():获取下一个整数 byte short long
- double nextDouble()
- boolean nextBoolean()
- float nextFloat()
import java.util.Scanner;
public class Sample {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("输入一句话:");String line = input.nextLine();System.out.println(line);System.out.print("输入三个单词:");String word1 = input.next();String word2 = input.next();String word3 = input.next();System.out.println(word1);System.out.println(word2);System.out.println(word3);}
}
4.3 Random类
主要用于产生随机数
- boolean nextBoolean():随机产生布尔类型值
- double nextDouble():随机生成0.0~1.0之间的小数
- double nextInt():随机生成一个整数0~232的整数
- double nextInt(n):随机生成一个整数[0,n)的整数
import java.util.Random;
public class Sample {public static void main(String[] args) {Random random = new Random();for (int i = 1; i <= 10; i++) {System.out.print(random.nextBoolean() + " ");}System.out.println();for (int i = 1; i <= 10; i++) {System.out.print(random.nextInt(2) + " ");}System.out.println();for (int i = 1; i <= 10; i++) {System.out.print(random.nextInt() + " ");}System.out.println();}
}
4.4 String类
String是一个类,它描述的是字符串。在Java代码当中,所有字符串常量(字符串字面量)都是String类的一个实例对象。并且,字符串一旦创建,则不可修改! 不可修改其长度,不可修改其内容 。所以将来对字符串内容的改变,不能在原地改,只能重新创建一个字符串。
public class Sample {public static void main(String[] args) {String s1 = "abc";String s2 = "ab" + "dc";//上述代码一共有几个字符串?//四个"abc" "ab" "dc" "abdc"}
}
获取相关
- char charAt(int index):获取指定角标index处的字符
- int indexOf(int ch):获取指定字符(编码)在字符串中第一次(从左到右)出现的地方返回的是角标。如果是-1 表示不存在
- int lastIndexOf(int ch):获取指定字符(编码)在字符串中第一次(从右到做)出现的地方返回的是角标
- int indexOf(String str):获取指定字符串在本字符串中第一次(从左到右)出现的地方返回的是角标
- int lastIndexOf(String str):获取指定字符串在本字符串中第一次(从右到左)出现的地方返回的是角标
- int length():获取字符串的长度(字符的个数)
- String[] split(String regex):将字符串按照regex的定义进行切割(regex指的是正则表达式)
- String substring(int beginIndex):截取一段子字符串,从beginIndex开始到结尾
- String substring(int beginIndex, int endIndex):截取一段子字符串,从beginIndex开始到endIndex(不包含)
判断相关
- int compareTo(String anotherString):按照字典顺序比较两个字符串的大小
- boolean contains(String another):判断当前字符串中是否包含指定字符串another
- boolean equals(String another):比较当前字符串与指定字符串的内容是否相同
- boolean isEmpty():判断当前字符串是否为空,length() == 0
- boolean startsWith(String prefix):判断该字符串是否以prefix开头
- boolean endsWith(String suix):判断该字符串是否已suix结尾
修改相关
- String toLowerCase():将字符串中所有的英文字母全部变为小写
- String toUpperCase():将字符串中所有的英文字母全部变为大写
- String trim():将字符串中两端的多余空格进行删除
- String replace(char oldCh,char newCh):将字符串中oldCh字符替换成newCh字符
import java.util.Random;
public class Sample {public static void main(String[] args) {String str = "banana orange apple watermelon";System.out.println(str.charAt(1)); //'a'System.out.println(str.indexOf('o')); //7System.out.println(str.lastIndexOf(97));//21System.out.println(str.length());System.out.println(str.substring(6));System.out.println(str.substring(9,13));String[] arr = str.split(" ");System.out.println(arr[2]);String s1 = "abc";String s2 = "abe";System.out.println(s1.compareTo(s2));//结果<0 s1在s2之前 ==0 s1和s2一样 >0 s1在s2之后System.out.println("hehe".compareTo("hehe"));System.out.println("abcbc".contains("bcb"));System.out.println("lala".equals("lala"));String s3 = "大桥未久.avi";System.out.println(s3.endsWith(".avi"));System.out.println(s3.startsWith("大桥未久"));String s4 = "Happy Boy Happy Girl";System.out.println(s4.toLowerCase());System.out.println(s4.toUpperCase());System.out.println(s4);System.out.println(" 123123 321321 ".trim());String s5 = "旺财是只狗,旺财咋叫?旺财来叫一个~";System.out.println(s5.replace('狗','猫'));System.out.println(s5.replace("旺财","小强"));}
}
如何删除字符串中左右两端出现的空格,不用trim
public class Sample {public static void main(String[] args) {String str = " 123123123 12123 ";//去空格后"123123123 12123"int l = 0;int r = str.length() - 1;while (str.charAt(l) == ' ') {l++;}while (str.charAt(r) == ' ') {r--;}System.out.println("[" + str.substring(l,r + 1) + "]");}
}
在字符串"abcbcbcbcbcbc"中统计"bcb"出现的次数
public class Sample {public static void main(String[] args) {//最好的算法KMP算法String s1 = "abcbcbcbcbcbc";String s2 = "bcb";//贪心算法 5个int count = 0;for (int i = 0; i < s1.length() - s2.length() + 1; i++) {if (s1.charAt(i) == s2.charAt(0)) {if (s2.equals(s1.substring(i,i + s2.length()))) {count++;}}}System.out.println(count);//非贪心算法 3个/*String temp = s1;int count = 0;while (true) {int index = temp.indexOf(s2);if (index == -1) {break;}count++;temp = temp.substring(index + s2.length());}System.out.println(count);*/}
}
查找两个字符串中最长的公共子串
public class Sample {public static void main(String[] args) {String s1 = "c is a program but is diffcult";String s2 = "Java is a program but is slow";for (int len = s2.length(); len > 0; len--) {for (int l = 0,r = len - 1; r < s2.length(); l++,r++) {String temp = s2.substring(l,r + 1);if (s1.contains(temp)) {System.out.println(temp);return;//直接结束程序}}}}
}
4.5 Character类
Character它是char基本数据类型的 包装类 ,有这么几个静态方法我可目前可以使用到的
- static boolean isDigit(char ch):判断字符是否是数字
- static boolean isLetter(char ch):判断字符是否是字母
- static boolean isLetterOrDigit(char ch):判断字符是否是数字或字母
- static boolean isLowerCase(char ch):判断是否是小写字母
- static boolean isUpperCase(char ch):判断是否是大写字母
- static boolean isSpaceChar(char ch):判断是否空白字母(空格 制表符 回车)
将十六进制数字转为十进制
import java.util.Scanner;
public class Sample {public static void main(String[] args) {Scanner input = new Scanner(System.in);System.out.print("请输入一个十六进制的数字:");//0~9 A~FString hex = input.nextLine().toUpperCase();if (hex.length() == 0) {System.out.println("没有任何输入!");return;//程序直接结束}for (int i = 0; i < hex.length(); i++) {char ch = hex.charAt(i);if (Character.isDigit(ch) || Character.isLetter(ch)) {if (Character.isLetter(ch) && (ch < 'A' || ch > 'F')) {System.out.println("非法字符" + ch);return;}} else {System.out.println("非法字符" + ch);return;}}int sum = 0;for (int i = hex.length() - 1; i >= 0; i--) {char ch = hex.charAt(i);if (Character.isDigit(ch)) {//'1' ? 1sum = sum + (int)Math.pow(16 , hex.length() - i - 1) * (ch - 48);} else {//'A' - 65 + 10 -> 10sum = sum + (int)Math.pow(16 , hex.length() - i - 1) * (ch - 55);}}System.out.println(sum);}
}
第五章 函数
什么是函数
函数的定义就是指一段具有独立功能的代码,减少代码冗余,提高程序的利用率和效率。
我们应该如何去定义函数呢?
- 需要一个封闭的空间,将这段独立性的代码进行封装,用一对大括号
- 需要对每一个封闭的空间进行命名,函数名
- 函数所需要的一些原始数据
- 函数所产生的一些结果数据
函数的语法格式
修饰符 函数类型 返回值类型 函数名(数据类型 数据1,数据类型 数据2,...) {独立功能的代码片段;
return 函数的计算结果;
}
- 修饰符:指的是函数的访问权限,public private 默认 protected
- 函数类型:函数的分类,本地函数native,静态函数static,同步函数 synchronized
- 返回值类型:指的就是函数计算结果的数据类型 如果函数没有返回值 则为void
- 函数名:就是函数的名称
- 参数列表:指的是外界向函数传入的数据(实际参数),由这些参数变量进行接收(形式参数)
- 函数体:具有独立功能的代码片段;
- return:仅仅表示函数结束!如果函数有返回值,则return后跟返回值;如果没有返回值,则return可以不写,但是是存在的(隐藏的 在最后一行)
根据形参和返回值来看,函数有如下几个分类
- 有参数有返回值
- 有参数没返回值
- 没参数有返回值
- 没参数没返回值
总结定义函数时需要考虑的有哪些?
函数的运行有哪些未知的参数?
函数的运行结果有是什么?
明确参数和结果 明确内容和返回
函数到底要干什么?尽量将独立功能且重复性较高的代码片段提取出来
5.2 函数的运行原理
函数的运行是基于栈运行的
栈:是一种先进后出的容器,我们这里面所说的栈是指JVM中的栈内存空间。
每一个函数,叫做栈帧,栈帧中所包含的内容有函数的定义,参数列表,函数的执行内容代码。
每一个函数要运行,就相当于这个栈帧进入到栈内存中-入栈。
如果一个函数即将结束,将这个栈帧从栈顶移出-出栈。
如果栈内存中有多个栈帧,运行的是最上面的栈帧,底下的栈帧暂停运行,直到该栈帧为栈顶元素。
比如:主函数先进栈,开始逐行运行,如果执行到第n行,调用另外一个函数A,则主函数在第n行暂停运行,将另一个函数A的栈帧入栈,再继续逐行运行,直到函数A的内容执行完毕,函数A出栈,主函数接着从第n行继续向下执行。以此类推。
5.3 函数重载
同一个类中可以出现多个同名函数,这个现象就叫做函数的重载(overload)
如何来区分同名函数是否是重载关系呢?前提必须是同名,和返回值类型无关(返回值类型只和函数的计算功能相关),和权限也没有关系,和形式参数的名称也无关!只和形式参数的数据类型有关(数量,排列组合)
public static void show(int a ,float b ,char c){}
下列哪些是该函数的重载:
int show(int x, float y, char z) :不算重载 数据类型都是int float char
void show(float b,int a,char c):算重载,顺序不一样float int char
void show(int a,int b,int c):算重载,顺序不一样int int int
double show():算重载,参数不一样
寻找重载函数的流程:
- 看是否有确切的参数定义匹配,int int 找 int int
- 看是否有可兼容的参数定义匹配,int int找double double或int double或double int
- 如果可兼容的参数定义匹配较多,会报引用确定报错 引用不明确
5.4 函数的递归
函数的递归就是指函数自身调用自身。
人用迭代,神用递归
- 但凡迭代能够解决的问题,递归都可以解决;递归能够解决的问题,迭代就不一定了
- 相对而言,从内存的角度而言,函数如果过多的自我调用,势必会对内存不友好,占用过多
- 通常来讲,同样的问题用递归写要比用迭代写代码量较少
写递归时,一定要先确定递归结束条件-递归边界
什么情况下可以使用递归?迭代的,数学归纳法的问题
第六章 数组
6.1 数组的概念及定义
数组主要用于解决大量数据计算与存储的问题
比如:输入100个数字,统计其中的最大值和最小值并计算平均值,创建100个变量,会有一堆ifelse语句,比较麻烦。
数组是Java提供的一种最简单的数据结构,可以用来存储一个元素 个数固定 且 类型相同 的有序集。
数组在内存中的情况
栈:主要用于运行函数的内存
堆:主要用于存储数据对象的内存
每一个数组而言,都是存在堆内存当中,每一个数组都是一个对象
1、数组本质上就是在堆内存中一系列地址连续且空间大小相等的存储空间(变量),每一个存储空间用来存储数据(基本,引用)
2、数组是在堆内存中存储,称之为是一个对数对象,并且在堆内存中存储的数据都有 默认初始化的流程。所以数组创建之初,每一个存储空间里面都会被JVM初始化该数据类型对应的零值。
3、数组的地址是连续的,所以通过公式:An=A1+(n-1)*d可以快速访问到其他的元素,所以对于数组而言查找元素比较快的。将元素的真实物理地址转换成对应的角标获取元素。
4、如何来调用数组呢?通过一个变量存储该数组在堆内存当中的首元素的地址。
5、当数组一旦定义出来,其长度不可变,存储空间的内容是可变的
6、所以我们在定义数组的时候,要么把长度固定,要么直接输入相关的元素。
数组的定义方式
//创建一个指定长度且指定数据类型的一维数组,名称为数组名,虽然没有指定元素,但是会有默认值
数据类型[] 数组名 = new 数据类型[长度];
//创建一个指定元素且指定数据类型的一维数组,名称为数组名,虽然有指定元素,还是有默认初始化这个步骤的!
数据类型[] 数组名 = new 数据类型[]{数据1,数据2,…,数据n};
数据类型[] 数组名 = {数据1,数据2,…,数据n};
public class Sample {public static void main(String[] args) {int[] arr = new int[5];System.out.println(arr[0]);//System.out.println(arr[5]);//ArrayIndexOutOfBoundsExceptionarr[2] = 10;int[] arr2 = arr;System.out.println(arr2[2]);arr2 = null;//System.out.println(arr2[2]);//NullPointerException/*String s = null;s.length();*/arr = null;}
}
6.2 常用数组操作
数组遍历问题
public class Sample {public static void main(String[] args) {int[] arr = new int[]{1,2,3,4,5,6,7,8,9};//String str str.length()-函数//int[] arr arr.length-属性for (int i = 0; i < arr.length; i++) {arr[i] = arr[i] * 10;System.out.println(arr[i]);}//通过角标遍历 可以在遍历的过程中对指定的元素进行修改//foreach遍历 主要针对的是一些可迭代对象 Iterable/*for (数据类型 变量名 : 可迭代容器) {}*/for (int num : arr) {//num -> arr[i]num = num / 10;System.out.println(num);}//这种遍历方式 只能获取元素,不能修改元素for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}
}
数组最值问题
public class Sample {public static void main(String[] args) {int[] arr = new int[]{3,6,8,2,9,4,5,1,7};int min = arr[0];int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] < min) {min = arr[i];}if (arr[i] > max) {max = arr[i];}}System.out.println(max);System.out.println(min);}
}
数组扩容问题
public class Sample {public static void main(String[] args) {int[] arr = new int[]{1,2,3,4,5};arr = add(arr,6);arr = add(arr,6);arr = add(arr,6);arr = add(arr,6);for (int i = 0; i < arr.length; i++) {System.out.println(arr[i]);}}//在指定的数组arr中添加元素elementpublic static int[] add(int[] arr, int element) {int[] newArr = new int[arr.length + 1];for (int i = 0; i < arr.length; i++) {newArr[i] = arr[i];}newArr[newArr.length - 1] = element;return newArr;}
}
选择排序算法
public class Sample {//选择排序public static void main(String[] args) {int[] arr = {8,9,2,6,7,1,4,5,3};for (int i = 0; i < arr.length - 1; i++) { //-1 n个数字没有第n轮for (int j = i + 1; j < arr.length; j++) {if (arr[i] > arr[j]) {swap(arr,i,j);}}}print(arr);}//[1, 2, 3, 4, 5]public static void print(int[] arr) {System.out.print("[");for (int i = 0; i < arr.length;i++) {System.out.print(arr[i]);if (i == arr.length - 1) {System.out.println("]");} else {System.out.print(", ");}}}public static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}
冒泡排序算法
public class Sample {//冒泡排序public static void main(String[] args) {int[] arr = {8,9,2,6,7,1,4,5,3};for (int i = 0; i <arr.length - 1; i++) {//-1 表示n个数字只有n-1轮for (int j = 0; j < arr.length - 1 - i; j++) {//-1 避免重复比较(当前最大和上一轮最大)if (arr[j] > arr[j + 1]) {swap(arr,j,j+1);}}}print(arr);}public static void print(int[] arr) {System.out.print("[");for (int i = 0; i < arr.length;i++) {System.out.print(arr[i]);if (i == arr.length - 1) {System.out.println("]");} else {System.out.print(", ");}}}public static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}
插入排序算法
public class Sample {//插入排序public static void main(String[] args) {int[] arr = {8,9,2,6,7,1,4,5,3};for (int i = 1; i < arr.length; i++) {int e = arr[i];int j = 0;for (j = i; j > 0 && arr[j - 1] > e; j--) {arr[j] = arr[j - 1];}arr[j] = e;}print(arr);}public static void print(int[] arr) {System.out.print("[");for (int i = 0; i < arr.length;i++) {System.out.print(arr[i]);if (i == arr.length - 1) {System.out.println("]");} else {System.out.print(", ");}}}
}
计数排序算法
public class Sample {//计数排序public static void main(String[] args) {int[] arr = {-2,9,-1,12,8,-3,6,7,4,5,2,1,0,8,6,7,4,-3,-2,-1,-1,7};int min = arr[0];int max = arr[0];//O(n)for (int i = 1; i < arr.length; i++) {if (arr[i] < min) {min = arr[i];}if (arr[i] > max) {max = arr[i];}}int[] temp = new int[max - min + 1];//对应关系 index = number - min number = index + min//O(n)for (int i = 0; i < arr.length; i++) {temp[arr[i] - min]++;}//temp[index] 表示index对应的数字number出现的次数int k = 0;//O(n)for (int index = 0; index < temp.length; index++) {while (temp[index] != 0) {arr[k] = index + min;k++;temp[index]--;}}print(arr);}public static void print(int[] arr) {System.out.print("[");for (int i = 0; i < arr.length;i++) {System.out.print(arr[i]);if (i == arr.length - 1) {System.out.println("]");} else {System.out.print(", ");}}}
}
基数排序算法
import java.util.LinkedList;
public class Sample {//基数排序public static void main(String[] args) {int[] arr = {102,203,321,13,12,78,96,34,37,28,6,8,5,6};//1.先找到最大值 决定轮数int max = arr[0];for (int i = 0; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}int radex = (max + "").length();//2.创建十个桶 每一个桶是LinkedListLinkedList<Integer>[] queues = new LinkedList[10];for (int i = 0; i < queues.length; i++) {queues[i] = new LinkedList<Integer>();}//3.进行数字分类和规整//r=0个位 r=1十位 r=2百位...for (int r = 0; r < radex; r++) {//先按照r进行分类for (int i = 0; i < arr.length; i++) {int index = getIndex(arr[i],r);//获取数字的r位 返回该数字要去的桶的角标0~9queues[index].offer(arr[i]);}//然后在重新规整到arr里int k = 0;for (int index = 0; index < queues.length; index++) {while(!queues[index].isEmpty()) {arr[k++] = queues[index].poll();}}}print(arr);
}public static int getIndex(int number, int r) {//123 r=0//123 r=1//123 r=2int index = 0;for (int i = 0; i <= r; i++) {index = number % 10;number /= 10;}return index;}public static void print(int[] arr) {System.out.print("[");for (int i = 0; i < arr.length;i++) {System.out.print(arr[i]);if (i == arr.length - 1) {System.out.println("]");} else {System.out.print(", ");}}}
}
二分查找算法
有一个前提,所查找的数据集必须是有序的(升序,降序)
public class Sample {//二分查找public static void main(String[] args) {int[] arr = {1,2,3,4,5,6,7,8,9};int min = 0;int max = arr.length - 1;int mid = (min + max) / 2;int key = 10;while (arr[mid] != key) {if (key < arr[mid]) {max = mid - 1;}if (arr[mid] < key) {min = mid + 1;}if (min > max) {mid = -1;break;}mid = (min + max) / 2;}System.out.println(mid);}
}
可变长参数列表
public class Sample {public static void main(String[] args) {show(1);show(1,2,3);show("hehe","lala","haha","xixi","heihei");}public static void show(int ... nums) {for (int i = 0; i < nums.length; i++) {System.out.print(nums[i] + " ");}System.out.println();}public static void show(String ... strs) {for (int i = 0; i < strs.length; i++) {System.out.print(strs[i] + " ");}System.out.println();}
}
6.3 二维数组
二维数组,在表现形式上就是一个表格,在操作表格的时候以行列来操作
所谓的二维数组,本质上就是一个一维数组,只不过该一维数组里面的元素是另一个一维数组而已
二维数组的定义
public class Sample {public static void main(String[] args) {//数据类型[][] 矩阵名 = new 数据类型[row][col];int[][] matrix = new int[3][2];/*数据类型[][] 矩阵名 = new 数据类型[][] {{...},{...},{...}};数据类型[][] 矩阵名 = {{...},{...},{...}};*/int[][] matrix2 = {{1,2,3},{4,5,6},{7,8,9}};for (int i = 0; i < matrix2.length; i++) {for (int j = 0; j < matrix2[i].length; j++) {System.out.print(matrix2[i][j] + " ");}System.out.println();}int[][] matrix3 = {{1},{1,2,3},{1,2,3,4},{7,6,5,4,3,2,1}};for (int i = 0; i < matrix3.length; i++) {for (int j = 0; j < matrix3[i].length; j++) {System.out.print(matrix3[i][j] + " ");}System.out.println();}}
}
Java学习日记(一)相关推荐
- Java学习日记1——基础认知
Java学习日记1--基础认知 学习Java阶段,如果发现不正确的描述,还请指正! 首先附上Java相关下载链接和配置教程链接 Java相关软件工具下载地址:官方下载 Java环境配置(win10配置 ...
- Java学习日记-Day01
Java学习日记-Day01 Java语言概述 比特(byte)与字节 内存 Java基础知识图解 人机交互方式 常用的DOS命令 常用快捷键 计算机编程语言介绍 第一代语言 第二代语言 第三代语言 ...
- 尚学堂Java学习日记Day3
尚学堂Java学习日记Day3 第三天老师先回顾了昨天的内容我从回顾中掌握了新的知识 如下图所示 int与double计算,输出类型为double的不同结果 会把int转成double类型的,这是隐式 ...
- Java学习日记:UI篇(6)--谢尔宾斯基地毯图
Java学习日记:UI篇(6)–谢尔宾斯基地毯图 引言:谢尔宾斯基地毯是数学家谢尔宾斯基提出的一个分形图形,谢尔宾斯基地毯和谢尔宾斯基三角形基本类似,不同之处在于谢尔宾斯基地毯采用的是正方形进行分形构 ...
- 尚学堂Java学习日记Day1
尚学堂学习日记Day1 #今天开始写学习博客记录自己学习java的点滴成长历程,希望能成为学弟学妹们的前车之鉴. 先大概的自我介绍下,我原本从事的是网络工程师,学习的是Cisco(思科)并拥有CCNP ...
- Java学习日记8:文件上传工具类的实现和服务器给客户端发送图片
文件上传的工具类: 每次文件上传要写很多东西,把这些封装成一个工具类,以后用起来就会方便很多. 先创建一个类存储上传文件的信息: package com.upload; /*** 每上传成功一个文件的 ...
- 【日记】Java学习日记(第63天)持续无聊更新
前言 Youtube上EJ Media(up主)的视频我依次学完了HTML.CSS.Javascript.Jquery.觉得他教得挺好的(短小精悍),就继续学他教的JAVA.感觉EJ教的都是些语法什么 ...
- 2019-06-03 Java学习日记 day24 多线程
多线程 线程是程序执行的一台路径,一个进程中可以包含多条线程 多线程并发执行可以提高程序的效率,可以同时完成多项工作 多线程的应用背景 红蜘蛛同时共享屏幕给多个电脑 迅雷开启多条线程一起下载 QQ同时 ...
- Java学习日记----反射
------- android培训.java培训.期待与您交流! ---------- 1 Class类 1.1 反射不是Java1.5的新特性,而是从1.2就有的特性,在以后学习到框架都要用到反 ...
- 2019-05-21 Java学习日记之String类型Demo
String类的构造方法: public String():空构造 public String(byte[ ] bytes):把字节数组转成字符串 public String(byte[ ] byte ...
最新文章
- 沉浸式导航栏html,混合开发 h5+ 沉浸式的适配
- 如何快速搭建 LaTeX 轻量级写作环境(VSCode)?
- GopherChina 2018 区块链+容器+Go底层实现
- 圆形和多边形雷达图python-Matplotlib绘制雷达图和三维图的示例代码
- Vue cli3.0创建Vue项目
- Winform中创建超链接,点击跳转网页
- Linux内核 触摸板,Linux下关闭触摸板和触摸杆
- 本机 Hosts 管理神器 SwitchHosts
- 钉钉直播一键下载(网络抓包入门)
- 惊艳CES!优必选Walker新一代迈出里程碑一步,仿人机器人进入家庭取得重大突破
- word如何给多张图片批量添加边框
- 《Python 黑科技》一键分析评论关键词,制作精美词云
- JAVA学习路线图 【黑马版】
- 文件:因为懂你,所以永恒 +习题复习
- 12个降维技术的终极指南(使用Python代码)
- 详解瀑布流布局的5种实现及oject-fit属性,附源码
- 《社会调查数据管理——基于Stata 14管理CGSS数据》一1.5 本书简介和使用说明...
- 如何合理的布局关键词
- 一键批量创建招标单、询价单和采购订单
- SQL练习:查询近30天活跃用户数
热门文章
- FPGA零基础学习:VGA协议驱动设计
- 扩容内存卡用mydisktest失效,教你怎么用USBoot恢复出真实容量
- 克拉克松Clarkson Research情报网注册登录及进行数据查询(以世界造船厂分布为例)
- linux设置用户默认桌面背景,linux 修改桌面背景
- 家电哥回馈社会 心系老人忙公益
- 群晖服务器创建文件夹,群晖Synology 创建共享文件夹视频图文教程
- python os.walk如何不遍历隐藏文件,Python os.walk() 遍历出当前目录下的文件夹和文件...
- android跳转到锁屏及后台管理界面,Android 锁屏状态下后台弹出界面
- ardupilot 关于设备车Rover的学习《2》------如何解锁
- 四层七层负载均衡区别