------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
Java编程基础:
1.常量与变量?
用来对超过16位有效位的数进行精确的运算。
01.BigDecimal:
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。
在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。
BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。
构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
02.Java中常量的分类:
a.整数常量:所有整数
b.小数常量;所有小数
c.布尔型常量:较为特有,只有两个数值。true false。
d.字符常量。将一个数字字母或者符号用单引号( ' ' )标识。
e.字符串常量。将一个或者多个字符用双引号标识。
f.null常量。只有一个数值就是:null
对于整数:java有三种表现形式。
1.十进制:0-9,满10进1.
2.八进制:0-7,满8进1.用0开头表示。
3.十六进制:0-9, A-F,满16进1.用0x开头表示。
03.变量
变量的概念?
•内存中的一个存储区域
•该区域有自己的名称(变量名)和类型(数据类型)
•该区域的数据可以在同一类型范围内不断变化
为什么要定义变量?
•用来不断的存放同一类型的常量,并可以重复使用
什么时候定义变量?
当数据不确定的时候,需要对数据进行存储时。就是定义一个变量来完成存储动作。
使用时变量注意
•变量的作用范围(一对{}之间有效)
•初始化值
定义变量的格式
•数据类型 变量名 = 初始化值;
提示:变量就如同数学中的未知数。
Java中数据类型:教学视频02-07
04.数据类型(掌握)
(1)分类
基本类型:4类8种。
引用类型:类,接口,数组。(了解)
(2)基本类型
整型:
byte 1
short 2
int 4
long 8
浮点型:
float 4
double 8
字符型:
char 2
布尔型:
boolean 不明确。可以认为是1个字节。
注意:
整数默认是int类型。long类型需要加L或者l后缀。
浮点数默认是double类型。float类型需要加F或者f后缀。
2.类型转换
1)自动类型提升
byte b = 3;
int x = 4;
x = x + b;//b会自动提升为int类型进行运算。
boolean类型不参与转换。
隐式转换(从小到大)
byte,short,char -- int -- long -- float -- double
2)强制类型转换
byte b = 3; /此处正确,3是常量,直接赋给变量
b = b + 4;//报错,b是变量,2为整数类型,b自动提升为整数类型,重新赋给b
丢失精度。
b = (byte)b+4;//强制类型转换,强制将b+4的结果转换为byte类型,再赋值给
b。
3)运算时的转换:
byte b1=3,b2=4,b;
b=b1+b2;//报错,虚拟机规定,int short boolean byte char在运算时都会转
为int,32bit整型。
b=3+4;//常量赋值
3.进制的转换
A.十进制二进制 互转
•十进制转成二进制除以2取余数(从下到上取)
•二进制转成十进制乘以2的幂数
B.二进制转成十六进制
四个二进制位就是一个十六进制位,因为1111=15,满十六进一位
C.二进制转成八进制
三个二进制代表一个八进制位
D.十进制 八进制 互转
E.十进制 十六进制 互转
F.负数的二进制表现形式
•对应的正数二进制取反加1;正数的最高位为0,负数取反,所以负数的最高位为1
例如:-6的二进制
一个INT类型的整数在内存中是占4个字节,32bit
4.运算符
A.算数运算符
b=a++ 等同于b=a=a+1;先赋值给b,然后自增1;
b=++a 等同于b=a=a+1;先自增然后赋值给b;
字符串数据和任何数据使用+都是相连接,最终变成字符串:
System.out.print(”5+5”+5+5) 输出:5+555
B.转义字符
\n:换行符
\t:制表符,相当于TAB键
\r:相当于linux系统中按下回车键,,Windows系统中由 \r\n 组成
\b:退格,相当于backspace
\”:双引号
C.赋值运算符
符号:
= , +=, -=, *=, /=, %=;
short a=3
a=a+3//编译失败,丢失精度,是先做加法运算再进行赋值,两步计算
因为a会被提升为INT类型,运算后的结果还是INT类型,无法赋值给short类型。
a+=3//编译通过,复合赋值运算符实际上包含了强制转换,只有一步赋值运算,会做
自动转换动作。
因为+=运算符在赋值时,自动完成了强转动作。
D.比较运算符
提示:比较运算符“==”不能误写成“=”。
E.逻辑运算符
true & true = true;
true & false = false;
false & true = false;
false & false = false;
& : 只要两边的boolean表达式结果,有一个为false。那么结果就
是false。
只有两边都为true,结果为true。
true | true = true;
true | false = true;
false | true = true;
false | false = false;
| : 两边只要有一个为true,结果为true。
只有两边都有false,结果为false。
^ : 异或;就是和|有点不一样。当true ^ true = false;
true ^ true = false;
true ^ false = true;
false ^ true = true;
false ^ false = false;
^ : 两边相同结果是false。两边不同结果是true。
&和&&的特点:
&:无论左边是true是false。右边都运算。
&&:当左边为false时,右边不运算。
|:两边都参与运算。
||:当左边为true。右边不运算。
5.三元运算符:(条件表达式)?表达式1:表达式2;--是if else 结构的简写。
•如果条件为true,运算后的结果是表达式1;
•如果条件为false,运算后的结果是表达式2;
好处:简化if else代码
弊端:因为是运算符,所以运算完必须要有一个结果。
6.Scanner的使用(掌握)
(1)Scanner是JDK5以后设计的用来接收键盘录入数据使用的。
(2)目前我们要通过键盘录入int类型数据,必须按照如下步骤:
A:导包
import java.util.Scanner;
B:创建对象,封装键盘录入
Scanner sc = new Scanner(System.in);//System.in:是标准输入流。对应着键盘录入。
C:调用方法,获取数据
/*一年有12个月,每个月分别对应于不同的季节。
请根据给定的月份,输出对应的季节。
春:3,4,5
夏:6,7,8
秋:9,10,11
冬:1,2,12
并设计打印1-6为上半年,7-12为下半年
*/
import java.util.Scanner;
class YueFen
{
public static void main(String[] args)
{
//封装键盘录入
Scanner s =new Scanner(System.in);
//提示键盘录入月份
System.out.println("请输入月份1-12; ");
int month = s.nextInt();
//判断结构
if (month == 1 || month == 2 || month == 12)
{
System.out.println( "冬季");
}
else if (month == 3 || month == 4 || month == 5)
{
System.out.println( "夏季");
}
else if (month == 6 || month == 7 || month == 8 )
{
System.out.println( "秋季");
}
else if (month == 9 || month == 10 || month == 11)
{
System.out.println( "春季");
}
//判断这个月份是上半年还是下半年
if(month>=1 && month<=6)
{
System.out.println("上半年");
}
else if(month>=7 && month<=12)
{
System.out.println("下半年");
}
}
}
int number = sc.nextInt();
例如:
7.程序流程结构控制
判断结构:if , if…else …, if…else if...else…
选择结构:
switch(表达式)
{
case 取值1:
case 取值2:
执行语句;
break;
case 取值3:
执行语句;
break;
…
Default:
执行语句;
Break;//可以省略
}
Switch特点:
a.switch语句选择的类型只有四种:byte, short, int, char。
b.case之间与default在定义的时候没有顺序。先执行第一个case,没有匹配 的case执行default。
c.结束switch语句的两种情况:遇到break,执行到switch语句结束。
d.如果匹配的case或者default没有对应的break,那么程序会继续向下
执行,运行可以执行的语句,直到遇到break或者switch结尾结束。
if和switch语句很像,具体什么场景下,应用哪个语句呢?
* switch如果判断的具体数值不多,而是符合byte short int char这四种类型。
* 虽然两个语句都可以使用,建议使用swtich语句。因为效率稍高。
* 其他情况:对区间判断,对结果为boolean类型判断,使用if,if的使用范围更广。
If else为什么比switch效率低
1.switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化
2.switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选择
执行哪一个case的语句块。
3.if..else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载
一次;所以在多路分支时用switch比if..else if .. else结构要效率高。
首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
说到基本类型的数值比较,那当然要有两个数。然后重点来了——
if 语句每一句都是独立的,看下面的语句:
if (a == 1) ...
else if (a == 2) ...
这样 a 要被读入寄存器两次,1 和 2 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
于是 switch case 就出来了,把上面的改成 switch case 版本:
switch (a) {
case 0:
break;
case 1:
}
因为特定的规则,他一开始就知道你要比 a,于是 a 一次性读取,相比 if 节约了很
多开销。
8.循环结构:
1.While(条件表达式)
{执行语句};
2.Do
{执行语句}
While(条件表达式);
While与do while的区别
while:先判断条件,只有条件满足才执行循环体。
do while: 先执行循环体,在判断条件,条件满足,再继续执行循环体。
简单一句话:do while:无论条件是否满足,循环体至少执行一次。
3.for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
for里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就
执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个
过程,直到条件不满足为止。
4.While与for区别:
while与for可以互换,区别在于,用于控制循环的增量定义在for语句中,在
for循环结束就在内存中释放。而while循环使用的变量在循环结束后还可以继
续使用。
5.最简单无限循环格式:
while(true) , for(;;),无限循环存在的原因是并不知道循环多少次,而是
根据某些条件,来控制循环。
6.计数器思想:通过一个变量记录住数据的状态变化。也是通过循环完成。
break(跳出),continue(继续)
break语句:应用范围:选择结构和循环结构。
continue语句:应用于循环结构(结束本次循环,继续下一次循环)。
注意:break和continue单独存在时,下面可以有任何语句,因为都执行不到。
跳到指定位置:
A:
Break A;
提示:
a,这两个语句离开应用范围,存在是没有意义的。
b,这个两个语句单独存在下面都不可以有语句,因为执行不到。
c,continue语句是结束本次循环继续下次循环。
d,标号的出现,可以让这两个语句作用于指定的范围
7.嵌套循环:
简单的说就是循环里面还有循环。
外循环执行一次,内循环执行一遍。
for(初始化表达式;条件表达式;循环后的操作表达式){ }
for(初始化表达式;条件表达式;循环后的操作表达式){ }
while(条件表达式){ };while(条件表达式){ }
总结:嵌套循环是外循环条件成立执行一次,内循环必须执行到条件不满足才结束。
1)累加思想:
原理:通过变量记录住每次变化的结果,通过循环的形式,进行累加动作。
2).计数器思想:
原理:通过一个变量记录住数据的状态变化,也许通过循环完成。
3)大圈套小圈思想:
原理:尖朝上改变条件。尖朝下改变初始值。
注意:
1.for里面的连个表达式运行的顺序,初始化表达式只读一次,判断循环条件,为真就执行循环体,然后再执行循环后的操作表达式,接着继续判断循环条件,重复找个过程,直到条件不满足为止。
2. while和for可以互换,区别在于for为了循环而定义的变量在for循环结束就是在内存中释放。而while循环使用的变量在循环结束后还可以继续使用。
3.最简单无限循环格式:while(true),for(;;)无限循环存在的原因是并不知道循环多少次,而是根据某些条件,来控制循环。比如在循环体定义判断语句。
8.递归函数:
一个过程(或函数)直接或间接调用自己本身,这种过程(或函数)叫递归过程(或函数).
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
递归算法所体现的“重复”一般有三个要求:
一是每次调用在规模上都有所缩小(通常是减半);
二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
递归应用:
1.求数组中的最大数
2.1+2+3+...+n
3.求n个整数的积
4.求n个整数的平均值
5.求n个自然数的最大公约数与最小公倍数
6.有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子
7.已知:数列1,1,2,4,7,13,24,44,...求数列的第 n项.(斐波那契数列)
8.梵塔问题(汉诺塔问题)
9.楼梯有n阶台阶,上楼可以一步上1阶,也可以一步上2阶,编一程序计算共有多少种不同的走法.设n阶台阶的走法数为f(n)
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------