编码知识
- ASCII美国信息交换标准代码
所有字符1字节,128个 - Unicode 统一码
最少的字符都占2个字节 - ANSI美国国家标准码
属于ASCII码的占1个字节,不属于的占2个字节 - UTF-8 针对Unicode的一种可变长度字符编码
ASCII码的1字节,带有变音符号的拉丁文什么的2字节
中文日文什么的3字节,极少用的4字节 - GBK 针对汉字的编码
ASCII码的都是1字节,汉字2字节
基本数据类型(8种)
基本类型 | 位数 | 字节数 |
---|---|---|
byte | 8位 | 1字节 |
short | 16位 | 2字节 |
int | 32位 | 4字节 |
long | 64位 | 8字节 |
double | 32位 | 4字节 |
float | 64位 | 8字节 |
char | 16位 | 2字节 |
boolean | 无 | 无 |
基础知识
- 第一个程序的编写
- 编写源程序→编译源程序(javac.exe)→运行程序(java.exe)
- java源程序(名字必须和class名字一样)→java字节码文件→JVM运行
- Hello.World.java→HelloWorld.class
- javac HelloWorld.java
java HelloWorld
逻辑运算符
&与
&&短路与(只要出现FALSE就输出FALSE,不再遍历后面的逻辑)
|或
||短路或(同上)
位运算符(二进制运算符)
- 按位与&
- 按位或|
- 异或^
- 取反~
- 左移位<<,右移位>>,无符号右移位>>>(无论如何高位补零)
- Java三元运算符(?)
a>b?a:b,(问号右边的a>b条件满足则输出冒号左边的结果a,否则输出右边的结果b)
类比与python的三元运算符 value = a if a > b else b
基本语句
- 注释
//单行注释
/* */ 多行注释
package Hello_World;
import java.util.Scanner;//为了输入
public class HelloWorld {
public static void main(String[] args) {
// TODO
}
-
输入
Scanner in = new Scanner(System.in);
引用:读入值为一行in.nextLine()、读入值为一整型数in.nextInt() -
输出
System.out.print(<输出内容>);
System.out.println(<输出内容>); //输出一行
浮点数是不精确的
浮点数和整数的运算要注意!
整数可以自动转为浮点,浮点不能自动转为整数
- 判断语句
- if-else if-else
- switch-case
switch(type){
case 1: //todo1
break;
case 2: //todo2
break;
default:
//todo1
}
- 循环
- while循环
- do while循环
- for-each循环
for(int k : array){ //todo }
- for循环
for(int i=0,i<n,i++){ //todo }
循环中的状态可用代码表格检查
可以用边界数据来做测试
单目运算符优先级最高
大的计数循环可以用源代码做个小循环的demo
计算机的int类型4字节(2^31)double类型
编写可扩展性的代码,软编码
boolean a =true 创建一个布尔变量
java中boolean变量的true,false首字母是小写
python中boolean变量首字母是大写
break跳出当层循环,continue跳出当次循环
label:
break label 选择循环跳出
boolean 布尔类型
! && || 逻辑运算(这也是优先级)
println每次输出后换行
printf 格式化输出 printf("%.2f",result)
print 直接输出
for(表达式;条件;表达式)
表达式里面可以用逗号多加几个表达式
数组
int[] a = new int[100]
初始默认所有数为0
同类型的数据结构
java一旦创建,不能改变大小
元素个数必须给出,个数可以是变量
a[1]=a[2]+1
编译器不会检查下标是否异常,但是程序运行会产生异常而终止
数组内部成员length a. length
int[] a = {1,2,3,4,5,6}
数组理解为一个引用!!
普通变量 所有者
数组变量(对象变量) 管理者
数组变量的赋值是管理权限的赋予
数组变量的比较是比较管理的数组是相同的吗(比较的是内存位置而非内容)
数组的for-each循环
int[] data ={1,2,3}
for (int k : data){;}
只能遍历,但是不能用k=value来修改data中的值
素数案例
二维数组
int[][] a ={{1,2,3},{4,5,6},}
井字棋
数字类型可与str直接输出,不需要变成str,因为加号会把数字自动变成字符串
python的加号则不可以,需要显式的将数字str()
字符类型
char
String s = new String(“abc”)
-
逃逸字符
- \b 回退一格(back space)
- \t 制表符,到下一个表格位置(tab)
- \n 换行(new line)
- \r 回车(return)
- " 双引号 ’ 单引号
- \ 反斜杠本身
-
引用数据类型 VS 基本数据类型(8种内置数据类型)
1.Byte VS (byte)
2.Short VS (short)
3.Integer VS (int)
4.Long VS (long)
5.Float VS (float)
6.Double VS (double)
7.Boolean VS (boolean)
8.Character VS (char)
String -
运算符 .
-
字符串的运算
-
字符串的输入
- in.next() 以空格(广义,包括空格,回车和TAB等)为一个
- in.nextLine()
-
对象变量的赋值
-
比较String
- s == “bye” 判断是否是同一个字符串(理解为管理同一个)
- s.equals(“bye”) 判断字符串内容是否相等
-
字符串操作(使用.运算符)
- length() 长度
- charAt() 访问字符
- substring() 子串
- indexOf() 寻找字符
- toLowerCase()
- 以上函数都不会改变原字符串(java字符串是不变的)
-
switch case的应用
-
Math类
函数
- 函数的定义和调用
- 参数传递
- 类型不匹配
char<int<double
当函数期望的参数类型比调用函数时给的值的类型宽的时候,编译器能悄悄替你把类型转换好,否则要自己强制类型转换(int)0.5 - Java在传递调用函数时,永远只能传值给参数
- 参数(形参)与值(实参)的关系
- 形参和实参的说法已经过时,不符合理解
- 传递字符串时仍然是值传递,但是传递数组这些引用类型时候是对象传递,会影响原变量
- 类型不匹配
- 本地变量
- 定义在块里(函数或者语句,只要大括号内),本地变量进入块产生(需要初始化,不会被默认初始化。参数(也是本地变量)调用函数时被传进来的值初始化了),离开块消失。
- 生存期和作用域(相同,都在大括号内)
- 块外面定义的变量在里面仍然有效
黑马程序员
- 标识符:自己定义的内容,起的名字(命名规范)。
- 数组
- 动态初始化 int[] = new int[10],会有默认值
静态初始化int[] = {1,2,3,4} 或者 int[] = new int[]{1,2,3,4} - 访问数组元素
直接打印整个数组得到的是内存地址的哈希值。
访问用array[0],或者赋给某个变量 - 赋值
array[1] = 1 - java的内存划分(5个部分)
- 栈(Stack):存放的都是局部变量。方法的运行在栈当中
局部变量:方法的参数,或者是方法{内部的变量(保存地址值)}(变量也是一个局部变量,所以保存在栈当中)
作用域:一旦超出作用域,立刻从栈内存中消失 - 堆(Heap):凡是new出来的对象,都在堆内存中
堆内存里的对象,都有一个地址值:16进制
堆内存里面的数据都有默认值
如果整数 默认0
如果是浮点数 默认0.0
如果是字符 默认\u0000
如果是布尔 默认false
如果是引用类型 默认null - 方法区(Method Area):存储.class(字节码文件)的相关信息,包含方法的信息。
- 本地方法栈(Native Method Stack):与操作系统相关
- 寄存器(pc Register):与CPU相关
- 栈(Stack):存放的都是局部变量。方法的运行在栈当中
- 数组的内存划分
- 动态初始化 int[] = new int[10],会有默认值