java第一周学习笔记
1. idea的设置
1.1 设置忽略大小写
file–>setting–>Editor–>General–>Code Completion
1.2 编码的设置
1.3 快捷键
1.4 项目的设置
导入或者git一个项目的时候
file–》Project Structure
module的设置,导入项目的时候module没有成功
1.5 折叠包名
1.6 分屏显示
1.7 翻译软件的安装
快捷键 ctrl shift y
2. 数据类型
分类:
基本数据类型 八种
引用数据类型
数值类型的取值范围
char
boolean类型就是true和false
2.1 基本数据类型的转换
自动数据类型的转换
失真的问题
强制类型的转换
快捷键 .cast或者alt+enter解决
表达式类型的提升
3. 键盘录入Scanner
package com.yq.note1;
import java.util.Scanner;
/**
* @author 3307235355@qq.com
* @since 2022/06/12 08:15
*/
public class Demo01 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个整数:");
int num = sc.nextInt();
}
}
注意事项:
当我们需要录入多种数据类型的时候,如果有String的类型,这个时候需要是所有的录入的类型都为nextline(),然后进行类型的转换,示例如下:
package com.yq;
import java.util.Scanner;
public class Test09 {
public static void main(String[] args) {
System.out.println("请依次输入一个int类型、一个string类型、一个double类型");
Scanner sc = new Scanner(System.in);
String num1 = sc.nextLine();
int num11 = Integer.parseInt(num1);
String num2 = sc.nextLine();
String num3 = sc.nextLine();
double num33 = Double.parseDouble(num3);
double sum = num11 + num33;
System.out.println("int+double的结果为:" + sum);
String result = num11 + num2 + num33;
System.out.println(result);
}
}
4. 循环
语法结构
for(初始化语句 ; 条件判断语句; 循环控制语句) {
// 循环体语句
}
初始化语句;
while(条件判断语句){
循环体语句;
(循环控制语句)
}
初始化语句;
do{
循环体语句;
(循环控制语句)
} while(条件判断语句);
死循环
for(;;){
// 循环体
}
while(true){
// 循环体
}
5. 方法总结
方法的实参和形参的区别是什么?
方法重载发生的条件是什么?形参的名字不同能否构成方法的重载?
方法可以没有返回值吗?可以没有返回值类型吗?
方法的返回值类型或者形参类型是double,意味着可以使用什么类型的返回值或实参?(自动类型转换)
1.形参只是占位符,它规定了调用该方法需要传入什么参数。实参才是一个真正的参数。
方法定义时写的参数是形参,方法在调用时写的参数是实参。
2.方法重载的构成就三种形式:
形参数量不同
形参数量相同时,形参的数据类型不同
形参数量和数据类型都相同时,形参的数据类型的顺序不同
特别注意,形参名不同 不构成方法重载。
3.方法可以没有返回值,但必须有返回值类型。用void这个返回值类型描述没有返回值的方法。
4.基本数据类型所有的数值类型都可以传入该方法了。(也就是说除了boolean都可以)
6. 数组
6.1 基本的概念
什么是全限定类名?它的作用是什么?
(一维)数组的声明方式有几种?分别是什么?应该使用哪种方式?
(一维)数组的初始化方式有几种?分别是什么?
数组的优缺点是什么。
1.全限定类名 = 包名 + 类名,它可以唯一的确定一个类。
2.有两种声明方式: 格式一 数据类型[] 数组名; 格式二 数据类型 数组名[];
应该使用格式一。
3.数组的初始化也有两种形式:
静态初始化: 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
动态初始化: 数据类型[] 数组名 = new 数据类型[数组长度];
4.数组的优点是随机访问,访问效率高。缺点是一个数组,长度一旦确定,就不可改变。
数组创建后,还能修改它的长度吗?可以修改元素的取值吗?
动态初始化数组并没有指出数组中元素的具体取值,这时数组可用吗?为什么?请指出各种数据类型数组对象中的元素默认值。
(数组)对象中的元素具有默认值,那么引用(局部变量)具有默认值吗?
数组操作中会碰到哪些异常?是什么原因导致的?
数组遍历方式中,普通for循环和增强for循环有什么不同?它们的使用场景是什么样的?
1.数组对象一旦在堆上创建,除非销毁它,不然长度不可以改变。但是元素取值肯定是可以改变的。
2.可以用,数组对象中的元素具有默认初始化,具有默认值。
堆上对象中的变量具有默认值:
整形(byte、short、int、long)默认值为0
浮点类型(float、double)默认值为0.0
字符类型(char)默认值是'\u0000' 表示编码值为0的字符,一个绝对空字符。
布尔类型(boolean)默认值是false
引用数据类型默认值是null
3.局部变量没有默认值,必须手动初始化赋值才能够使用。
4.数组下标越界异常:访问了不合法的下标。
空指针异常:使用等于null的引用访问/操作对象。
5.普通for循环遍历的是数组的下标且能够修改数组元素,但是普通for语法比较复杂。
增强for循环直接遍历数组元素没有下标,且不能修改数组元素,
但是增强for语法简洁,执行效率高。 有修改元素或者使用下标的需求时,
必须用普通for 其余场景都优先考虑增强for循环。
6.2 jvm 内存模型
为了方便简化交流,以后我们统一称呼JVM运行时内存模型为JVM内存模型。
下面详细解释一下各个区域的用途:
JVM栈(以后简称栈,stack):描述的是Java的(普通)方法执行时的所占内存的内存模型。程序运行时调用方法的代价是:方法中有局部变量需要开辟空间存储,方法的执行过程会产生中间变量,方法执行完毕还需要存储返回地址等等。JVM栈正是Java的(普通)方法执行时所占用的内存空间, 局部变量会直接存储在栈帧中。
于是,方法的执行流程,在JVM内存中,就变成下面这样:
每当Java程序执行一个方法,都会在栈上分配一块只属于该方法的内存区域,称之为栈帧
每当Java程序执行一个方法,都会将一个存储该方法信息的栈帧压入栈中,称之为方法进栈
方法进栈的同时局部变量开辟内存空间存储值,局部变量生效。
当方法执行完毕后,该方法的栈帧随之销毁,称之为方法的出栈
方法栈帧被销毁的同时,局部变量也被销毁,局部变量失效。
注:栈中只有处于栈顶的栈帧才会生效,表示正在执行的方法。称之为当前栈帧,当前方法。
堆(heap):堆是JVM内存中最大的一块,new出来的东西(称之为对象或者实例)都在堆上。 所以new关键字的语义就是:在堆上开辟一片空间给相应的对象。而这片空间(对象)是有内存地址的,这个内存地址是留给外界访问用的。
注:引用数据用比较运算符比较的地址就是这个地址,即比较对象的内存地址。
方法区(method area):面向对象详细讲。
本地方法栈:和JVM栈类似,区别是本地方法栈是给本地(native)方法使用的,而不是普通方法。
程序计数器:JVM执行代码解释执行的,即是一行一行执行字节码的,程序计数器用来记录当前执行的行数。
很明显,在JVM内存模型中,相对比较重要的,和程序的执行联系更紧密的是:堆和JVM栈。堆内存用来存储对象,由于Java是面向对象语言,Java面向对象程序中将会有非常多的对象,所以 堆内存主要决定了Java程序的数据如何存储的问题。而JVM栈用来表示方法的执行流程, 它决定了程序如何执行,或者说如何处理数据。
不管赋值的方式有多少种,对象种元素赋值的第一步永远是——默认初始化,具有默认值。
6.3 可变参数
[修饰符列表] 返回值类型 方法名 (形式参数列表,数据类型... 变量名){
//方法体
}
可变参数一定是在所有形参的后面。
调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。
可以使用foreach进行遍历里边的数据 快捷键 iter
package com.yq.note1;
/**
* @author 3307235355@qq.com
* @since 2022/06/12 08:22
*/
public class Loop {
public static void main(String[] args) {
get(1,3,4,4,4);
}
public static void get(int... num){
for (int i : num) {
System.out.println(i);
}
}
}
6.4 删除数组元素
package homework.day04;
import java.util.Arrays;
/**
* 对于某个String类型数组,将其中的某个元素全部去掉,得到一个新数组,并统计去掉了几个元素。
*
* 举例,对于String数组["abc", "123", "123", "123", "666", "777"] 将其中的元素"123"全部去掉,就得到了新数组["abc","666", "777"],一共去掉了3个元素。
*
* @since 21:12
* @author wuguidong@cskaoyan.onaliyun.com
*/
public class RealDeleteElementDemo {
public static void main(String[] args) {
String[] oldArr = {"123", "456", "789", "123", "123", "666", "777"};
// 获取删除元素后新数组的长度
String target = "123";
int delNum = getDeleteElementNum(oldArr, target);
// 创建新数组
String[] newArr = new String[oldArr.length - delNum];
deleteElement(oldArr, newArr, target);
// 遍历查看新数组
System.out.println(Arrays.toString(newArr));
}
//传入两个数组,删除old数组中的target元素,得到一个新数组
public static void deleteElement(String[] oldArr, String[] newArr, String target) {
// 新数组的下标
int newIndex = 0;
//遍历old数组
for (int i = 0; i < oldArr.length; i++) {
// null元素跳过,避免空指针异常
if (oldArr[i] == null) {
continue;
}
// 找到不是目标元素的元素复制进新数组
if (!oldArr[i].equals(target)) {
newArr[newIndex] = oldArr[i];
//赋值后数组下标+1
newIndex++;
}
}
}
//获取一个数组中目标数据的个数
public static int getDeleteElementNum(String[] oldArr, String target) {
// 计数器
int count = 0;
for (int i = 0; i < oldArr.length; i++) {
// null元素跳过,避免空指针异常
if (oldArr[i] == null) {
continue;
}
if (oldArr[i].equals(target)) {
count++;
}
}
return count;
}
}
7.判断两个字符串类容是否相同
String str1 = null;
String str2 = null;
// 简单朴素的if判断方法
if (str1 != null) {
System.out.println(str1.equals(str2));
} else {
// 既然引用是null了,只有大家都是null才相等
System.out.println(str1 == str2);
}
// 高端的三目运算符
System.out.println((str1 == null) ? (str1 == str2) : (str1.equals(str2)));