【无标题】

一、java特点

1、java语言是面向对象的(oop)

2、java语言是健壮性的,Java 的强类型机制、异常处理、垃圾的自动收集等是 Java 程序健壮性的重要保证

3、 Java 语言是 跨平台性的。[即: 一个编译好的.class 文件可以在多个系统下运行,这种特性称为跨平台]

4、 Java 语言是解释型的
解释性语言:javascript,PHP, java 编译性语言: c / c++
区别是:解释性语言,编译后的代码,不能直接被机器执行,需要解释器来执行, 编译性语言, 编译后的代码, 可以直接被机器执行, c /c++

JDK 基本介绍

JDK 的全称(Java Development Kit Java 开发工具包)
JDK = JRE + java 的开发工具 [java, javac,javadoc,javap 等]

JVM 是一个虚拟的计算机,具有指令集并使用不同的存储区域。负责执行指令,管理数据、内存、寄存器,包含在JDK 中.

  1. JDK 是提供给 Java 开发人员使用的,其中包含了 java 的开发工具,也包括了 JRE。所以安装了 JDK,就不用在单独安装 JRE 了。

JRE 基本介绍

  1. JRE(Java Runtime Environment Java 运行环境)
    JRE = JVM + Java 的核心类库[类]
  2. 包括 Java 虚拟机(JVM Java Virtual Machine)和 Java 程序所需的核心类库等,如果想要运行一个开发好的 Java 程序,计算机中只需要安装 JRE 即可。

JDK、JRE 和 JVM 的包含关系

  1. JDK = JRE + 开发工具集(例如 Javac,java 编译工具等)
  2. JRE = JVM + Java SE 标准类库(java 核心类库)
  3. 如果只想运行开发好的 .class 文件 只需要 JRE

Java基本代码格式

  1. Java源文件以 java为扩展名。源文件的基本组成部分是类(class)
  2. Java应用程序的执行入口是main(方法。它有固定的书写格式:
    public static void main(String[ args) {…}
  3. Java语言严格区分大小写.
  4. Java方法由一条条语句构成,每个语句以“;" 结束。
    5.大括号都是成对出现的,缺一不可。 [习惯, 先写{}再写代码]
    6.一个源文件中最多只能有一个public类。其它类的个数不限。
    7.如果源文件包含一个public类, 则文件名必须按该类名命名!
    8.一个源文件中最多只能有一个public类。其它类的个数不限,也可以将main方法写在非public类中,然后指定运行非public 类,这样入口方法就是非public的main方法

Java 转义字符

Java 常用的转义字符

在控制台,输入 tab 键,可以实现命令补全

"\“代表转义符

\t :一个制表位,实现对齐的功能
\n :换行符
\ \:表示一个\

\ " :一个"
\ ‘:一个’
\r :一个回车

注释(comment)

用于注解说明解释程序的文字就是注释,注释提高了代码的阅读性(可读性);注释是一个程序员必须要具有的良
好编程习惯。将自己的思想通过注释先整理出来,再用代码去体现。 [举例]

  1. 单行注释 //
  2. 多行注释 /* */
  3. 文档注释 /** */

常用的 dos 命令

1) 查看当前目录是有什么内容 dir
   dir dir d:\abc2\test200
2) 切换到其他盘下:盘符号 cd : change directory
   案例演示:切换到 c 盘 cd /D c:
3) 切换到当前盘的其他目录下 (使用相对路径和绝对路径演示), ..\表示上一级目录
   案例演示: cd d:\abc2\test200 cd ..\..\abc2\test200
4) 切换到上一级:
   案例演示: cd ..
5) 切换到根目录:cd \
   案例演示:cd \
6) 查看指定的目录下所有的子级目录 tree
7) 清屏 cls [苍老师]
8) 退出 DOS exit
9) 说明: (md[创建目录],rd[删除目录],copy[拷贝文件],del[删除文件],echo[输入内容到文件],type,move[剪切]) => Linux,

二、变量

概念

变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过 门牌号我们可以找到房间,而通过变量名可以访问到变量(值)。

变量使用的基本步骤

变量必须先声明在使用

  1. 声明变量
    int a;
  2. 赋值
    a = 60; // 把 60 赋给 a
    使用 System.out.println(a);
    //也可以一步到位[int a = 60; 通常我们是一步完成]

变量使用注意事项

1.变量表示内存中的一个存储区域[不同的变量,类型不同,占用的空间大小不同,
比如: int 4个字节,double 就是8个字节]
2.该区域有自己的名称[安量名]和类型[数据类型]
3.变量必须先声明,后使用,即有顺序
4.该区域的数据/值可以在同一类型范围内不断变化
5.变量在同一个作用域内不能重名
6.变量=变量名+值+数据类型。变量三要素

三、数据类型

每一种数据都定义了明确的数据类型,在内存中分配了不同大小的内存空间(字节)。

基本数据类型

整数型:

基本数据类型:

byte[1], 范围 (-128 ~ 127short[2], 范围 -2^15 ~ 2^15-1-32768-32767int[4], 范围 -2^31 ~ 2^31-1  (-2147483648-2147483647)
long[8], 范围 -2^63 ~ 2^63-1

## 引用数据类型:
类:closs
接口:interface
数组:[...]

浮点型:

   float[4],double[8]
  1. 关于浮点数在机器中存放形式的简单说明,浮点数=符号位+指数位+尾数位
  2. 尾数部分可能丢失,造成精度损失(小数都是近似值)。
    通常情况下使用double类型 及缴纳更多更高
    1.与整数类型类似,Java 浮点类型也有固定的范围和字段长度,不受具体OS的
    影响。[float 4个字节double是8个字节]
    2. Java 的浮点型常量(具体值)默认为double型,声明float型常量, 须后加’f’
    或’F’
    3.浮点型常量有两种表示形式
    十进制数形式:如: 5.12 512.0f .512 (必须有小数点)
    科学计数法形式:如: 5.12e2 [5.12*10的2次方] 5.12E-2 [5.12/10的2次方]
    4.通常情况下,应该使用double型,因为它比float型更精确。[举例说明]
   double num9 = 2.1234567851;
   float num10 = 2.1234567851F;

5.浮点数使用陷阱:2.7和8.1 / 3比较

   double num7 = 2.7;
   double num8=8.1/ 3;
   if Math.abs(num7 - num8) < .00001)[
   System out. orintln("相等”):

字符型:

 char[2]

字符类型可以表示单个字符,字符类型是 char,char 是两个字节(可以存放汉字),多个字符我们用字符串 Stringan[1]

//在 java 中,char 的本质是一个整数,在默认输出时,是 unicode 码对应的字符
//要输出对应的数字,可以(int)字符
//char 类型是可以进行运算的,相当于一个整数,因为它都对应有 Unicode 码.

1.字符常量是用单引号(”)括起来的单个字符。
例如:

charc1 = 'a'; charc2 = '中'; charc3 = '9';
  1. Java中还允许使用转义字符T来将其后的字符转变为特殊字符型常量。
    例如:
    charc3 = In’ ; // "\n’表示换行符
    3.在java中, char的本质是个整数,在输出时,是unicode码对应的字符。
    http://tool.chinaz.com/ Tools/Unicode.aspx
    4.可以直接给char一个整数,然后输出时,会按照对应 的unicode字符输出[97-》a]
  2. char类型是可以进行运算的, 相当于一个整数, 因为它
    都对应有Unicode码.

布尔类型:

boolean[1]

1.布尔类型也叫boolean类型,booolean类型数据只允许取值true和false,无
null

  1. boolean类型占1个字节。
  2. boolean 类型适于逻辑运算,一般用于程序流程控制:
    1 if条件控制语句;
    V while循环控制语句;
    V do-while循环控制语句;
    V for循环控制语句

基本数据类型转换

自动类型转换:

V介绍
当java程序在进行赋值或者运算时,精度小的类型自动转换为精度大的数据类型,
这个就是自动类型转换
1数据类型按精度(容量)大小排序为

char --> int --> long--> float--> double 

byte--> short--> int--> long--> float--> double

自动类型转换注意和细节:

1.有多种类型的混合数据运算时,系统首先自动将所有数据转换成最大容量的那种数据类型,然后进行计算。

2.当把精度(容量)大的数据类型赋值给精度(容量)小的数据类型时,就会报错,反之就会进行自动类型转换。

3.(byte,short)和char之间不会相互自动转换

4.byte,short,char 他们三者可以计算,在计算时首先转换为int类型。
5.boolean 不参与转换
6.自动提升原则:表达式结果的类型自动提升为操作数中最大的类型

强制类型转换:

介绍
自动类型转换的逆过程, 将容量大的数据类型转换为容量小的数据类型。使用时要加上强制转换符 ( ),但可能造成精度降低或溢出,格外要注意

int i= (int)1.9;
System.out.println(i);

int j=100;
byte b=(byte)j;
System.out.println(b);

强制类型转换细节:

1.当进行数据的大小从大> 小,就需要使用到强制转换
2.强转符号只针对于最近的操作数有效,往往会使用小括号提升优先级

//intx = (int)10*3.5+6*1.5;
inty = (int)(10*3.5+6*1.5);
System.out.println(y); 
  1. char类型可以保存int的常量值,但不能保存int的变量值,需要强转
   charc1 = 100; //ok
   int m = 100; //ok
   char c2 = m; //错误
   char c3=(char)m //ok
   System.out. rintnt(3//100对应的字符
  1. byte和short, char类型在进行运算时,当做int类型处理。

基本数据类型转String

在程序开发中,我们经常需要将基本数据类型转成String类型。或者将String类
型转成基本数据类型。

1、基本数据类型转换为String类型

语法:将基本数据类型+” “即可
2、String类型转换为基本数据类型
使用 基本数据类型对应的包装类,的相应方法,得到基本数据类型
语法:通过剧本类型的包装类调用parsexxx方法即可.

怎么把字符串转成字符 char -> 指 含义是指 把字符串的第一个字符得到
s5.charAt(0) 得到 s5 字符串的第一个字符 ‘1’

注意事项:

  1. 在将 String 类型转成 基本数据类型时, ,比如 我们可以把 “123” , 转成一
    个整数,但是不能把 “hello” 转成一个整数
  2. 如果格式不正确,就会 抛出异常,程序就会终止

四、运算符

运算符介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。

算术运算符

算术运算符是对数值类型的变量进行运算的,在 Java 程序中使用的非常多。

细节说明:

1.对于除号"/",它的整数除和小数除是有区别的:整数之间做除法时,只保留整
数部分而舍弃小数部分。例如: intx= 10/3 ,结果是3
2.当对一个数取模时,可以等价a%b=a-a/b*b,这样我们可以看到取模的-一
个本质运算。
3.当自增当做一个独立语言使用时,不管是++i;还是i++;都是一样的,等价
4.当自增当做一个表达式使用时j = ++i等价[?]
5.当自增当做一个表达式使用时j = i++等价[2]

// % 取模 ,取余
// 在 % 的本质 看一个公式!!! a % b = a - a / b * b
// -10 % 3 => -10 - (-10) / 3 * 3 = -10 + 9 = -1
// 10 % -3 = 10 - 10 / (-3) * (-3) = 10 - 9 = 1
// -10 % -3 = (-10) - (-10) / (-3) * (-3) = -10 + 9 = -1

前++:++i 先自增后赋值
后++:i++先赋值后自增
面试题1
int i= 1;//i-> 1
i=i+ +; //规则使用临时变量: (1) temp=i;(2) i=i+ 1:(3)i=temp:
System.out.println(); // 1
问:结果是多少?为什么?

面试题2
int i=1;
i=+ +i; //规则使用临时变量: (1) i=i+ 1;(2) temp=i;(3)i= temp;
System.out.println(i); //2

练习:

  1. 假如还有 59 天放假,问:合 xx 个星期零 xx 天
  2. 定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度。
    [234.5]//编写一个 main 方法
    public static void main(String[] args) {
    //1.需求:
    //假如还有 59 天放假,问:合 xx 个星期零 xx 天
    //2.思路分析
    //(1) 使用 int 变量 days 保存 天数
    //(2) 一个星期是 7 天 星期数 weeks: days / 7 零 xx 天 leftDays days % 7
    //(3) 输出
    //3.代码
int days = 25911;
int weeks = days / 7;
int leftDays = days % 7;
System.out.println(days + "天 合" + weeks + "星期零"
+ leftDays + "天");
  //1.需求
  //定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为
  //:5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度
  //
  //2 思路分析
  //(1) 先定义一个 double huaShi 变量保存 华氏温度
  //(2) 根据给出的公式,进行计算即可 5/9*(华氏温度-100)
  // 考虑数学公式和 java 语言的特性
  //(3) 将得到的结果保存到 double sheShi
  //3 代码
  double huaShi = 1234.6;
  double sheShi = 5.0 / 9 * (huaShi - 100);
  System.out.println("华氏温度" + huaShi
+ " 对应的摄氏温度=" + sheShi);
  }

赋值运算符

赋值运算符就是将某个运算后的值,赋给指定的变量。

赋值运算符的分类
基本赋值运算符 = int a = 10;
复合赋值运算符
+= ,-= ,*= , /= ,%= 等 , 重点讲解一个 += ,其它的使用是一个道理
a += b; [等价 a = a + b; ]
a -= b; [等价 a = a - b; ]

assign : 分配,指派,賦值

赋值运算符特点

1) 运算顺序从右往左 int num = a + b + c;
2) 赋值运算符的左边 只能是变量,右边 可以是变量、表达式、常量值
   int num = 20; int num2= 78 * 34 - 10; int num3 = a;
3) 复合赋值运算符等价于下面的效果
   比如:a+=3;等价于 a=a+3; 其他类推
4) 复合赋值运算符会进行类型转换。
   byte b = 2; b+=3; b++;

关系运算符

[比较运算符]

  1. 关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false
  2. 关系表达式 经常用在 if 结构的条件中或循环结构的条件中

细节说明

  1. 关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false。
  2. 关系运算符组成的表达式,我们称为关系表达式。 a > b
  3. 比较运算符"==“不能误写成”="

逻辑运算符

用于连接多个条件(多个关系表达式),最终的结果也是一个 boolean 值。

  1. 短路与 && , 短路或 ||,取反 !
  2. 逻辑与 &,逻辑或 |,^ 逻辑异或

说明逻辑运算规则:

  1. a&b : & 叫逻辑与:规则:当 a 和 b 同时为 true ,则结果为 true, 否则为 false
  2. a&&b : && 叫短路与:规则:当 a 和 b 同时为 true ,则结果为 true,否则为 false
  3. a|b : | 叫逻辑或,规则:当 a 和 b ,有一个为 true ,则结果为 true,否则为 false
  4. a||b : || 叫短路或,规则:当 a 和 b ,有一个为 true ,则结果为 true,否则为 false
  5. !a : 叫取反,或者非运算。当 a 为 true, 则结果为 false, 当 a 为 false 是,结果为 true
  6. a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false

&& 和 & 基本规则

名称 语法 特点
短路与&& 条件 1&&条件 2 两个条件都为 true,结果为 true,否则 false
逻辑与& 条件 1&条件 2 两个条件都为 true,结果为 true,否则 false

&& 和 & 使用区别

  1. &&短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为 false,效率高
  2. & 逻辑与:不管第一个条件是否为 false,第二个条件都要判断,效率低
  3. 开发中, 我们使用的基本是使用短路与&&, 效率高

|| 和 | 基本规则

名称 语法 特点
短路或|| 条件 1||条件 2 两个条件中只要有一个成立,结果为 true,否则为 false
|逻辑或 条件 1|条件 2 只要有一个条件成立,结果为 true,否则为 false

|| 和 | 使用区别

  1. ||短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true,效率高
  2. | 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低
  3. 开发中,我们基本使用 ||

取反 基本规则

名称 语法 特点
! 非(取反) !条件 如果条件本身成立,结果为 false,否则为 true

//!和^案例演示
public class InverseOperator {
//编写一个 main 方法
public static void main(String[] args) {
//! 操作是取反 T->F , F -> T
System.out.println(60 > 20); //T
System.out.println(!(60 > 20)); //F
//a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false
boolean b = (10 > 1) ^ ( 3 > 5);
System.out.println("b=" + b);//T
}
}

三元运算符

基本语法

条件表达式 ? 表达式 1: 表达式 2;
运算规则:

  1. 如果条件表达式为 true,运算后的结果是表达式 1;
  2. 如果条件表达式为 false,运算后的结果是表达式 2;

使用细节

表达式 1 和表达式 2 要为可以赋给接收变量的类型(或可以自动转换)

三元运算符可以转成 if–else 语句

int res = a > b ? a++ : --b;
if ( a > b) res = a++;
else res = --b;

//三元运算符细节

public static void main(String[] args) {
//表达式 1 和表达式 2 要为可以赋给接收变量的类型
//(或可以自动转换/或者强制转换)
int a = 3;
int b = 8;
int c = a > b ? (int)1.1 : (int)3.4;//可以的
double d = a > b ? a : b + 3;//可以的,满足 int -> double
}

标识符的命名

规则和 规范

标识符概念:

  1. Java对各种变量、方法和类等命名时使用的字符序列称为标识符
  2. 凡是自己可以起名字的地方都叫标识符int num1 = 90;
    , 标识符的命名规则(必须遵守)
    .由26个英文字母大小写,0-9,或$组成
  3. 数字不可以开头。 int 3ab = 1;//错误
  4. 不可以使用关键字和保留字,但能包含关键字和保留字。
    Java中严格区分大小写,长度无限制。int totalNum = 10; intn = 90;
    5.
    标识符不能包含空格。intab = 90;

标识符命名规范[更加专业]

  1. 包名:多单词组成时所有字母都小写:aaa.bbb.ccc //比如 com.hsp.crm
  2. 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz [大驼峰]
    比如: TankShotGame
  3. 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz [小驼峰, 简称 驼峰法]
    比如: tankShotGame
  4. 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
    比如 :定义一个所得税率 TAX_RATE

关键字

关键字的定义和特点 ( 不用背)
定义:被 Java 语言赋予了特殊含义,用做 专门用途的字符串(单词)
特点:关键字中所有字母都为小写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X6rlt3vj-1649665711397)(images\关键字.jpg)]

保留字

4.10.1 介绍
Java 保留字:现有 Java 版本 尚未使用,但 以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留
字 byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const

键盘输入语句

介绍
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。

Input.java , 需要一个 扫描器(对象), 就是Scanner
     mport java.util.Scanner;//表示把 java.util 下的 Scanner 类导入
//2. 创建 Scanner 对象 , new 创建一个对象,体会
// myScanner 就是 Scanner 类的对象
   Scanner myScanner = new Scanner(System.in);
//当程序执行到 next 方法时,会等待用户输入~~~
String name = myScanner.next(); //接收用户输入字符串
int age = myScanner.nextInt(); //接收用户输入 int
double sal = myScanner.nextDouble(); //接收用户输入 double

五、进制

表示方式

进制介绍
对于整数,有四种表示方式:
二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头。
十进制:0-9 ,满 10 进 1。
八进制:0-7 ,满 8 进 1. 以数字 0 开头表示。
十六进制:0-9 及 A(10)-F(15),满 16 进 1. 以 0x 或 或 0X 开头表示。此处的 A-F 不区分大小写。

进制转换

二进制转十进制
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。
0b1011转成十进制的数
0b1011 = 12的(1-1)次方+ 1 * 2的(2-1)次方+ 0 * 2的(3-1)次方+ 1
2的(4-1)次方法= 1 + 2 + 0+ 8= 11
八进制转十进制
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,
然后求和。
0234转成十进制的数
0234= 480+3*81+28^2-4+ 24+128= 156
十六进制转十进制
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以 16 的(位数-1)次方,然后求和。
0x23A 转成十进制的数
0x23A= 10 * 16^0 + 3 * 16 ^ 1 + 2 * 16^2 = 10 + 48 + 512 = 570

十进制转二进制
规则:将该数不断除以 2,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。
34 转成二进制 = 0B00100010
十进制转八进制
规则:将该数不断除以 8,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的八进制。
131 转成八进制 => 0203

二进制转八进制
规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可。
ob11010101 转成八进制
ob11(3)010(2)101(5) => 0325
二进制转十六进制
规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
ob11010101 转成十六进制
ob1101(D)0101(5) = 0xD5

八进制转二进制
规则:将八进制数每 1 位,转成对应的一个 3 位的二进制数即可。
0237 转成二进制
02(010)3(011)7(111) = 0b10011111
十六进制转二进制
规则:将十六进制数每 1 位,转成对应的 4 位的一个二进制数即可。
0x23B 转成二进制
0x2(0010)3(0011)B(1011) = 0b001000111011

位运算

   public static void maiin(String []args)
   {
   int a=1>>2; // 1 向右位移 2 位
   int b=-1>>2;//算术右移
   int c=1<<2;//算术左移
   int d=-1<<2;//
   int e=3>>>2;//无符号右移
   //a,b,c,d,e 结果是多少
   System.out.println("a="+a);
   System.out.println("b="+b);
   System.out.println("c="+c);
   System.out.println("d="+d);
   System.out.println("e="+e);
   }
   ``
   ~2=? // 按位取反
    //推到
    //1.得到2的源码 00000000 00000000 00000000 00000010
    //2.~2操作     11111111 11111111 11111111 11111101 运算后的补码
    //3.运算后的反码 11111111 11111111 11111111 11111100
    //4.运算后的源码 10000000 00000000 00000000 00000011 =》-3
   2&3=?// 2 按位与 3
   2|3=? //2按位或3
   ~-5=? //
   13&7=?
   5|4=? 
   -3^3=?//^ 按位异或

二进制在运算中的说明

1.二进制是逢2进位的进位制,0、1是基本算符。
2.现代的电子计算机技术全部采用的是进制,因为它只使用0、1两个数字符号,
非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制
数来表示的。二进制(Binary) 数用0和1两个数字及其组合来表示任何数。进位
规则是"逢2进1",数字1在不同的位上代表不同的值,按从右至左的次序,这个
值以二倍递增

原码、反码、补码
对于有符号的而言:
1.二进制的最高位是符号位: 0表示正数,1表示负数(老韩口诀: 0->0 1-> -)
2.正数的原码,反码,补码都样(三码合一)
3.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
4.负数的补码=它的反码+1,负数的反码=负数的补码- 1
5.0的反码,补码都是0
6. java没有无符号数,换言之,java中的数都是有符号的
7.在计算机运算的时候,都是以补码的方式来运算的
8.当我们看运算结果的时候,要看他的原码(重点)

位运算符

java 中有 7 个位运算(&、|、^、~、>>、<<和 >>>)

分别是按位与&、按位或|、按位异或^ ,按位取反~ ,它们的运算规则是:
按位与& :两位全为1,结果为1,否则为0
按位或| :两位有一个为1,结果为1,否则为0
按位异或^ : 两位一个为0,一个为1,结果为1,否则为0
按位取反~ : 0->1 ,1->0
比如: 2&3=? ~-2 = ? ~2=? 2|3=? 2^3=?

还有 3 个位运算符 >>、<< 和 >>> , 运算规则:

  1. 算术右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位

  2. 算术左移 <<: 符号位不变,低位补 0

  3. 逻辑右移也叫无符号右移,运算规则是: 低位溢出,高位补 0

  4. 特别说明:没有 <<< 符号

  1. int a=1>>2; //1 => 00000001 => 00000000 本质 1 / 2 / 2 =0
  2. int c=1<<2; //1 => 00000001 => 00000100 本质 1 * 2 * 2 = 4

六、程序控制结构

在程序中,程序运行的流程控制决定程序是如何执行的,是我们必须掌握的,主要有三大流程控制语句。

  1. 顺序控制
  2. 分支控制
  3. 循环控制

顺序控制

程序从上到下逐行执行,中间没有任何判断和跳转。

java中定义变量时采用向前引用:

即先定义后使用

分支控制 if-else

分支控制 if-else 让程序有选择的的执行,分支控制有三种

  1. 单分支 if
  2. 双分支 if-else
  3. 多分支 if-else if -…-else

单分支

基本语法
if(条件表达式){
​		执行代码块;
}

当条件表达式为true是,就会执行{ }中的代码。如果为false,就不执行。

双分支

基本语法

if(条件表达式){
	执行代码块; 
}else{
	执行代码块2}

当条件表达式成立时,即执行代码块1,否则执行代码块2

多分支

基本语法

if(条件表达式1){
	执行代码块; 
}else if(条件表达式1){
	执行代码块2}
......
else{
	执行代码块n;
}

如果没有else,如果所有条件表达式都不成立,则一个直行入口都没有
如果有else,如果所有条件表达式都不成立,则默认执行else代码块

嵌套分支

在一个分支结构中又完整的嵌套了另一个完整的分支结构,里面的分支的结构称为内层分支外面的分支结构称为外层分支。建议: 不要超过 3 层 (可读性不好)

基本语法
if(){
	if(){
		//if-else...
	}else{
		//if-else
	}
}

switch分支结构

基本语法
switch(表达式){
	case 常量1:
	代码块1breakcase 常量2:
	代码块2;
	break;
	......
	default:
	代码块;
	break}
1. switch关键字,表示swtich分支
2.表达式对应个值
3. case常量1 :当表达式的值等于常量1,就执行语句块1
4. break :表示退出swtich
5.如果和case常量1匹配,就执行语句块1,如果没有匹配,就继续匹配case常量2
6.如果一一个都没有匹配上,执行default

switch 注意事项和细节讨论

1.表达式数据类型,应和case后的常量类型一致,或者是课一自动转成可以相互比较的类型,比如输入的是字符,而常量是int
2.switch(表达式)中表达式的返回值必须是:(byte,short,int,char,enum[枚举]String)
3.case自居中的值必须是常量,而不能是变量
4.default字句是可选的,当没有匹配的case时,执行default
5.break语句用在执行完一个case分枝后使得程序跳出switch语句块,如果没有break,程序会顺序执行到switch结尾,除非遇到break

switch 和 if 的比较

  1. 如果 判断的具体数值不多,而且符合 byte、 short 、int、 char, enum[枚举], String 这 6 种类型。虽然两个语句都可以使用,建议使用 swtich 语句。
  2. 其他情况:对区间判断,对结果为 boolean 类型判断,使用 if,if 的使用范围更广

for 循环控制

基本语法
for(循环变量初始化;循环条件;循环变量迭代){
循环操作(可以多条语句);
}

  1. for 关键字,表示循环控制
  2. for 有四要素: (1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代
  3. 循环操作 , 这里可以有多条语句,也就是我们要循环执行的代码
  4. 如果 循环操作(语句) 只有一条语句,可以省略 {}, 建议不要省略
 public class 惩罚口诀表 {

    public static void main(String[] args) {

        for (int i= 1; i < 10; i++) {
            for (int j = 1; j <=i; j++) {
                System.out.print(j+"*"+i+"="+i*j+"\t");
            }
            System.out.println();
        }
    }
}

注意事项和细节说明

  1. 循环条件是返回一个布尔值的表达式
  2. for(;循环判断条件;) 中的初始化和变量迭代可以写到其它地方,但是两边的分号不能省略。
  3. 循环初始值可以有多条初始化语句,但要求类型一样,并且中间用逗号隔开,循环变量迭代也可以有多条变量迭代语句,中间用逗号隔开。

while 循环控制

基本语法
while(循环条件){
	循环体(语句);
	循环变量迭代;
	}

注意事项和细节说明

  1. 循环条件是返回一个布尔值的表达式
  2. while 循环是先判断再执行语句

do…while 循环控制

基本语法
循环变量初始化;

do{
	循环体( 语句);
	循环变量迭代;
}while(循环条件);
  1. do while 是关键字
  2. 也有循环四要素, 只是位置不一样
  3. 先执行,再判断,也就是说,一定会至少执行一次
  4. 最后 有一个 分号 ;

注意事项和细节说明

  1. 循环条件是返回一个布尔值的表达式
  2. do…while 循环是先执行,再判断, 因此它至少执行一次

多重循环控制

介绍

  1. 将一个循环放在另一个循环体内,就形成了嵌套循环。其中,for ,while ,do…while 均可以作为外层循环和内层循环。
    【建议一般使用两层,最多不要超过 3 层, 否则,代码的可读性很差】
  2. 实质上,嵌套循环就是把内层循环当成外层循环的循环体。当只有内层循环的循环条件为 false 时,才会完全跳出内层循环,才可结束外层的当次循环,开始下一次的循环。
  3. 设外层循环次数为 m 次,内层为 n 次,则内层循环体实际上需要执行 m*n 次。

跳转控制语句-break

基本语法:
{ ……
	break;
	……
}

break 语句用于终止某个语句块的执行,一般使用在 switch 或者循环[for , while , do-while]中。

跳转控制语句-continue

基本语法:
{ ……
	continue;
	……
}
  1. continue 语句用于结束本次循环, 继续执行下一次循环。
  2. continue 语句出现在多层嵌套的循环语句体中时,可以通过标签指明要跳过的是哪一层循环 , 这个和前面的标签的使用的规则一样.

跳转控制语句-return

return的常用作用有以下两种:
第一种用法是,方法的结束。
比如当代码执行到某个地方会出现几种结果,然后其中一种结果就不能执行后续代码,这时候在那里加上一个“return;”就可以终止后面的代码执行。
return 使用在方法,表示跳出所在的方法 。

第二种是返回方法指定类型的值(这个值总是确定的),也可以是对象
public string functionTest(){
return a;
}
那么这个方法被调用之后就会返回一个值为abc的字符串,

七、数组

数组介绍

数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。
即:数(数据)组(一组)就是一组数据

使用方式1

数组定义:

数据类型 数组名[]=new 数据类型[大小]

先声明数组
语法:数据类型 数组名[]; 也可以 数据类型[] 数组名;
int a[]; 或者 int[] a;
创建数组:
语法: 数组名=new 数据类型[大小];
a=new int[10];

数组初始化
数组类型 数组名[] ={元素值,…}

数组使用注意事项和细节

  1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理
  2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
  3. 数组创建后,如果没有赋值,有默认值
    int 0,short 0, byte 0, long 0, float 0.0,double 0.0,char \u0000,boolean false,String null
  4. 使用数组的步骤 1. 声明数组并开辟空间 2 给数组各个元素赋值 3 使用数组
  5. 数组的从 下标是从 0 开始的。
  6. 数组下标必须在指定范围内使用,否则报:下标越界异常
    int [] arr=new int[5]; 则有效下标为 0-4
  7. 数组属引用类型,数组型数据是对象(object)

创建一个 char 类型的 26 个元素的数组,分别 放置’A’-‘Z’。
使用 for 循环访问所有元素并打印出来。

例:
1. 定义一个 数组 char[] chars = new char[26]
2. 因为 'A' + 1 = 'B' 类推,所以老师使用 for 来赋值
3. 使用 for 循环访问所有元素
   */
   char[] chars = new char[26];
   for( int i = 0; i < chars.length; i++) {//循环 26 次
   //chars 是 char[]
   //chars[i] 是 char
   chars[i] = (char)('A' + i); //'A' + i 是 int , 需要强制转换
   }
   //循环输出
   System.out.println("===chars 数组===");
   for( int i = 0; i < chars.length; i++) {//循环 26 次
   System.out.print(chars[i] + " ");
   }
   }
   }

数组赋值机制

  1. 基本数据类型赋值,这个值就是具体的数据,而且相互不影响。
    int n1 = 2; int n2 = n1;
  2. 数组在默认情况下是引用传递,赋的值是地址。
    //代码 ArrayAssign.java
    int[] arr1 = {1,2,3};
    int[] arr2 = arr1;

数组拷贝

编写代码 实现数组拷
//创建一个新的数组,开辟新的数据空间
//遍历原数组 ,把每个元素拷贝到新数组对应的元素位置

数组反转

//定义数组
int[] arr = {11, 22, 33, 44, 55, 66};
//使用逆序赋值方式
//1. 先创建一个新的数组 arr2 ,大小 arr.length
//2. 逆序遍历 arr ,将 每个元素拷贝到 arr2 的元素中(顺序拷贝)
//3. 建议增加一个循环变量 j => 0 => 5
int[] arr2 = new int[arr.length];
//逆序遍历 arr

数组添加/扩容

要求:实现动态的给数组添加元素效果,实现对数组扩容。

数组拷贝

在java里,允许将一个数组变量拷贝给另一个数值变量。此时,两个变量将引用同一个数组 。
数组拷贝

intint[]a=new int[4];
int[]b=a;
a[1]=4;//现在b[1]也等于4

在java里,允许将一个数组变量拷贝给另一个数值变量。此时,两个变量将引用同一个数组 。
int[] copy = Arrays.copyOf(array,2*array.length);//第一个参数是待拷贝的int型的数组对象,第二个是新数组的长度
使用动态的ArrayList类
在java里,有一个ArrayList的泛型类,也被叫做数组列表,它使用起来有点像数组,但是在添加或删除元素时,具有自动调节数组容量的功能,而不需要编写另外的代码。
ArrayList staff =new ArrayList<>();

数组排序

排序是将多个数据,依指定的顺序进行排列的过程。

内部排序:
指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择
式排序法和插入式排序法);

外部排序法:
数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。

冒泡排序法
冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素
的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒

int[] arr = {24, 69, 80, 57, 13, -1, 30, 200, -110};
int temp = 0; //用于辅助交换的变量
//将多轮排序使用外层循环包括起来即可
//先死后活 =》 4 就是 arr.length - 1
for( int i = 0; i < arr.length - 1; i++) {//外层循环是 4 次
	for( int j = 0; j < arr.length - 1 - i; j++) {//4 次比较-3 次-2 次-1 次
		//如果前面的数>后面的数,就交换
		if(arr[j] > arr[j + 1]) {
			temp = arr[j];
			arr[j] = arr[j+1];
			arr[j+1] = temp;
		}
	}

数组查找

在 java 中,我们常用的查找有两种:

顺序查找
二分查找

标准的二分查找
二分查找左边界
二分查找右边界
二分查找左右边界
二分查找极值点

class BS {
    public int search(int[] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        while (left <= right) {
            int mid = left + ((right - left) >> 1);
            if (nums[mid] == target) return mid;
            else if (nums[mid] > target) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return -1;
    }
}

循环条件: left <= right
中间位置计算: mid = left + ((right -left) >> 1)
左边界更新:left = mid + 1
右边界更新: right = mid - 1
返回值: mid / -1

多维数组-二维数组

使用方式 1: 动态初始化

语法: 类型[] []  数组名=new 类型[大小][大小]

比如: int a[] [] = new int[2][3]

使用方式 2: 动态初始化

先声明:类型 数组名[][]; TwoDimensionalArray02.java
再定义(开辟空间) 数组名 = new 类型[大小][大小]
赋值(有默认值,比如 int 类型的就是 0)

使用方式 3: 动态初始化-列数不确定

public static void main(String[] args) {
/*
看一个需求:动态创建下面二维数组,并输出
i = 0: 1
i = 1: 2 2
i = 2: 3 3 3
一个有三个一维数组, 每个一维数组的元素是不一样的
*/
//创建 二维数组,一个有 3 个一维数组,但是每个一维数组还没有开数据空间
	int[][] arr = new int[3][];
	for(int i = 0; i < arr.length; i++) {//遍历 arr 每个一维数组
	//给每个一维数组开空间 new
	//如果没有给一维数组 new ,那么 arr[i]就是 null
		arr[i] = new int[i + 1];
		//遍历一维数组,并给一维数组的每个元素赋值
		for(int j = 0; j < arr[i].length; j++) {
			arr[i][j] = i + 1;//赋值
		}
    }
	System.out.println("=====arr 元素=====");
	//遍历 arr 输出
	for(int i = 0; i < arr.length; i++) {
		//输出 arr 的每个一维数组
		for(int j = 0; j < arr[i].length; j++) {
		System.out.print(arr[i][j] + " ");
		}
		System.out.println();//换行
	}
}

使用方式 4: 静态初始化

定义 类型 数组名[][] = {{值 1,值 2…},{值 1,值 2…},{值 1,值 2…}}
使用即可 [ 固定方式访问 ]
比如:
int[][] arr = {{1,1,1}, {8,8,9}, {100}};

  1. 定义了一个二维数组 arr

  2. arr 有三个元素(每个元素都是一维数组)

  3. 第一个一维数组有 3 个元素 , 第二个一维数组有 3 个元素, 第三个一维数组有 1 个元素

二维数组使用细节和注意事项

  1. 一维数组的声明方式有:
    int[] x 或者 int x[]
  2. 二维数组的声明方式有:
    int[][] y 或者 int[] y[] 者 或者 int y[][]
  3. 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不相同。比如: map[][] 是
    一个二维数组
    int map [][] = {{1,2},{3,4,5}}
    由 map[0] 是一个含有两个元素的一维数组 ,map[1] 是一个含有三个元素的一维数组构成,我们也称为列数不等
    的二维数组

JavaAPI 文档

  1. API (Application Programming Interface,应用程序编程接口)是Java提供的基本编程接 口(java提供的类还有相关的方法)。中文在线文档:
    https://www.matools.com
  2. Java语言提供了大量的基础类,因此Oracle公司也为这些基础类提供了相应的API文档,用于告诉
    开发者如何使用这些类,以及这些类里包含的方法。
  3. Java类的组织形式[java类的组织形式]
    4.举例说明如何使用ArrayList类有哪些方法.
    安包>类->方法
    直接索引. Math

ASCII 码了解

ASCII码:上个世纪60年代,美国制定了一套字符编码(使用个字节), 对英语字
符与二进制位之间的关系,做了统规定,这被称为ASCI码. ASCI码共规走
了128个字符的编码,只占甩了一个字节的后面7位,最前面的1位统规定为0。
特别提示:一个学书可以表示256个学符,ASCII码只用了128个字符
2.看完整的ASCII码表
3.缺点:不能表示所有字符。

ASCLL码 ASCLL码

Unicode 编码

  1. Unicode的好处: 一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独
    -无二的编码,使用Unicode没有乱码的问题。
  2. Unicode 的缺点:一个英文字母和一个汉字都占用2个字节,这对于存储空间来说是浪费。
    3.2的1 6次方是65536,所以最多编码是65536个字符。
    4.编码0-127的字符是与ASCII的编码样比如’a’ 在ASCII码是0x61,在unicode码是
    0x0061,都对应97.因此Unicode码兼容ASCII码.

UTF-8 编码

  1. UTF-8是在互联网上使用最广的一种Unicode的实现方式(改进)
  2. UTF-8 是一种变长的编码方式。它可以使用1-6个字节表示个符号,根据不
    同的符号而变化字节长度。
    3.使用大小可变的编码字母占1个字节,汉字占3个字节
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值