------
Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
Java语言基础组成:
Java语言基础组成:
- 关键字
注意:main不是关键字,却是被虚拟机识别的,比较特殊。
- 标识符
-
-
- a-z A-Z 0-9 _ $
- 数字不能开头,起名尽量有意义
- 包名:xxxyyyzzz
- 类名接口名:XxxYyyZzz
- 变量名和函数名:xxxYyyZzz
- 常量名:XXX_YYY_ZZZ。多单词时,用下划线连接。
-
- 注释
可以注解程序和调试程序注意:先写注释,再写代码
- 常量和变量
- 整数常量
- 小数常量
- 布尔型常量
- 字符常量
- 字符串常量
- null常量
- 运算符
-
- 算术运算符
- 赋值运算符
- 比较运算符
- 逻辑运算符
- 位运算符
- 三元运算符
- 算术运算符
% 取模 5%2 = 1
x % y
x<y 则结果为x
x=y 结果为0
y=1, 结果为0
1 % -5 结果为?? 1
-1 % 5 结果为?? -1
只看左边的正负。面试的边边角角。
++ 自增
-- 自减
int a = 3, b;
b = a++;
先赋值给b,再自增
System.out.println(b);3
System.out.println(a);4
b = ++a;
先自增,再赋值
字符串数据和任何数据使用+都是相连接,最终都会变成字符串。
字符串连接符 +
System.out.println("5+5="+5+5);//打印为"5+5=55"
-
-
- 注意:代码阅读性重要。
-
- 转义字符:
通过\来转变后面字母或者符号的含义。\n:换行。\b:退格。相当于backspace。\r:按下回车键。window系统,回车符是由两个字符来表示\r\n\t:制表符。相当于tab键。
转义字符写在被转义的字符前面System.out.println("\"hello\"");//打印"hello"带双引号的
char c h= '\n';//可以的,像'\'',打印为'char c = '你’;//可以装中文的
- 赋值运算符:
+= -= *= /= %=
short s = 4;s = s + 5;//编译失败,因为s被提升为int类型,运算后结果还是int类型,无法赋值给short类型。short是2个8位,5是4个8位。会丢失精度
s += 5;//编译通过,因为+=运算符在给s赋值时,自动完成了强转动作。
int a,b,c;a = b = c = 5;//比较少见的形式。
- 比较运算符:
!= < > <= >= == instanceof
逻辑 运算符:& AND(与)| OR(或)^ XOR(异或)! Not(非)&& AND(短路)|| OR(短路)
&:只要两边有一个为false,则为false。|:只要有一方为true,则为true。^:和|有点不一样,当true ^ true 则为false。两边相同结果为假,两边不同,结果为真。
int a = 2;a>3 & a<6;a>3 && a<6;//短路,当判断到前面的为false,则停止运算,直接输出false&:无论左边是true还是false,右边都运算。&&:当左边为false,右边不运算。|:两边都参与运算。||:左边为true,右边不运算。
- 位运算符:
<<>>>>> 无符号位移& 与运算| 或运算^ 异或运算~ 反码
example:3<<2 = 12;0000-0000 0000-0000 0000-0000 0000-0011左移两位: 00-0000 0000-0000 0000-0000 0000-001100
6>>1 = 3;0000-0000 0000-0000 0000-0000 0000-0110000000-0000 0000-0000 0000-0000 0000-01<<:其实就是乘以2的移动的位数次幂。3<<2--> 3*2^2>>:其实就是除以2的移动位数次幂。6>>1--> 6/2^1
添0,以最高位是1还是0来补。而>>>,无论最高位是1还是0,都拿0补。位运算运算速度最快,但局限性是只能是2的倍数增减。
与运算,或运算,异或运算: 6 & 3 = 2; 6 | 5 = 7; 6 ^ 5 = 3;110 110 110& 011 | 101 ^ 101------- -------- -------010 = 2; 111 = 7; 011 = 3;
验证:System.out.println(6 ^ 5);//结果为3
反码:
负数的二进制表现形式为取反+1;000......000110 = 6;111......111001 取反000......000001 +1;111......111000 = -7;(因为 000......000111为7)~6 = -7;
另外:7 ^ 4 ^ 4 = 7;7 ^ 4 ^ 4:111^100 加密----011^100 解密---- 4相当于秘钥111一个数异或同一个数两次,结果还是那个数。
2 * 8 =0000* 0010-------------00001000------------10000 = 16;就是下面的第一位与上面四位相乘,依次第二位与上面4位相乘。
高效:2<<<30000-0010 20001-0000 16
交换两整数1.temp = n;n = m;m = temp;
2. n = n + m;m = n - m;n = n - m;
3.n = n ^ m;m = n ^ m;n = n ^ m;
======================================
public static void main(String[] args){int num = 60;//获取60的最低4位,通过&15int n1 = num & 15;System.out.println(n1>9?(char)n1-10+'A')":n1);//要获取下一组四位,将60右移4位。int temp = 60 >>> 4;//对temp的值进行最低4位的获取。int n2 = temp & 15;System.out.println(n2>9?(char)n1-10+'A')":n2);/*0-9 'A'- - - - -'F'ASCII表现形式: 65 66 6710 11 12
12 - 10 = 2;2 + 'A' = 67;char(67);
(获取4最低四位,&15,获取最低8位,&255)*/
- 三元运算符:
(条件表达式)?表达式1:表达式2;true返回表达式1false返回表达式2
语句:
程序流程控制:
- 顺序结构:
- 判断结构:
- 选择结构:
- 循环结构:
- 判断结构:
if语句:
如果if控制的语句只有1条,则大括号可以不写。
若不写大括号且有几条语句,则控制离他最近的语句。
三种格式:
if(条件表达式){
}
if(条件表达式){
}
else{
}
if(条件表达式){
}
else if(条件表达式){
}
else{
}
if else简写格式:变量 = (条件表达式)?表达式1:表达式2;
三元运算符:
好处:可以简化if else代码
弊端:因为是一个运算符,所以运算完必须要有一个结果。
int a = 9, b;
b = (a>1)?100:200;
if(a>1)
b =100;
else
b=200;
============================
需求:根据用户指定月份,打印该月份所属的季节,
用switch和ifelse的形式。代码得敲,得熟,知识点得熟。
=============
- 选择结构:
switch语句:4个关键字
格式:
switch(表达式)
{
case 取值1:执行语句;
break;
case 取值2:执行语句;
。。。
default:
执行语句;
break;//可不写
}
- 特点:
1选择的类型只有四种:byte,short,int,char。
2case之间与default没有顺序,先执行第一个case,没有
匹配的case执行default。
3结束switch语句的两种情况:遇到break,执行到switch语句结束。
4如果匹配的case或者default没有对应的break,那么
程序会继续向下执行,运行可以执行的语句,直到遇到break或者switch结尾结束。
int a = 3,b = 2;
char ch = '+';
switch(ch)
{
case '-':
sop(a-b);
break;
case '+':
sop(a+b);
break;
case '*':
sop(a*b);
break;
case '/':
sop(a/b);
break;
default:
sop("非法输入");
break;
}
if和switch语句很像。
具体什么场景下,应用哪个语句呢?
如果判断的具体数值不多,而且符合byte,short,int,char这四种类型。
虽然两个语句都可以使用,但建议使用switch语句,因为效率稍高。
其他情况:对区间判断:对结果为boolean类型判断,使用if,if的
使用范围更广。
switch类型在1.4可以对字符串进行判断。
而在1.5则可以对枚举进行选择。
==============================
- 循环结构:
while do while for
- while语句格式:
while(条件表达式)
{
执行语句;
}
do while语句格式:
do
{
执行语句;
}while(条件表达式);
do while特点是条件无论是否满足,循环体至少被执行一次
- while语句中:
定义初始化表达式:
while(条件表达式)
{
循环体(执行语句);
}
int x = 1;
while(x<10)
{
Sop("x"+x);
x++;
}
do while语句中:
int x=1;
do{
sop("do:x="+x);
x++;
}
while(x<3);
while的特点:先判断条件,只有条件满足才执行循环体。
do while的特点:先执行循环体,在判断条件,条件满足,
再执行循环体。就是无论条件是否满足,循环体至少执行一次。
while的后面要么是{},要么是;
- for语句:
for(初始化表达式;循环条件表达式;循环后的操作表达式)
{
执行语句;
}
for(int x = 0;x<3;x++)
{
sop("x="+x);
}
//sop("x============="+x);
//变量x作用域在for循环的大括号内。
//x在内存生成后就,又随着for循环的结束而消失。
解析: A:int x = 0;--->在内存中开辟一块空间
B:x<3?--->若满足,
C:则执行语句。
D:x++---->x自增
E:x<3?-->继续判断
F:执行语句
G:x++--->x继续自增
H:x<3?再判断,不满足
I:跳出循环
int y = 0;
while(y<3)
{
SOP("y="+y);
y++;
}
sop("y==========="+y);
//y在内存中生成后,再执行while循环,循环结束后,y仍然在内存中。
- 两者有什么区别呢?
1,变量有自己的作用域,对于for来讲,如果将用于控制循环
增量定义在for语句中。那么该变量只在for语句内有效。
for语句执行完毕。该变量在内存中被释放。
2,for和while可以进行互换,如果需要定义循环增量,用for
更为合适。
- 总结:
什么时候使用循环结构?
当要对某些语句执行很多次时,就是用循环结构。
- 无限循环的最简单表达形式:
* for(;;)
* {
* }
*
* while(true)
* {
* }
注意嵌套循环的使用。
- 其他流程控制语句:
break(跳出),continue(继续)
break语句:应用范围:选择结构和循环结构
continue语句:应用于循环结构。
- 注意:
b.这两个语句单独存在,下面都不可以有语句,因为执行不到。
c.continue语句是结束本次循环继续下次循环。
d.标号的出现,可以让这两个语句作用于指定的范围。
- 函数
-
- 函数的定义
- 函数的特点
- 函数的应用
- 函数的重载(特性)overload
- 函数的定义:
- 什么是函数?
函数就是定义在类中的具有特定功能的一段
2. 函数的格式:
独立小程序。
函数也称为方法。
修饰符 返回值类型 函数名(参数类型 形式参数1,参数类型 形式参数2)
{
执行语句;
return 返回值;
}
返回值类型:函数运行后的结果的数据类型。
参数形式:是形式参数的数据类型。
形式参数:是一个变量,用于存储调用函数时传递给函数的实际参数。
return:用于结束函数。
返回值:该值会返回给调用者。
- 函数的特点:
定义函数可以将功能代码进行封装
便于对该功能进行复用
函数只有被调用才会被执行
函数的出现提高了代码的复用性
对于函数没有具体返回值的情况,返回值类型用关键字void表示,
那么该函数中的return语句如果在最后一行可以省略不写
注意:
函数中只能调用函数,不可以在函数内部定义函数。
定义函数时,函数的结果应该返回给调用者,交由调用者处理。
- 如何定义一个函数呢?
1.既然函数是一个独立的功能,那么该功能的运算结果是什么?先明确。
2.在明确在定义该功能的过程中,是否需要未知的内容参与运算?
可以这么理解:主函数就是调用函数,来测试这段功能代码。
例子:
需求:定义一个功能完成3+4的运算,并将结果返回给调用者
思路:1.明确功能结果是3+4的和,既一个整数的和
2.在实现该功能的过程中,没有未知内容参与运算。
其实这两个功能就是在明确函数的定义。
1.明确函数的返回值类型。
2.明确函数的参数列表。(参数类型,参数个数)
主函数就是调用函数,来测试这段功能代码。
返回值类型为void的情况,不能再主函数中输出,
应为System.out.println并不明确该函数的返回值类型。
- 函数的重载:overload
重载的概念:
在同一个类中,允许存在一个以上的同名函数,只要让他们的参数个数或者参数类型不同即可。
重载的特点:
与返回值类型无关,只看参数列表。
重载的好处:
方便于阅读,优化了程序的设计。
什么时候用重载?
当定义的功能相同,但参与运算的未知内容不同。则定义一个函数名称以表示其功能,方便阅读。
而通过参数列表 的不同来区分多个同名函数。
- 数组
- 数组的定义
- 数组的内存分配及特点
- 数组操作常见问题
- 数组常见操作
- 数组中的数组
- 数组的定义:
概念:
同一种类型数据的集合。其实数组就是一个容器。
数组的好处:
可以自动给数组中的元素从0开始编号,方便操作这些元素。
格式1:
元素类型[] 数组名 = new 元素类型[元素个数或数组长度];
示例: int[] arr = new int[5];
格式2:
元素类型[] 数组名 = new 元素类型[]{元素,元素,元素.....};
示例:int[] arr = new int[]{3,6,5,7};
int[] arr = {3,6,5,7};
- 数组的内存分配及特点:
内存结构:
java程序在运行时,需要在内存中分配空间。为了提高运算效率,
又对空间进行了不同区域的划分,因为每一片区域都有特定
的处理数据方式和内存管理方式。
栈内存:
用于存储局部变量,当数据使用完,所占空间会自动释放。
堆内存:
数组和对象,通过new建立的实例都存放在堆内存中。
每一个实体都有内存地址值
实体中的变量都有默认初始化值
实体不在被使用,会在不确定的时间内被垃圾回收器回收
方法区,本地方法区,寄存器
数组中的选择排序:
1:先拿0角标的元素依次和其他角标比较,若比0角标元素小,则0角标替换成该元素。
在0角标位置产生了最小值,
2:再拿1角标的元素依次比较,1角标位置产生最小值。
3:依次类推。
(内循环结束一次,最值出现在头角标位置上)
数组中的冒泡排序:面试中比较常见。
1.相邻的两个元素进行比较,如果符合条件就换位。第一圈:最值出现在最后位。
提供了一种排序方式:Arrays.sort(arr);
数组的查找:
拆半查找。如:34;1~200--》 猜100. 1~100--》猜50 。。。。。
数组中十进制转成其他进制:
Integer.toBinaryString(3)
Integer.toHexString(60)
Integer.toOctalString(4)
还有二维数组:int[][] arr1 = new int[3][4];//二维数组,有3个一维数组,每个一维数组有四个元素。int[][] arr2 = new int[3][];arr2[0] = new int[3];arr2[1] = new int[2];arr2[2] = new int[5];System.out.println(arr2.length);//打印的是二维数组的长度。System.out.println(arr2[0].length);//打印二维数组中第一个一维数组的长度。
另外:int[] x,y[];//x一维,y二维 分解后为:int[] x; int[] y[];int[] x; int x[];int[][] y; int[] y[]; int y[][];