java随记
java的初始化
Java的初始化是指在创建对象时为其成员变量设定初值的过程。Java中的所有对象在创建时,其成员变量都会被默认初始化为其对应类型的默认值(如int类型的默认值为0,引用类型的默认值为null)。如果需要对成员变量进行显式初始化,可以通过构造函数、代码块或直接赋值的方式实现。
构造函数是一种特殊的方法,用于在创建对象时执行一些初始化操作。在Java中,每个类都有一个与之同名的构造函数,可以通过这个构造函数来初始化对象的成员变量。如果没有定义构造函数,Java会提供一个默认构造函数,但是默认构造函数不会做任何事情。
除了构造函数,Java还提供了代码块的概念。代码块分为静态代码块和非静态代码块。静态代码块在类加载时执行,非静态代码块在每次创建对象时都会执行。代码块中的语句可以用来初始化成员变量。
java
获得数组的长度使用arr.length
在Java中,数组有一个属性 length,用于表示数组的长度。在本题中,数组 arr 的长度为 10,可以使用
arr.length
来获得数组的长度。注意,这里的 length 不是方法,而是成员变量,因此无需使用括号表示。string.concat()
将两个字符串连在一起,返回新的字符串1
2
3
4String str1 = "Hello";
String str2 = "World";
String str3 = str1.concat(str2);
System.out.println(str3);java什么时候传形参,什么时候传引用?
在Java中,所有基本类型(如 int、double、boolean 等)都是按值传递的,也就是说,在将基本类型作为参数传递给方法时,实际上传递的是该基本类型的值的副本。任何对这个副本的修改都不会影响到原始的基本类型变量。
而对于对象类型,Java传递的则是对象引用的副本。对象引用是一个存储在栈内存中的值,它指向堆内存中的一个对象。当将一个对象作为参数传递给方法时,实际上传递的是该对象引用的副本,也就是说,传递的是一个指向原始对象的副本。这种方式称为按引用传递。
虽然 Java 使用的是按值传递的机制,但因为对象引用传递的实现方式,使得在方法内部可以修改该对象的状态,例如通过调用对象的 setter 方法改变其属性值,或通过调用对象的方法改变其内部状态等。此时,由于传递的是对象的引用,方法内部的修改也会影响原始对象。
需要注意的是,在 Java 中不支持传递引用的方式,如果想要实现类似 C++ 中的传递引用,则需要使用 Java 的封装类型(例如 Integer、Double、Boolean 等)。这些类型都是对象类型,因此在传递这些类型的变量时,实际上是传递了对象引用的副本,因此也可以在方法内部修改其状态。
substring(1,5)
获取字符串中第1个元素到到5前一个元素
构造方法不能是静态的
使用
javac
将java
文件编译成.class
文件使用
java
运行文件java
代码块静态代码块
只在类的加载时执行一次
1
2
3static{
//初始化static 变量
}构造代码块
1
2
3{
//每次类的加载都会执行
}局部代码块
用于限定生命周期
1
2
3
4
5
6public void func{
{
int num;
//限制num的生命周期
}
}同步代码块
确保线程安全
1
2
3
4
5
6
7
8// 同步方法
public synchronized void synchronizedMethod() {
// 同步代码块,保证线程安全
synchronized (this) {
// do something
}
}
}
Math类
abs()
:返回一个数的绝对值。[1]ceil()
:返回大于或等于参数的最小整数,即向上取整。[1]floor()
:返回小于或等于参数的最大整数,即向下取整。[1]round()
:返回四舍五入后的最接近的整数。[1]max()
:返回两个值中较大的那个。[1]min()
:返回两个值中较小的那个。[1]pow(double a, double b)
:返回a的b次幂。[1]sqrt()
:返回一个数的平方根。[1]sin()
:返回一个角度的正弦值。[2]cos()
:返回一个角度的余弦值。[2]tan()
:返回一个角度的正切值。[2]asin()
:返回一个数值的反正弦值(单位为弧度)。[2]acos()
:返回一个数值的反余弦值(单位为弧度)。[2]atan()
:返回一个数值的反正切值(单位为弧度)。[2]exp()
:返回Math.E
(自然对数的底数)的指数。[2]log()
:返回一个数的自然对数(以e为底数)。[2]random()
:返回一个随机数,范围为0到1。[1]
java
使用代码块对static变量进行赋值和直接赋值的区别?执行时机
直接给static变量赋值时,赋值操作会在类加载时执行,也就是说,当 JVM 加载该类时,就会把static变量的初始值存储到内存中。
而代码块则需要等到该类被实例化时才会执行。也就是说,当该类被使用时,代码块中的语句才会执行,从而给static变量赋值。
赋值方式
直接给static变量赋值是一种简单的方式,它可以直接在变量后跟一个等号,然后紧接着赋值的表达式。
而代码块提供了更多灵活的赋值方式,我们可以在代码块中编写任意复杂的逻辑来计算出static变量的值,更加符合面向对象的设计思想。
综合来看,我们可以根据具体的场景选择不同的方式对static变量进行赋值。如果我们需要简单地给变量赋一个常量值,那么可以直接使用赋值操作;如果我们需要进行一些特殊的计算,或者需要依赖其他变量的值来计算static变量的值,那么可以使用代码块来进行赋值。
使用
scanner
输入字符的方法1
2
3
4Scanner scanner = new Scanner(System.in);
System.out.println("请输入一个字符:");
char c = scanner.next().charAt(0);
System.out.println("您输入的字符是:" + c);关于线程
多线程是指将CPU资源按时间片分配到多个任务上,看似并行工作,实质上在同一时刻只有一个线程在工作;在一段时间之内,是多个线程在同时工作。
不含公共类的文件命名
不含公共类的Java源文件的命名可以使用任何合法的标识符来命名,但必须以
.java
文件扩展名结尾。这个文件名称一般会反映该文件中定义的类的用途。在Windows操作系统和Linux操作系统运行的JAVA虚拟机没有什么差别
在 Java 中,
&&
和||
是短路逻辑运算符(short-circuit logical operators),而&
和|
是非短路逻辑运算符(non-short-circuit logical operators)。短路逻辑运算符表示当进行逻辑运算时,如果根据前面的条件可以确定整个表达式的值,后面的条件就不会被判断。例如,对于表达式
A && B
,如果A
的值为false
,则整个表达式的值一定是false
,因此不会再去判断B
的值。同理,对于表达式A || B
,如果A
的值为true
,则整个表达式的值一定是true
,因此不会再去判断B
的值。Java中二维数组既可以表示m行n列的规则数据,也可以表示多行数据,每一行的列数不相同的不规则数组。
java
不定长度1
2
3
4
5
6
7
8public static double average(int... nums) {
int sum = 0;
for (int num : nums) {
sum += num;
}
return (double) sum / nums.length;
}java
栈的相关操作- push(E item):将元素item压入栈顶。
- pop():弹出栈顶元素,并返回该元素。
- peek():返回当前栈顶元素,但不对栈做任何修改。
- empty():测试栈是否为空,如果为空返回true,否则返回false。
- search(Object o):查找元素o在栈中的位置,如果存在返回距离栈顶的位置索引,否则返回-1。
java
枚举enum
用于常量的定义
substring
1
substring(3,4);
左闭右开
从第三个开始,包含第三个,第四个结束不包含第四个
StringBuffer
不能直接给String
赋值,必须使用toString()
常用的Arrays类静态方法有:
- sort方法:对数组进行排序
1
2
3java复制代码int[] nums = {3, 1, 4};
Arrays.sort(nums); // 对nums数组进行升序排序
System.out.println(Arrays.toString(nums)); // [1, 3, 4]- binarySearch方法:在已排序的数组中查找指定元素并返回其下标
1
2
3java复制代码int[] nums = {1, 2, 3, 4};
int index = Arrays.binarySearch(nums, 3); // 在nums数组中查找数字3
System.out.println(index); // 2,即数字3在数组中的下标为2- equals方法:比较两个数组是否相等
1
2
3
4java复制代码int[] a = {1, 2, 3};
int[] b = {1, 2, 3};
boolean isEqual = Arrays.equals(a, b); // 判断a和b数组是否相等
System.out.println(isEqual); // true- fill方法:将数组全部填充为指定值
1
2
3java复制代码int[] nums = new int[5];
Arrays.fill(nums, 4); // 将nums数组全部填充为数字4
System.out.println(Arrays.toString(nums)); // [4, 4, 4, 4, 4]- copyOf方法:复制一个数组的一部分或全部到一个新数组中
1
2
3java复制代码int[] a = {1, 2, 3, 4, 5};
int[] b = Arrays.copyOf(a, 3); // 复制a数组的前3个元素到b数组中
System.out.println(Arrays.toString(b)); // [1, 2, 3]- toString方法:将数组转换为字符串输出
1
2java复制代码int[] nums = {1, 2, 3};
System.out.println(Arrays.toString(nums)); // [1, 2, 3]常用的Character类静态方法有:
- isLetter方法:判断字符是否为字母(大小写均可)
1
2
3java复制代码char c = 'A';
boolean isLetter = Character.isLetter(c); // 判断c是否是字母
System.out.println(isLetter); // true- isDigit方法:判断字符是否为数字
1
2
3java复制代码char c = '5';
boolean isDigit = Character.isDigit(c); // 判断c是否是数字
System.out.println(isDigit); // true- toUpperCase方法:将字符转换为大写字母
1
2
3java复制代码char c = 'a';
char upperCaseC = Character.toUpperCase(c); // 将小写字母c转换为大写字母
System.out.println(upperCaseC); // A- toLowerCase方法:将字符转换为小写字母
1
2
3java复制代码char c = 'B';
char lowerCaseC = Character.toLowerCase(c); // 将大写字母B转换为小写字母
System.out.println(lowerCaseC); // b- isWhitespace方法:判断字符是否为空格字符
1
2
3java复制代码char c = ' ';
boolean isWhitespace = Character.isWhitespace(c); // 判断c是否是空格字符
System.out.println(isWhitespace); // true- isLetterOrDigit方法:判断字符是否为字母或数字
1
2
3java复制代码char c = '+';
boolean isLetterOrDigit = Character.isLetterOrDigit(c); // 判断c是否是字母或数字
System.out.println(isLetterOrDigit); // false如果父类的函数是
private
,则不会被覆盖。即使子类重写这个函数,但是调用的时候依然是父类的文件的读写
使用
scanner
和PrintWrite
- 在使用
scanner
时,使用file
初始化对象
- 在使用
使
FileInputStream
和FileOutputStream