欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

第三章:java语言基础(java知识点),

来源: javaer 分享于  点击 39559 次 点评:83

第三章:java语言基础(java知识点),


课1:
    1)数据类型中补充的几个小问题
(1)byte值的问题                          -128 ~ 127
byte b1 = 127;
byte b2 = (byte)128;               -128
byte b3 = (byte)129;               -127
byte b4 = (byte)130;               -126
(2)浮点数在内存中的存储
例题:17.625在内存中的存储
①首先要把17.625换算成二进制 :10001.101
整数部分除以2,直到商为0,余数反转;
小数部分乘以2,直到乘位为0,进位顺序取
②再将10001.101右移,直到小数点前只剩1位
1.0001101*2^4          因为右移了4位
底数:因为小数点前必为1,所以IEEE规定只记录小数点后的就好,所以,此处的底数为 :0001101
指数:实际为4,必须加上127(转出的时候,减去127),所以为131,也就是10000011
     符号部分是整数,所以是0
结果 :01000001    10001101     00000000     00000000


课2:
    1)java语言中的字符char可以存储一个中文汉字吗?为什么?
可以,因为java语言中的字符占用2个字节
java采用的是Unicode编码


课3)
    1)逻辑运算符
(1)&与&&的区别:
单&时,左边无论真假,右边都进行运算
双&时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算
(2)|和||的区别同理,双|时,左边为真,右边不参与运算
(3)异或(^)和 或(|)的不同之处:当左右都为true时,结果为false
例如 :情侣关系


课4:
    1)位运算符
因为是位运算符,所以我们必须先把数据换算成二进制
&   位与运算:        有0则0
|   位或运算:        有1则1
^   位异或运算:      相同则0,不同则1 (一个数据对另一个数据位异或两次,该数本身不变)
~   按位取反运算:    0变1,1变0
<<  左移:            左边最高位丢弃,右边补齐0
>>  右移:            最高位是0,左边补齐0,最高位是1,左边补齐1
>>> 无符号右移:      无论最高位是0还是1,左边补齐0
例子: System.out.println(3<<2);               3*2^2 = 12
      System.out.println(24>>2);              24/(2^2) = 6
面试题:请用最有效率的方式写出计算2乘以8的结果
2<<3


课5:
    1)三目运算符
(1)格式: (关系表达式)?表达式1 : 表达式2 ;
如果条件为true,运算后的结果为1
如果条件为false,运算后的结果为2
   例子:获取三个整数中的最大值
int a = 10;                          分两步:
int b = 20;                              A:先比较a,b的最大值
int c = 30;                              B: 拿a,b的最大值再和c比较


   解: int temp = ((a>b)?a:b);
int max  = (temp>c?temp:c);


课6:
    1)选择结构(switch语句):
switch(表达式){           表达式取值类型为 : byte,short,int,char
case 值1;
语句体;
break;
case 值2;
语句体2;
break;
 ...
default:
语句体;
break;
}


课7:
    1)选择结构(各自使用场景)
if语句使用场景:
(1)针对结果是boolean类型的判断
(2)针对一个范围的判断
(3)针对几个常量的判断
switch语句使用场景
(1)针对几个常量值的判断


课8:
    1)求取水仙花数。(所谓水仙花数是指一个三位数,其各位数字的立方和等于该数本身)
例如:153就是一个水仙花数               153 = 1*1*1+5*5*5+3*3*3
思想:个位:153%10       = 3
     十位:153/10%10    = 5
     百位:153/10/10%10 = 1
  for(int x=100;x<1000;x++){
int ge  = x%10;
int shi = x/10;
int bai = x/10/10%10;
if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)){
System.out.println(x);
}
  }


课9:
    1)for循环的统计思想(统计水仙花数共有多少个)
int count = 0;
for(int x=100;x<100;x++){
int ge = x%10;
int shi = x/10%10;
int bai = x/10/10%10;
if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)){
count++;
}
}
System.out.println("水仙花数共有"+count+"个");


课10:
    1)输出10遍HelloWorld
int x = 0;
while(x<10){
System.out.println("HelloWorld");
x++;
}
注释 :while循环结构
(1)基本格式:
while(判断条件语句){
循环体语句;
}
(2)扩展格式:
初始化语句;
while(判断条件语句){
循环体语句;
控制条件语句;
}


课11:
    1)while循环的统计思想(统计水仙花数共有多少个)
int count = 0;
int x = 100;
while(x<1000){
int ge = x%10;
int shi = x/10%10;
int bai = x/10/10%10;
if(x == (ge*ge*ge+shi*shi*shi+bai*bai*bai)){
count++;
}
x++;
}
System.out.println(count);


课12:
    1)while循环和for循环的区别:
使用区别:如果你想在循环结束后继续使用控制条件的那个变量,用while循环,否则用for循环
 因为变量及早地从内存中消失,可以提高内存的使用效率
其实还有一种场景的理解:
 如果是一个范围的,用for循环非常明确
 如果是不明确要循环多少次,用while循环较为合适
 举例:吃葡萄
    2)输出10遍HelloWorld
for循环实现:
for(int x=0;x<10;x++){
System.out.println("HelloWorld");
}
//System.out.println(x);          这里不能继续访问
while循环实现:
int y = 0;
while(y<10){
System.out.println("HelloWorld");
y++;
}
System.out.println(y);            这里是可以访问的


课13:
    1)do...while循环结构
基本格式:
do{
循环体语句;
}while(判断条件语句);
扩展格式:
初始化语句;
do{
循环体语句;
控制条件语句;
}while(判断条件语句);


课14:
    1)两种基本的死循环格式
(1)  while(true){
...
}
(2)  for( ; ; ){
...
}
例题1:  
while(true){
System.out.println("今天我很高兴,学习了死循环");
}
例题2:
for( ; ; ){
System.out.println("今天我很高兴,学习了死循环");
}


课15:
    1)九九乘法表
for(int i=1;1<=9;i++){
for(int j=1;j<=i;j++){
int num = i*j;
System.out.println(j+"*"+i+"="+num+"\t");
}
System.out.println();
}


课16:
    1)break    : 中断
       continue : 继续
       return   : 返回
    2)break:
(1)跳出单层循环 (在switch语句或循环语句中直接使用break时)
(2)跳出多层循环 (要想实现这个效果,就必须知道一个东西,带标签的语句)
格式: 标签名:语句
多层循环示例:
wc:for(int x=0;x<3;x++){
for(int y=0;y<4;y++){
if(y == 2){
break wc;
}
System.out.println("*");
}
System.out.println();
}
continue :跳出一次循环,进入下一次的执行    (循环语句中使用)
continue循环示例:
for(int x=1;x<=10;x++){
if(x == 3){
break;                     跳过3输出
}                                  结果为 :1245678910
System.out.print(x);
}
return : 它的作用不是结束循环的,而是结束方法的
return示例:
public static void main(String[] args){
for(int x=0;x<10;x++){
if(x == 2){
System.out.println("退出");                  结果:  0   1   退出
return;
}
System.out.println(x);
System.out.println("over");
}
}


课17:
    1)循环语句结合break的练习题
小芳的妈妈每天给她2.5元钱,她都会存起来,但是,每当这一天是存钱的第5天或者5天的倍数的话,她都会花去6元钱。
请问:经过多少天,小芳才可以存到100元钱。
double dayMoney = 2.5;
double daySum = 0;
int dayCount = 1;
int result = 100;
while(true){
daySum += dayMoney;
if(daySum >= result){
System.out.println("共花了"+dayCount+"天存储了100元");
break;
}
if(dayCount%5 == 0){
daySum -= 6;
System.out.println("第"+dayCount+"天花了6元钱");
}
dayCount++;
}


课18:
    1)方法:完成特定功能的代码块(不调用不执行)
方法格式:           修饰符  返回值类型  方法名(参数类型  参数名1,参数类型  参数名2,...){
方法体语句;
return 返回值;
    }
参数:
实际参数:就是实际参与运算的
形式参数:就是方法定义上的,用于接收实际参数的
方法体语句:就是完成功能的代码块
方法的注意事项:如果方法有明确的返回值,一定要有return带回一个值


课19:
    1)函数的调用
(1)单独调用
(2)输出调用
(3)赋值调用(推荐)


课20:
    1)思考题:键盘录入两个数据,比较两个数是否相等
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
System.out.println("请输入第一个数据");
int a = sc.nextInt();
System.out.println("请输入第二个数据");
int b = sc.nextInt();
boolean flag = compare(a,b);
System.out.println(flag);
}
//方法一:
public static boolean compare(int a,int b){
if(a == b){
return true;
}else{
return false;
}
}
//三元改进:
public static boolean compare(int a,int b){
boolean flag = ((a==b)?true:false);
return flag;
}
//继续改进:
public static boolean compare(int a,int b){
return ((a==b)?true:false);
}
//最终版:
public static boolean compare(int a,int b){
return a == b;           能够使用这种方法,是因为a==b本来就可以表判断,返回布尔类型
}
    2)键盘录入三个数据,输出其中的最大值
//三元改进:
int temp = ((a>b)?a:b);
int max  = ((temp>c)?temp:c);
return max;


课21:
    1)void类型返回值的方法调用只能是单独调用
方法格式:      方法名(参数1,参数2,...);
    2)方法重载:在同一个类中,方法名相同,参数列表不同,与返回值类型无关
单数列表不同: (1)参数个数不同
      (2)参数类型不同


课22:
    1)数组
(1)数组概念:数组是存储同一种数据类型多个元素的集合
      数组既可以存储基本数据类型,也可以存储引用数据类型
(2)数组的定义格式:
格式1:  数据类型[]  数组名;
格式2:  数据类型  数组名[];
    例1: int[] a;       定义一个int类型的数组a变量
    例2: int a[];       定义一个int类型的a数组变量
    注释:效果可以认为是一样的,只是念法区别,推荐第1种
(3)数组的初始化:为数组开辟内存空间,并为数组每个元素赋值
(1)动态初始化:只指定长度,由系统给出初始化值
格式:  数据类型[]  数组名 = new 数据类型[数组长度];
例子:  int[]  arr = new int[3];          定义了一个int类型的数组,这个数组中可以存放3个int类型的值
new分配内存空间
(2)静态初始化:给出初始化值,由系统决定长度
格式:  数据类型[]  数组名 = new 数据类型[]{元素1,元素2,元素3,...};
例子:  int[]  arr = new int[]{1,2,3};    
定义了一个int类型的数组,这个数组中可以存放3个int类型的值,并且值分别为1,2,3
简写方法:  int[]  arr = {1,2,3};           隐含有new


课23:
    1)java程序为了提高程序的效率,就对数据进行了不同空间的分配
具体的是划分了如下5个内存空间  : 
栈 :存放的是局部变量                       局部变量:在方法定义中或者方法声明上的变量都成为局部变量
堆 :存放的是所有new出来的东西
方法区
本地方法区(和系统相关)
寄存器(CPU使用)
栈内存的特点:栈内存的数据用完就释放掉
堆内存的特点:(1)每个new出来的东西都有地址值
     (2)每个变量都有默认值
byte,short,int,long           0
float,double                  0.0
char                          '\u0000'
boolean                       false
引用类型                      null
     (3)使用完毕就变成了垃圾,但是并没有立即回收
  会在垃圾回收器空闲的时候回收
  例如 :清洁工阿姨


课24:
    定义一个数组 :
  int[] arr = new int[3];
  arr[0] = 88;
  arr[1] = 33;
  arr[2] = 66;
  System.out.println(arr);                0x001    内存地址
  System.out.println(arr[0]);             88 
  System.out.println(arr[1]);             33
  System.out.println(arr[2]);             66
    定义第二个数组 :
  int[] arr2 = arr;
  arr2[0] = 100;
  arr2[1] = 200;
  System.out.println(arr);                0x001
  System.out.println(arr[0]);             100
  System.out.println(arr[1]);             200
  System.out.println(arr[2]);             60
结论:栈内存的两个引用指向同一个堆内存空间
     无论是它们谁的操作,都是针对同一个地方


课25:
    1)数组操作常见的两个小问题
ArrayIndexOutOfBoundsException : 访问到了数组中的不存在的索引时发生          (越界)
NullPointerException : 数组引用没有指向实体,却在操作实体中的元素时发生      (空指针)


课26:
    1)数组遍历:就是依次输出数组中的每一个元素
格式:  数组名.length   返回数组的长度
例子:  for(int x=0;x<arr.length;x++){
System.out.println(arr[x]);
}


课27:
    1)思考题:将数组逆序               (reverse  反转)
思路:把0索引和arr.length-1的数据交换,
     把1索引和arr.length-2的数据交换
     ...
     直到做到arr.length-2的时候即可
     for(int x=0;x<arr.length/2;x++){
int temp = arr[x];
arr[x] = arr[arr.length-1-x];
arr[arr.length-1-x] = temp;
     }


课28:
    1)数组元素查找(查找指定元素第一次在数组中出现的索引)
main方法中:     
 int[] arr = {200,250,38,888,444};
 int index = getIndex(arr,250);          我要查找250在这个数组中第一次出现的索引
getIndex(int[] arr,int value)方法中:
 for(int x=0;x<arr.length;x++){
if(arr[x] == value){              只要是判断,就可能是false,所以一定要小心
return x;
}
 }
 return -1;                              如果找不到数据,我们一般返回一个负数即可,而且是返回-1
//改进版:
getIndex(int[] arr,int value)方法中:
 int index = -1;
 for(int x=0;x<arr.length;x++){
if(arr[x] == value){
index = x;
break;
}
 }
 return index;                           返回index


课29:
    1)二维数组:就是元素为一维数组的一个数组
动态初始化:
格式1:  数据类型[][]  数组名 = new 数据类型[m][n];
m:表示这个二维数组有多少个一维数组
n:表示每一个一维数组的元素有多少个
    例题: int[] x,y[];          x是一个一维数组,y是一个二维数组
格式2:  数据类型[][]  数组名 = new 数据类型[m][];
m:表示这个二维数组有多少个一维数组
n列表没有给出,可以动态的给,这次是一个动态的列数
格式3:  数据类型[][]  数组名 = new 数据类型[][]{元素1,元素2,...};
简化版: 数据类型[][]  数组名 = {{元素1,元素2,元素3,...},{元素1,元素2,元素3,...},{元素1,元素2,元素3,...},...};
    2)二维数组的遍历
例子:  int[][] arr = {{1,2,3},{4,5},{6}};
for(int x=0;x<arr.length;x++){
for(int y=0;y<arr[x].length;y++){
System.out.print(arr[x][y]+" ");
}
System.out.println();
}


课30:
    1)打印杨辉三角(行数可以键盘录入)
分析:看这种图像的规律
   (1)任何一行的第一列和最后一列都是1
   (2)从第3行开始,每一个数据是它上一行的前一列和它上一行的本列之和
步骤:
   (1)首先定义一个二维数组,行数如果是n,我们把列数也先定义为n
        这个n的数据来自于键盘录入
   (2)给这个二维数组任何一行的第一列和最后一列赋值为1
   (3)按照规律给其它元素赋值
从第三行开始,每一个数据是它上一行的前一列和它上一行的本列之和
   (4)遍历这个二维数组
 Scanner sc = new Scanner(System.in);
 System.out.println("请输入行数:");
 int n = sc.nextInt();
 int[][] arr = new int[n][n];                定义二维数组
 for(int x=0;x<arr.length;x++){
arr[x][0] = 1;
arr[x][x] = 1;
 }
 for(int x=2;x<arr.length;x++){
for(int y=1;y<=x-1;y++){                                   因为已经限定了首列和末列值为1,
arr[x][y] = arr[x-1][y-1]+arr[x-1][y];             所以y=1,而且x要减1
}
 }
 for(int x=0;x<arr.length;x++){
for(int y=0;y<=x;y++){
System.out.print(arr[x][y]+"\t");
}
System.out.println();
 }


课31:
    1)java中的参数传递问题
基本类型:形式参数的改变对实际参数没有影响(传递时传值)         eg: change(a,b)方法
引用类型:形式参数的改变直接影响实际参数(传递时传地址)         eg: change(arr)方法


课32:
    1)思考题:某公司采用公用电话传递数据信息,数据是小于8位的证书,为了确保安全,
      在传递过程中需要加密,加密规则如下:
  首先将数据倒序,然后将每位数字都加上5,再用和除以10的余数代替该数字
  最后将第一位和最后一位数字交换
  请任意给定一个小于8位的整数,然后把加密的结果在控制台打印出来
(难点是将数据转为数组)
Scanner sc = new Scanner(System.in);
System.out.println("请输入长度不超过8位的数字密码,不能以0开头");
int num = sc.nextInt();
int[] arr = new int[8];
int index = 0;
while(num>0){                           int类型1~9/10 = 0,所以循环条件num>0
arr[index] = num%10;
index++;
num /= 10;
}
for(int x=0;x<index;x++){
arr[x] += 5;
arr[x] %= 10;
}
int temp = arr[0];
arr[0] = arr[index-1];
arr[index-1] = temp;
for(int x=0;x<index;x++){
System.out.print(arr[x]);
}

相关文章

    暂无相关文章
相关栏目:

用户点评