JAVA学习笔记1

161 阅读4分钟

主要看的毕老师的视频,day1到day5主要是基本语法的学习

1. JDK和编译器安装

视频里面的内容比较久了,参考意义不大,我是自己百度装的。

2. 运算符

算术运算符:+ , - , * , / , % , ++ , --

1)% 是取余,%的结果的符号和前面的那个数一致。
(2)++,--A:单独使用
		放在数据的前面和后面效果一样。
	B:参与操作使用
		放在数据的前面,先数据变化,再参与运算。
		放在数据的后面,先参与运算,再数据变化。

赋值运算符:=,+=,-=,*=,/=,%=,...

(1)注意:
        int a = 10;
	a += 20;
	值等价于:a = a + 20;
	把左边和右边的结果赋值给左边,并强制转换为左边的类型。

关系运算符:==,!=,>,>=,<,<=

1)注意:
        A:无论表达式简单还是复杂,结果肯定是boolean类型
	B:千万不要把"=="写成"="

逻辑运算符:&,|,^,!,&&,||

1)^:相同false,不同true
    !:偶数个,值不变;奇数个,值相反。
(2)&&具有短路效果,左边为false,右边不执行。
    ||具有短路效果,左边为true,右边不执行。

位运算符:&,|,^,~,>>,>>>,<< 做位运算

1)^的特点:针对同一个数据异或两次,值不变。
    ~的意义:一个数在二进制表示下,所有位全取反,但是计算机以补码形式存储,故(~x) = -(x + 1)
(2)交换两个数数值不通过第三方变量的方式
`   a=a^b;
    b=a^b;
    a=a^b;    `
    或:
`   a=a+b;
    b=a-b;
    a=a-b;    `
(3)请用最有效率的方式计算2乘以8的值:2<<3

三元运算符:

(1)格式:
	关系表达式?表达式1:表达式2;
(2)执行流程:
	A:计算关系表达式的值
	B:如果是true,表达式1就是结果
	  如果是false,表达式2就是结果

3. 键盘输入语句

   (1)导包
           import java.util.Scanner;
    (2)创建键盘录入对象:
           Scanner sc = new Scanner(System.in);
    (3)获取数据
           int i = sc.nextInt();

4. 流程控制

if:三种定义格式

1if(关系表达式){
			语句体;
		}
 (2if(关系表达式) {
			语句体1;
		}else {
			语句体2;
		}
 (3if(关系表达式1) {
			语句体1;
		}else if(关系表达式2) {
			语句体2;
		}else if(关系表达式3) {
			语句体3;
		}
		...
		else {
			语句体n+1;
		}

switch:适用于固定的几个值判断,case后面只能跟常量

  switch(表达式) {
		case1:
			语句体1;
			break;
		case2:
			语句体2;
			break;
		case3:
			语句体3;
			break;
		...
		default:
			语句体n+1;
			break;
	}

while:while循环中的循环体可以一次不执行,do...while循环中循环体至少执行一次。while循环更常用于循环次数不一定

1while语句基本格式
	while(判断条件表达式) {
		语句体;
	}
  (2do...while语句基本格式
	do {
		语句体
	}while(判断条件表达式)

for:

1for(初始条件表达式;判断条件表达式;控制条件表达式) {
		循环体;
	}
  (2)嵌套就不用多说了  

break:跳出循环,常用于switch和循环语句

continue:结束本次循环,开始下次循环

一个小练习:输入一个数,获取其十六进制的表现形式

`import java.util.*;
class iftest1_10to16{
public static void main(String[] args) 
{  //输入数字
    System.out.println("请输入数字:");
    Scanner number = new Scanner(System.in);
    int a = number.nextInt();
   //数制转换
    for(int x = 0;x < 8;x++)
    {
        int n = a & 15;
        if(n>9){
            System.out.println((char)(n-10+'A'));
        }else{
            System.out.println(n);
        }
        a = a >>> 4;
    }
    number.close();
}
} `

5. 方法(函数)

(1)修饰符 返回值类型 方法名(参数类型 参数名1,参数类型 参数名2…) { 函数体; return 返回值; }

(2)void表示不需要返回值

(3)方法需要两个明确,明确返回的值的类型,明确需要的参数

(4)方法的重载:一个类中出现同名函数(方法),参数的个数或者类型不一样

一个重载的小例子:void show (int a,float b, char c)i下列哪些函数和给定函数重载了
a .int show(int x,float y, char z)//没有重载,这个函数不允许和给定函数存在于同一个类中。因为会产生调用的不确定性。
b.void show (float b,int a, char c)//重载了,参数类型不同。
c.void show(int c,float a,char b)//没有重载,和给定函数一样。不允许存在。
d.void show(int a,int b,int c)//重载了,因为类型不同。
e .double show ( )//重载了,因为个数不同。

(5)方法运行时的内存调用:

QQ截图20220415113553.png

方法被调用运行时就进栈(压栈),运行完就出栈(弹栈)

6. 数组

(1)数组的定义(初始化):int可以替换成其他的类型

A:动态初始化 只给长度,不给元素
		int[] arr = new int[3];
B:静态初始化 不给长度,给元素
		int[] arr = new int[]{1,2,3}

(2)java对内存空间的划分:栈,堆,方法区,本地方法区,寄存器

栈内存:存储都是局部变量。只要是在方法中定义的变量都是局部变量。一旦变量的生命周期结束该变量就被释放。
堆内存:存储都是实体(对象)。每一个实体都有一个首地址值。
      堆内存的变量都有默认初始化值。不同类型不一样。int-0 double-0.0 boolean-false char-'\uOo000
      当实体不在使用时,就会被垃圾回收机制处理。|

数组的内存图解:

QQ截图20220415142840.png

(3)两个常见小问题:数组越界,空指针异常(注意一下就行了)

(4)数组的应用练习记录:进制转换通用版,用查表法

`  public static String trans(int num,int base,int offset)
{
    char[] arr = new char[]{'0','1','2','3','4','5',
                            '6','7','8','9','A',
                            'B','C','D','E','F'};//查表法
    
    char[] array = new char[8];
    int index = array.length-1;

    for(int x = 0;x < 8;x++)//进制转换,base是需要转换到几进制就是几
    {
        int n = num & (base - 1);
        array[index] = arr[n];
        num = num >>> offset;//移位,转二进制是1,转八进制是3,转十六进制是4
        index--;
    }
    return toStr(array);//自己定义的一个转换数组为字符串的方法,调用了一下
}  `

(5)一些算法:

选择排序:遍历数组找到最小(大)的放在首位,然后遍历剩下的,再找到最小(大)的, 放在第二位,直到最后排序完成

`public static String select_So(int arr[]){
    //int temp = 0;
    for(int x=0;x< arr.length-1;x++){
        for(int y = x+1;y < arr.length;y++){
            if (arr[x]>arr[y]){
                /*temp = arr[x];
                arr[x] = arr[y];
                arr[y] = temp;
                */
                swap(arr,x,y);//将交换元素的代码抽取成一个方法
            }  
        }
    } 
    return toStr(arr);
}`

冒泡排序:重复地走访过要排序的元素列,依次比较两个相邻的元素, 如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。 走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

` public static String bubble_So(int arr[]){
    for(int x=0;x< arr.length-1;x++){
        for(int y = 0;y < arr.length-1-x;y++){
            if (arr[y]>arr[y+1]){
                swap(arr,x,y);
            }  
        }
    } 
    return toStr(arr);  `

二分查找:

`  public static int binarysearch (int [ ] arr,int key){
//1,定义三个变量,记录头角标,尾角标,中间角标。
int max, min, mid ;
min =0;
max=arr.length-1;
while (min<=max){
mid =(min+max) >>1;if(key>arr [mid] )min = mid + 1;else if (key<arr [mid])
max = mid - 1;else
return mid;
}
return -1;
}`

往一个有序数组中插入一个元素并继续保证有序,并且获取它的位置(要用二分查找)(有点难)

` import java.util.Arrays
int [ ] arr ={9,13,17,22,31,46,58,77);
int index = binarysearch (arr, 7) ;
int index2 = Arrays . binarysearch (arr,7);
system . out . println ( "index="+index) ;
system . out . println ( "index2="+index2) ;`

7. 学习总结

(1)写代码之前思路要清楚,可以写下来。

(2)注意代码的复用性。

(3)学会写注释