java基础整理笔记.docx
《java基础整理笔记.docx》由会员分享,可在线阅读,更多相关《java基础整理笔记.docx(38页珍藏版)》请在冰点文库上搜索。
![java基础整理笔记.docx](https://file1.bingdoc.com/fileroot1/2023-5/17/c89dec26-ef70-44c3-bc91-408802abe217/c89dec26-ef70-44c3-bc91-408802abe2171.gif)
java基础整理笔记
目录
一、进制转换3
1.二进制和十进制之间的转换3
2.其他进制转换3
二、变量4
1.如何开辟内存空间4
2.什么时候定义变量5
3.类型转换5
三、运算符5
1./*运算5
2.++6
3.字符串连接+6
4.转义字符6
5.赋值运算7
6.逻辑运算符7
四、程序流程控制9
1.if......else9
2.Switch11
五、循环11
1.while循环11
2.Do.....while12
3.for12
4.While和for13
5.for循环练习13
求1--10的和13
1-100之间7的倍数13
6.for循环嵌套14
打印尖朝上的三角形14
打印数字三角形14
打印尖朝下的三角形15
九九乘法表16
打印居中三角形16
7.break和continue17
定义标号退出循环17
Continue例子17
六、函数18
1.函数的定义18
2.函数的特点19
3.函数的引用19
七、函数的重载20
1.概念20
2.特点20
3.什么时候使用重载20
八、数组20
1.数组的定义:
20
2.数组分析21
3.数组在内存中存储的结构21
4.对内存的特性22
5.数组静态初始化22
6.数组常见的操作22
获取数组中的元素,通常会用到遍历22
获取最大值、最小值23
选择排序24
冒泡排序(面试)25
数组中的查找26
折半查找26
练习(重点面试)27
进制转换28
一、进制转换
1.二进制和十进制之间的转换
十进制——>二进制。
6的二进制
原理:
对十进制数进行除2运算。
二进制——>十进制。
原理:
二进制乘以2的过程。
110
例:
1+1满二进一也就是10。
2.其他进制转换
转换成十六进制,先转换成二进制在进行转换。
因为是个二进制位就是一个十六进制位。
例:
90转换成十六进制
十六进制
转换成八进制,三个二进制位代表一位
例:
90转换成八进制
二进制就是132.
负数的二进制表现形式
6=110
-6:
其实就是6的二进制取反+1.
取反:
将二进制的1变成0,0变成1.
负数的最高位都是1.
2、变量
变量就是将不确定的数据进行存储。
也就是需要在内存中开辟一个空间。
1.如何开辟内存空间
就是通过明确数据类型,变量名称数据来完成。
数据类型变量名=初始化值
intx=4;
数据类型分为:
基本数据类型引用数据类型
Float和double精度不同,在内存中占用的空间也不同。
Float占了4个八位,double占了8个八位
2.什么时候定义变量
当数据不确定的时候。
需要对数据进行存储时。
就定义一个变量来完成存储动作。
3.类型转换
byteb=3;
b=b+2;
会报错数据容易损失精度
如果非要把值赋给b就需要强制转换
b=(byte)(b+2)
System.out.println('a'+1);这句话会把'a'转换成数值在加1.
三、运算符
1./*运算
intx=4270;
x=x/1000*1000;
System.out.println(x);
4270除1000之后会得到double类型的数据,然后在乘以1000得到的结果会把double类型的结果后面的小数去掉,保留整数部分。
System.out.println(-1%5);如果前面是负数的话结果就是负数,如果是正数的话那么结果就是正数
2.++
inta=3,b;
b=a++;
先将a的值赋给b然后a在++
a++——>a=a+1;
a++我先出去玩,然后在回家吃饭
inta=3,b;
b=++a;a的值先自行++,然后在将a的值赋给b
++a我先在家吃饭,在出去玩
3.字符串连接+
字符串数据和任何数据使用+都是相连接,最终结果都会变成字符串。
System.out.println("5+5"+5+5);结果是:
5555
4.转义字符
通过\来转变后面字母或者符号的含义
\n:
换行
\b:
退格
\r:
按下回车键
\t:
制表符相当于tab建
在Linux下换行是一个字符\n
在Windows系统下换行是两个字符\r\n
在Dos下直接是\r
输出一个带双引号的字符
System.out.println("\"hello\"");
5.赋值运算
intx=3;把右边的值赋给左边。
x+=4;把左右两边的和赋给左边。
shorts=4;
//s=s+5;这个是两次运算,先做加法,在做赋值。
s+=5;这个是一次运算,把左右两边的和赋给左边。
会做自动转换工作。
s=s+5编译失败。
因为s会被提升为int类型,运算后的结果还是int类型。
无法赋值给short类型。
s+=5编译通过,因为+=运算符在给赋值时,自动完成了强转操作。
6.逻辑运算符
逻辑运算符用于连接boolean类型的表达式
&(and)与
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=true;
|:
两边只要有一个味true,结果为true
只有两边都有false,结果为false。
^异或
true^true=false;
true^false=true;
false^true=true;
false^false=false;
^:
异或;就是和|有点不一样。
当true^true=false;
两边相同结果就是false
两边不同结果是true
双与&&(面试)
&&:
具有短路的功能
|和||的特点
|:
两边都参与运算
||:
当左边为true。
右边不运算。
<<左移>>右移
四、程序流程控制
1.if......else
if……else与三元运算符的区别
if……else结构简写格式:
变量=(条件表达式)?
表达式1:
表达式2;
三元运算符:
好处:
可以简化ifelse代码。
弊端:
因为是一个运算符,所以运算完必须要有一个结果
If语句只要有一个满足下面的语句就不会执行。
练习:
classIfTest
{
publicstaticvoidmain(String[]args)
{
//需求1:
根据用户定义的数值不同。
打印对应的星期英文。
intnum=2;
if(num==1)
System.out.println("monday");
elseif(num==2)
{
System.out.println("tsd");
}
else
System.out.println("nono");
//需求2:
根据用于指定月份,打印该月份所属的季节。
//3,4,5春季6,7,8夏季9,10,11秋季12,1,2冬季
intx=4;
if(x==3||x==4||x==5)
{
System.out.println("春季");
}
elseif(x==6||x==7||x==8)
{
System.out.println("夏季");
}
elseif(x==9||x==10||x=11)
{
System.out.println("秋季");
}
elseif(x==12||x==1||x=2)
{
System.out.println("冬季");
}
else
System.out.println(x+"月份不存在");
//第二种写法
if(x>12||x<1)
{
System.out.println(x+"月份不存在");
}
elseif(x>=3&&x<=5)
{
System.out.println("春季");
}
elseif(x>=6&&x<=8)
{
System.out.println("夏季");
}
elseif(x>=9&&x<=11)
{
System.out.println("秋季");
}
else
System.out.println("冬季");
}
}
2.Switch
switch语句:
允许变量与多个值进行相等性检测,每个值被一个case语句调用和检测。
语法:
switch(变量){
case值:
//语句
break;
case值:
//语句
break;
……
default:
//语句
}
switch语句中检测的变量只能是byte、short、int和char类型
break:
用break语句可以跳出switch语句体,程序继续执行switch语句体下面的程序
3.ifelse和Switch
ifelse和switch语句很像。
具体什么场景下,应用那个语句?
如果判断的具体数值不多,而是符合byte、short、int和char类型这四种类型
虽然两个语句都可以使用,建议使用switch语句,因为效率稍高。
其他情况:
对区间判断,对结果为Boolean类型判断。
使用ifelse因为使用的范围要广。
5、循环
1.while循环
定义初始化表达式
while(条件表达式){
循环体(执行语句)
}
程序流程先进行while循环,首先检测到布尔表达式。
如果是true就执行循环,知道布尔表达式为false为止
例子:
classWhileDemo
{
publicstaticvoidmain(String[]args)
{
/*
定义初始化表达式
*/
intx=3;
while(x<1)
{
System.out.println("HelloWorld!
");
x++;
}
}
}
2.Do.....while
do/while循环与while类似,不同的是do/while循环至少要执行一次,语法为:
do{
//语句
}while(布尔表达式);
While:
先判断条件,只用条件满足才执行循环体。
Dowhile:
先执行循环体,在判断条件,条件满足,在继续执行循环体。
简单一句话:
dowhile:
无论条件是否满足,循环体至少执行一次。
例子:
intx=1;
do{
System.out.println("do:
x="+x);
x++;
}while(x<0);
3.for
for循环是一种允许我们编写一个执行指定次数循环的控制结构,其语法形式如下:
for(初始化表达式;循环表达式;循环后的操作表达式){
执行语句
}
无限循环的最简单的表现形式。
for(;;){}
4.While和for
(1)变量有自己的作用域。
对于for来讲;如果将用于控制循环的增量定义在for语句中,那么该变量只在for语句内有效。
for语句执行完毕。
该变量中内存中就会消失。
(2)for和while可以进行互换。
如果需要定义循环增量。
用for更为合适。
5.for循环练习
求1--10的和
classForTest2
{
publicstaticvoidmain(String[]args)
{
getNum();
}
publicstaticvoidgetNum(){
intsum=0;
for(intx=1;x<=10;x++)
{
sum=sum+x;
}
System.out.println("sum="+sum);
}
}
1-100之间7的倍数
publicstaticvoidgetTest3()
{
intcount=0;
for(intx=1;x<100;x++)
{
if(x%7==0)
//System.out.println("x="+x);
count++;
}
System.out.println("7的倍数的个数是:
"+count);
}
6.for循环嵌套
打印尖朝上的三角形
*
**
***
****
for(intx=0;x<5;x++)
{
for(inty=0;y<=x;y++)
{
System.out.print("*");
}
System.out.println();
}
?
:
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
打印数字三角形
1
12
123
1234
12345
for(intx=1;x<=5;x++)
{
for(inty=1;y<=x;y++)
{
System.out.print(y);
}
System.out.print();
}
打印尖朝下的三角形
******
*****
****
***
**
*
?
?
?
?
?
:
for(intx=0;x<6;x++)
{
for(inty=x;y<=4;y++)
{
System.out.print("*");
}
System.out.println();//?
?
?
?
?
?
?
?
?
}
?
?
?
?
?
:
for(intx=5;x>0;x++)
{
for(inty=0;y{
System.out.print("*");
}
System.out.println();//?
?
?
?
?
?
?
?
?
}
九九乘法表
for(intx=1;x<=9;x++)
{
for(inty=1;y<=x;y++)
{
System.out.print(x+"*"+y+"="+x*y);
}
System.out.println();
}
打印居中三角形
----*
---**
--***
-****
*****
for(intx=0;x<5;x++)
{
for(inty=x+1;y<5;y++)
{
System.out.print("");
}
for(intz=0;z<=x;z++)
{
System.out.print("*");
}
System.out.println();
}
7.break和continue
break:
用break语句可以跳出switch语句体,程序继续执行switch语句体下面的程序。
在循环结构中,也可以用
break语句跳出本层循环体,从而提前结束层循环。
continue:
作用是结束本次循环(即跳过本次循环中余下尚未执行的语句),继续下一次循环。
定义标号退出循环
w:
for(intx=0;x<3;x++)
{
q:
for(inty=0;y<4;y++)
{
System.out.println("x="+x);
Breakw;
}
}
/*
标号只能定义在break循环上
*/
Continue例子
例子一:
for(intx=0;x<10;x++)
{
if(x%2==1)
continue;
System.out.println("x="+x);
}
例子二:
w:
for(intx=0;x<3;x++)
{
q:
for(inty=0;y<4;y++)
{
System.out.println("x="+x);
Continuew;
}
}
输出的结果是:
0、1、2
记住:
break和continue语句作用的范围
break和continue单独存在时,下面不可以有任何语句,因为执行不到
6、函数
1.函数的定义
修饰符返回值类型函数名(参数类型形式参数1,参数类型形式参数2.....)
{
执行语句;
return返回值;
}
返回值类型:
函数运行后的结果的数据类型。
参数类型:
是形式参数的数据类型。
形式参数:
是一个变量,用于存储调用方式时传递给函数的实际参数。
实际参数:
传递给形式参数的具体数值。
return:
用于结束函数。
返回值:
该值会返回给调用者。
例子:
定义一个整数的*3+5的运算
publicstaticintgetSum(intnum)
{
returnnum*3+5;
}
2.函数的特点
(1)定义函数可以将功能代码进行封装
(2)便于对该功能进行复用
(3)函数只有被调用才会被执行
(4)函数的出现提高了代码的复用性
(5)对于函数没有具体返回值的情况,返回值类型用关键字void表示,那么该函数中的return语句如果在最后一行可以省略不写。
注意:
函数中只能调用函数,不可以在函数内部定义函数。
定义函数时,函数的结果应该返回给调用者,交由调用者处理。
3.函数的引用
如何定义一个函数呢?
(1)既然函数是一个独立的功能,那么该功能的运算结果是什么先明确。
(2)在明确在定义该功能的过程中是否需要未知的内容参与运算。
例子1:
publicstaticintgetSum(intx,inty)
{
returnx+y;
}
例子2:
比较两个数是否相等
思路:
(1)明确功能的结果:
结果是:
boolean
(2)功能是否有未知内容参与运算。
有两个整数。
Publicstaticbooleancompare(intx,inty)
{
returnx==y;
}
例子3
对两个数进行比较。
获取较大的数
publicstaticintgetMax(inta,intb)
{
return(a>b)?
a:
b;
}
7、函数的重载
1.概念
在同一个类中,允许存在一个以上的同名函数,只要他们的参数个数或者参数类型不同即可
2.特点
与返回值类型无关,只看参数类表。
3.什么时候使用重载
当定义的功能相同,当参与运算的未知内容不同。
那么,这时就定义一个函数名称才表示该功能,方便阅读,而通过参数类表的不同来区分多个不同名的函数。
例子:
intadd(intx,inty){returnx+y};intadd(intx,inty,intz){returnx+y+z};
八、数组
1.数组的定义:
概念:
同一种数据类型的集合。
其实数组就是一个容器。
好处:
可以自动个数组中的元素从0开始编号,方便操作这些元素
格式:
1.元素类型[]数组名=new元素类型[元素个数或长度]
例子:
int[]arr=newint[2];
2.元素类型[]数组名=new元素类型[]{元素1,元素2,......}
例子:
int[]arr=newint{1,2,4,5};
int[]arr={2,4,5};
2.数组分析
数据类型有两种:
基本数据类型,引用数据类型
int[]arr=newint[2];arr它不是int类型,是数组类型,int表示是数组里面的数据类
数组类型就是引用数据类型。
只有引用类型的数据才有null值。
3.数组在内存中存储的结构
Java程序中运行时,需要在内存中分配空间。
为了提高运算效率,有对空间进行了不同区域的划分,
因为没一片区域都有特定的处理数据方式和内存管理方式。
栈内存:
用于存储局部变量。
当数据使用完,所占空间会自动释放。
堆内存:
数组和对象,通过new关键字建立的实例都存放在堆内存中。
每一个实体都有内存地址值
实体中的变量都有默认初始化值
实体不在被使用,会长不确定的时间内被垃圾回收器回收。
实例:
int[]x=newint[2]
int[]x是在栈内存存储的,一旦new出来的都是存在堆内存存储的。
newint[2]就会在堆内存中分配两个内存地址值,每个内存地址块都会有一个唯一的内存首地址值。
那么堆内存中的地址怎么样跟数组变量x联系起来呢?
堆内存中的每一个实体都有一个存放位置或内存地址值。
用内存地址来表示数据存储的位置。
这个内存地址用16进制来表示内存的首地址
把堆内存的首地址赋值给x这样x都有值了。
这样x就指向了这个数组int[]x=newint[2]了。
或者说x引用了这个数组。
4.对内存的特性
每个实体的堆内存都有初始化默认值,每个数据类型不一样默认值也不一样。
如果是Boolean类型的默认值是false。
int[]x=newint[2]
int[]y=x
x=null;
如果x=null那么就跟堆内存中的数据没有联系了。
那么堆内存的数据就会变成垃圾。
这样就会存在垃圾x就不会指向堆内存中的实体的地址。
Javajvm中的垃圾收集