计算机主要分为两大类:硬件和软件。
硬件是可以看得到的一些物理部分,都是一些电子元件器件
软件是看不到的部分,它是一些列的命令,这些指令主要用于控制硬件来完成一些列特定的工作
常见的硬件:
1、CPU:Center Processing Unit中央处理器 主要指令控制和数值计算功能(日常工作任务)
2、内存:临时性存储数据的存储设备RAM,当内存不通电的时候,这数据也就消失了
3、显卡GPU:Graphic Processing Unit 图形图像处理单元 主要用于计算图形数据(图形图像任 务)
4、存储设备:永久性存储设备ROM 任何数据都是以二进制的形式存储的机械硬盘、固态硬盘、U盘、 光盘、移动硬盘。
5、输入输出设备
我们如何与计算机打交道的
图形化界面操作方式:操作简单,表现直观,容易上手操作,步骤繁琐,占用空间大
命令行操作方式 CMD(Command win+R 输入cmd回车)窗口:操作复杂,命令较多,不容易上手,步骤简单,占用空间小,适合远程操作
常用dos命令
c: 进入C盘根目录
d: 进入D盘根目录
cd xxx 进入xxx目录
dir 查看当前目录下有什么文件和目录
cd / 进入到当前所在盘符的根目录
cd … 返回上一级目录
cls 清屏
exit 退出cmd窗口
计算机本身就是有一系列物理硬件组成的,它们之间的沟通方式就是电信号,高低电压-二进制数据。
所以和计算机之间打交道,就得通过二进制来做,早期的编程语言/命令都是以二进制形式存在。
(1)机器语言
根据平台的不同其所表现的形式也不同,为了让计算机能够懂得人类的目的,人类必须以二进制的形式向计算机输入数据。计算机能懂,人不太懂,对初学者十分不友好的。
(2)汇编语言
通过一些单词也叫助记符,将一些常用的操作用单词表示,在程序中慢慢出现了人类的语言。比如计算2+3的结果,在汇编语言里是一下结果。这种代码计算机读不懂,还得将这些助记符包括数据转换成对应的二进制提交给计算机进行计算。转换的工具,称之为汇编器。汇编语言它的计算方式,还是依赖于计算机的计算方式的。想学好汇编语言,还得事先了解计算机的工作原理。
(3)高级编程语言
从20世纪50年代产生,第一个众所周知的高级编程语言:C语言->C++语言->Java语言->C#-Python高级编程语言完全由单词,符号和数字组成,并且书写流程也是符号人类流程。比如计算2+3如下代码所示,更容易让人类去理解。同样计算机不能够读懂这段代码,还得将代码进行转换二进制提交给计算机。转换的形式:编译,解释
(4)静态编译语言:C C++ Java
静态:在定义变量的时候有明确的数据类型的区分
编译:将源代码全部进行编译 生成一个可执行的二进制文件 计算机去执行这个二进
制文件来运行程序。(翻译一本英文书)
(5)动态解释语言:Python JS
动态:在定义变量的时候没有明确的数据类型的区分
解释:将源代码从头到尾 读取一行 编译一行 运行一行(同声传译)
(1)软件的定义
软件 是 指一系列按照特定顺序组织的 计算机数据与指令 的 集合
举例:向西走50米 然后 左转向前走20米
输入三个点的坐标通过三边来计算一个三角形的面积?
说明:再用编程去解决一个问题的时候,先去获取该问题所需要的数据,然后再根据数据讨论计算的具体流程,最后再用编程语言去实现这个计算的流程
(2)软件的分类
两类:
系统软件:也称之为是操作系统,主要是用来控制和管理底层硬件的一套指令,操作系统为用户提供最基本的计算机功能。
应用软件:基于系统软件之上的,为用户带了特定领域服务的软件
(3)软件开发
软件开发的定义就是去编写上述软件,软件开发的流程是什么?
(4)软件岗位
Java语言的前身Oak(橡树),1994年詹姆斯高斯林和他的团队开发出来的嵌入式编程语言。随着互联网的发展,紧随潮流编程互联网应用程序开发语言(面向对象),一直到2010年Sun公Oracle收购,Java就属于Oralce的子产品。
Oracle公司主要业务:
JRE与JDK
JRE(Java Runtime Environment)Java运行环境:如果我们的计算机仅仅想运行Java程序的话,装这个软件即可。JRE = JVM + 核心类库。
JDK(Java Development Kit)Java开发工具包:如果我们的计算机想要去开发一个Java程序的话,装这个软件即可。JDK = 开发工具 + JRE。
JDK的下载与安装
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环境变量
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!
语法错误
指在编译的过程中出现的一些错误,这种错误的原因主要由那些因素产生呢?
单词评写:main—main
遗漏分号:System.out.println(“Happy New Year!”)(缺少分号)
使用中文符号的问题
大括号不匹配:(缺少大括号)
遗漏关键字单词:Static等
运行错误
是指编译能够通过,但是在运行期间出现的问题
编译器只检查语法问题,但不检查算法是否运用正确,只要语法正确都能编译成功,而运行出来的结果可能与自己的需求不符合。
逻辑错误
代码的运行结果和自己认为的结果不一样!比如 / 整除只会保留整数部分,舍去小数部分。
遗漏括号
遗漏分号
遗漏引号
非法使用中文符号
单词拼写错误
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 );
}
}
关键字是指被高级编程语言赋予特殊含义的一些单词,关键字一般都是由小写字母组成。好比是汉语当中的一些专有名词:北京,天安门,兵马俑。不能乱用。
标识符指的是我们在程序中对变量、函数、类、接口、常量所定义的名称,也就是说这些名称是我们自定义的。
标识符必须满足以下组成规则:
标识符命名的规范:
注释是用于注解和说明程序的一些程序中的内置文本信息的,但这些内置文本不属于代码的范畴。
所以在对含有注释的源代码进行编译时,所生成的字节码中不含有注释。注释给人看的!
注释主要有三种:
常量就是指在程序中直接出现的一些数据,也叫字面量
常量都有哪些:
负数的二进制
-29的二进制 将正数部分的二进制先取反 再加1 即为负数的二进制
00011101 =>取反 11100010 =>加1 11100011
指的是变化的量。
变量的本质就是在内存中程序所处的进程中的一个临时存储区域。
#include
void main(){
//指针: 数据类型 * 指针名 ---变量名 int * p
int *p;
int a = 3; //创建了一个一级指针
p = &a;//
//*指针运算符:(间接寻址符): 与&互为逆运算,作用就是通过操作对象的地址,获取存储的内容
//&取地址运算符:用来操作对象的地址。
int ** q;//创建了一里指向个二级指针 一个二级指针只能存放一级指针的内容
q = &p;//不能写&a
printf("%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的地址
在Java当中,数据类型主要分为两大类:
1、基本数据类型:在变量的空间中存储数据
整型
浮点型
字符型
布尔型
2、引用数据类型:数据是在堆内存中存储,变量仅仅存放的是数据在堆内存中的地址
算术运算符
算术运算符 | 含义 | 备注 |
---|---|---|
+ | 加法 | 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);
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
*/
}
}
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;
//转换成quarter
int 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);
}
}
单分支语句
...CodeA
if(布尔表达式){
语句组;
}
...CodeB
双分支if-else语句
...CodeA
if(布尔表达式){
语句组A;
}else{
语句组B;
}
...CodeB
...CodeA
if(布尔表达式1){
语句组A;
}else if(布尔表达式2){
语句组B;
}else if(布尔表达式){
语句组C;
}else{
语句组D;
}
...CodeB
与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的一些小细节
所传入的变量
,char,byte,short,int,String或者枚举型
,java SE7开始,case标签还可以是字符串字面量。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;
}
}
}
循环主要解决具有规律性且具有在重复性的代码问题,避免代码冗余。
循环四要素
我们常见的循环问题可以分为两大类:
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 - i
j <= 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
* 1
j == 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();
}
}
}
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 2
for (int i = 1; i <= 5; i++) {
if (i == 3) {
continue;
} else {
System.out.println(i);
}
}
//结果 1 2 4 5
}
}
Math类是用于数学计算的一个工具类。在程序中使用的时候,可以用Math.函数名()来调用,也可以手动导入import static java lang.Math.*
。
对于工具类而言,里面的大部分成员都是静态的static
自带常量
取整方法
三角函数
指数函数
其他方法
主要用于负责数据输入的类,底层是和IO流相关。
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);
}
}
主要用于产生随机数
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();
}
}
String是一个类,它描述的是字符串。在Java代码当中,所有字符串常量(字符串字面量)都是String类的一个实例对象。并且,字符串一旦创建,则不可修改! 不可修改其长度,不可修改其内容 。所以将来对字符串内容的改变,不能在原地改,只能重新创建一个字符串。
public class Sample {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ab" + "dc";
//上述代码一共有几个字符串?
//四个"abc" "ab" "dc" "abdc"
}
}
获取相关
判断相关
修改相关
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')); //7
System.out.println(str.lastIndexOf(97));//21
System.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;//直接结束程序
}
}
}
}
}
Character它是char基本数据类型的 包装类 ,有这么几个静态方法我可目前可以使用到的
将十六进制数字转为十进制
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~F
String 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' ? 1
sum = sum + (int)Math.pow(16 , hex.length() - i - 1) * (ch - 48);
} else {
//'A' - 65 + 10 -> 10
sum = sum + (int)Math.pow(16 , hex.length() - i - 1) * (ch - 55);
}
}
System.out.println(sum);
}
}
什么是函数
函数的定义就是指一段具有独立功能的代码,减少代码冗余,提高程序的利用率和效率。
我们应该如何去定义函数呢?
函数的语法格式
修饰符 函数类型 返回值类型 函数名(数据类型 数据1,数据类型 数据2,...) {
独立功能的代码片段;
return 函数的计算结果;
}
根据形参和返回值来看,函数有如下几个分类
总结定义函数时需要考虑的有哪些?
函数的运行有哪些未知的参数?
函数的运行结果有是什么?
明确参数和结果 明确内容和返回
函数到底要干什么?尽量将独立功能且重复性较高的代码片段提取出来
函数的运行是基于栈运行的
栈:是一种先进后出的容器,我们这里面所说的栈是指JVM中的栈内存空间。
每一个函数,叫做栈帧,栈帧中所包含的内容有函数的定义,参数列表,函数的执行内容代码。
每一个函数要运行,就相当于这个栈帧进入到栈内存中-入栈。
如果一个函数即将结束,将这个栈帧从栈顶移出-出栈。
如果栈内存中有多个栈帧,运行的是最上面的栈帧,底下的栈帧暂停运行,直到该栈帧为栈顶元素。
比如:主函数先进栈,开始逐行运行,如果执行到第n行,调用另外一个函数A,则主函数在第n行暂停运行,将另一个函数A的栈帧入栈,再继续逐行运行,直到函数A的内容执行完毕,函数A出栈,主函数接着从第n行继续向下执行。以此类推。
同一个类中可以出现多个同名函数,这个现象就叫做函数的重载(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():算重载,参数不一样
寻找重载函数的流程:
函数的递归就是指函数自身调用自身。
人用迭代,神用递归
写递归时,一定要先确定递归结束条件-递归边界
什么情况下可以使用递归?迭代的,数学归纳法的问题
数组主要用于解决大量数据计算与存储的问题
比如:输入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]);
//ArrayIndexOutOfBoundsException
arr[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;
}
}
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中添加元素element
public 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.创建十个桶 每一个桶是LinkedList
LinkedList<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~9
queues[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=2
int 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();
}
}
二维数组,在表现形式上就是一个表格,在操作表格的时候以行列来操作
所谓的二维数组,本质上就是一个一维数组,只不过该一维数组里面的元素是另一个一维数组而已
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();
}
}
}