运算符 &和&&、 |和||的区别吗?
& 按位与操作
只有对应的两个二进制数为1时,结果位才为1
1&1=1
1&0=0
0&1=0
0&0=0
| 按位或操作
有一个为1的时候,结果位就为1
1|1=1
1|0=1
0|1=1
0|0=0
& 和 && 都可以实现 和 这个功能
区别:& 两边都运算,⽽而 && 先算 && 左侧,若左侧为false 那么右侧就不不运算,判断语句句中推荐使⽤用 &&,效率更更⾼高
| 和 || 和上⾯面类似
区别:||只要满⾜足第一个条件,后⾯面的条件就不不再判断,⽽而|要对所有的条件进⾏行行判断
把&&和||称之为短路路运算符
用最有效率的方法计算2乘以8
原理:将一个数左移n位,相当于乘以2的n次方,位运算是CPU直接支持的,所以效率高
答案:2<<3
常见的JDK源码里面HashMap的默认容量16
int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
直接是二进制操作了了,表示1左移4位,变成10000,转为10进制也就是16, 直接以二进制形式去运⾏行行,
效率更更⾼高
写个方法,传递两个非0的int数值进去,实现变量量交换的方式,有几种方式?
-
方式一
public static void swag(int a, int b) { System.out.println("a="+a+",b="+b); a = a + b; b = a - b; a = a - b; System.out.println("a="+a+",b="+b); }
-
方式二 异或运算(一个数与另一个数异或两次是其自身,一个数和自身异或结果是0)
public static void swap2(int a, int b) {
System.out.println("a=" + a + ",b=" + b);
a = a ^ b; //a1 = a^b
b = b ^ a; // b = b^a^b 此处a与b异或两次,最终结果是a
a = a ^ b; // a = a1^b = a^b^a 此处b与a异或两次,最终结果是b
System.out.println("a=" + a + ",b=" + b);
}
javase基础语法篇之类型
简介:java数据类型花费
java的数据类型分类
- 基础数据类型:
四类 | 八种 | 字节数 | 默认值 | 封装类 |
---|---|---|---|---|
整型(精确) | byte | 1 | (byte)0 | Byte |
整型(精确) | short | 2 | (short)0 | Short |
整型(精确) | int(默认) | 4 | 0 | Integer |
整型(精确) | long | 8 | 0L | Long |
浮点型(不精确) | float | 4 | 0.0f | Float |
浮点型(不精确) | double(默认) | 8 | 0.0d | Double |
字符型 | char | 2 | \u0000(null) | Character |
布尔型 | boolean | 1 | false | Boolean |
- 引用数据类型:其他都是应用类型
- String和Enum分别是什么类型:引用类型
运算
定义变量 int i = 5;
return i++; 和return ++i; 返回结果是什么
答:分别是6 、 5
==和equals的区别
- 基本数据类型比较 要用==判断是否相等
- 引用数据类型: ==比较的是内存地址是否一样,不同对象的内存地址不一样,equals比较的是具体的内容,也可以让开发者去定义什么条件去判断两个对象是否一样
try-catch-finall执行顺序
下面代码 的try-catch-finally语句句,try里面有个return, finally里面也有个return,结果会返回什么?为什么
public static int test1() {
int a = 1;
try {
System.out.println(a / 0);
a = 2;
} catch (ArithmeticException e) {
a = 3;
return a;
} finally {
a = 4;
}
return a;
}
public static int test2() {
int a = 1;
try {
System.out.println(a / 0);
a = 2;
} catch (ArithmeticException e) {
a = 3;
return a;
} finally {
a = 4;
return a;
}
}
解答:
在执行try、catch中的return之前一定会执行finally中的代码(如果finally存在),如果finally中有return语句,就会直接执行finally中的return方法,所以finally中的return语句一定会被执行的
执行流程:finally执行前的代码里面有包含return,则会先确定return返回值,然后再执行c'sfinally的代码,最后再执行return
try-with-resource
有了解新版的JDK处理IO流吗?编写下基础代码, 从⼀个txt⽂文本里面,拷贝里面的内容到另外一个txt文本里面
JDK7之后的写法,JDK9又进行了改良,但是变化不大,记住下面的写法即可
需要关闭的资源只要实现了java.lang.AutoCloseable,就可以⾃自动被关闭
try()里面可以定义多个资源,它们的关闭顺序是最后在try()定义的资源先关闭
try (
FileInputStream fis = new FileInputStream("/Users/xdclass/Desktop/test.txt");
BufferedInputStream bis = new BufferedInputStream(fis);
FileOutputStream fos = new
FileOutputStream("/Users/xdclass/Desktop/copy.txt");
BufferedOutputStream bos = new BufferedOutputStream(fos);
) {
int size;
byte[] buf = new byte[1024];
while ((size = bis.read(buf)) != -1) {
bos.write(buf, 0, size);
}
} catch (Exception e) {
e.printStackTrace();
}
文件API和递归考察
代码编写需求: 找出某目录下的所有子目录以及子文件并打印到控制台上
public static void main(String[] args) {
//找出某目录下的所有子目录以及子文件并打印到控制台上
List<String> paths = new ArrayList<>();
getAllFilePaths(new File("G:\\网盘下载"), paths);
for (String path: paths){
System.out.println(path);
}
}
private static void getAllFilePaths(File filePath, List<String> paths) {
//把该目标所有的目录/文件列出来
File[] files = filePath.listFiles();
if (files == null) {
return;
}
for (File f : files) {
//如果是一个目录
if (f.isDirectory()) {
paths.add(f.getPath());
getAllFilePaths(f, paths);
} else {
paths.add(f.getPath());
}
}
}