X Tutup
Skip to content

Commit 69685ca

Browse files
committed
Java基础修改完毕
1 parent eafe82b commit 69685ca

File tree

4 files changed

+254
-15
lines changed

4 files changed

+254
-15
lines changed

OVERVIEW.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
#### 二、Java基础
88

9-
- [[under editing] Java基础](notes/JavaArchitecture/01%20Java%20基础.md)
9+
- [Java基础](notes/JavaArchitecture/01%20Java%20基础.md)
1010
- [集合框架](notes/JavaArchitecture/02%20Java%20集合框架.md)
1111
- [并发编程](notes/JavaArchitecture/03%20Java%20并发编程.md)
1212
- [IO流](notes/JavaArchitecture/04%20Java%20IO.md)

notes/JavaArchitecture/01 Java 基础.md

Lines changed: 233 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,8 @@ Java面向对象的基本思想之一是封装细节并且公开接口。Java语
376376

377377

378378

379+
##
380+
379381

380382

381383
# 二、面向对象
@@ -384,7 +386,7 @@ Java面向对象的基本思想之一是封装细节并且公开接口。Java语
384386

385387
- **Java的四个基本特性**
386388
- **抽象**:抽象是将一类对象的共同特征总结出来构造类的过程,包括<u>数据抽象</u>和<u>行为抽象</u>两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。 
387-
- ## **继承**:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
389+
- **继承**:继承是从已有类得到继承信息创建新类的过程。提供继承信息的类被称为父类(超类、基类);得到继承信息的类被称为子类(派生类)。继承让变化中的软件系统有了一定的延续性,同时继承也是封装程序中可变因素的重要手段。
388390
- **封装**:通常认为封装是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一切可隐藏的东西,只向外界提供最简单的编程接口。
389391
- **多态**:多态性是指允许不同子类型的对象对同一消息作出不同的响应。
390392
- **多态的理解(多态的实现方式)**
@@ -1154,7 +1156,7 @@ strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字
11541156
- **装箱**:从<u>基本数据类型</u>到<u>封装类型</u>叫做装箱
11551157
- **拆箱**:从<u>封装类型</u>到<u>基本数据类型</u>叫拆箱
11561158

1157-
```
1159+
```java
11581160
jdk 1.5
11591161
public class TestDemo {
11601162
public static void main(String[] args) {
@@ -1166,7 +1168,7 @@ public class TestDemo {
11661168

11671169
​ 上面的代码在jdk1.4以后的版本都不会报错,它实现了自动拆装箱的功能,如果是jdk1.4,就得这样写了
11681170

1169-
```
1171+
```java
11701172
jdk 1.4
11711173
public class TestDemo {
11721174
public static void main(String[] args) {
@@ -1178,7 +1180,7 @@ public class TestDemo {
11781180

11791181

11801182

1181-
## 2. 缓存池
1183+
## 2. ValueOf缓存池
11821184

11831185
`new Integer(123) `` Integer.valueOf(123) `的区别在于,new Integer(123) 每次都会新建一个对象,而 Integer.valueOf(123) 可能会使用缓存对象,因此多次使用 Integer.valueOf(123) 会取得同一个对象的引用。
11841186

@@ -1253,10 +1255,201 @@ Java 还将一些其它基本类型的值放在缓冲池中,包含以下这些
12531255

12541256
因此在使用这些基本类型对应的包装类型时,就可以直接使用缓冲池中的对象。
12551257

1256-
[StackOverflow : Differences between new Integer(123), Integer.valueOf(123) and just 123
1257-
](https://stackoverflow.com/questions/9030817/differences-between-new-integer123-integer-valueof123-and-just-123)
1258+
[StackOverflow : Differences between new Integer(123), Integer.valueOf(123) and just 123](https://stackoverflow.com/questions/9030817/differences-between-new-integer123-integer-valueof123-and-just-123)
1259+
1260+
1261+
1262+
## 3. i++和++i有什么区别【B97】
1263+
1264+
i++是在程序执行完毕后进行自增,而++i是在程序开始执行前进行自增。
1265+
1266+
**i++的操作分三步**
1267+
1268+
1. 栈中取出i
1269+
2. i自增1
1270+
3. 将i存到栈
1271+
1272+
所以i++不是原子操作,上面的三个步骤中任何一个步骤同时操作,都可能导致i的值不正确自增
1273+
1274+
**++i**
1275+
1276+
在多核的机器上,cpu在读取内存i时也会可能发生同时读取到同一值,这就导致两次自增,实际只增加了一次。
1277+
1278+
i++和++i都不是原子操作
1279+
1280+
1281+
1282+
**原子性,**指的是一个操作是不可中断的。即使是在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程打断。
1283+
1284+
1285+
1286+
## 4. 位运算符
1287+
1288+
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
1289+
1290+
下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13
1291+
1292+
A:0011 1100
1293+
1294+
B:0000 1101
1295+
1296+
| 操作符 | 描述 | 例子 |
1297+
| ------ | ------------------------------------------------------------ | ---------------------------- |
1298+
|| 如果相对应位都是1,则结果为1,否则为0 | (A&B)得到12,即0000 1100 |
1299+
| \| | 如果相对应位都是0,则结果为0,否则为1 | (A\|B)得到61,即 0011 1101 |
1300+
| ^ | 如果相对应位值相同,则结果为0,否则为1 | (A^B)得到49,即 0011 0001 |
1301+
|| 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
1302+
| << | 按位左移运算符。左操作数按位左移右操作数指定的位数。左移n位表示原来的值乘2<sup>n<sup>,左移一位乘2 | A << 2得到240,即 1111 0000 |
1303+
| >> | 有符号右移,按位右移运算符。左操作数按位右移右操作数指定的位数。右移一位除2 | A >> 2得到15即 1111 |
1304+
| >>> | 无符号右移,按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
1305+
12581306

1259-
## 3. ++i和i++有什么区别
1307+
1308+
## 5. 原码、补码、反码是什么
1309+
1310+
### 机器数
1311+
1312+
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.
1313+
1314+
比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和 10000011 就是机器数。
1315+
1316+
### 真值
1317+
1318+
因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。
1319+
1320+
例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1
1321+
1322+
### 原码
1323+
1324+
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
1325+
1326+
[+1]原 = 0000 0001
1327+
1328+
[-1]原 = 1000 0001
1329+
1330+
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
1331+
1332+
[1111 1111 , 0111 1111],即:
1333+
1334+
[-127 , 127]
1335+
1336+
原码是人脑最容易理解和计算的表示方式.
1337+
1338+
### 反码
1339+
1340+
反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上, **符号位不变,其余各个位取反**
1341+
1342+
[+1] = [00000001]原 = [00000001]
1343+
1344+
[-1] = [10000001]原 = [11111110]
1345+
1346+
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算。
1347+
1348+
### 补码
1349+
1350+
补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
1351+
1352+
[+1] = [00000001]原 = [00000001]反 = [00000001]
1353+
1354+
[-1] = [10000001]原 = [11111110]反 = [11111111]
1355+
1356+
对于负数, 补码表示方式也是人脑无法直观看出其数值的。 通常也需要转换成原码在计算其数值。
1357+
1358+
1359+
1360+
参考资料:
1361+
1362+
- [原码, 反码, 补码 详解 - ziqiu.zhang - 博客园](http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html)
1363+
1364+
1365+
1366+
## 6. 不用额外变量交换两个整数的值
1367+
1368+
如果给定整数a和b,用以下三行代码即可交换a和b的值
1369+
1370+
```
1371+
a = a ^ b;
1372+
b = a ^ b;
1373+
a = a ^ b;
1374+
```
1375+
1376+
- 假设a异或b的结果记为c,**c就是a整数位信息和b整数位信息的所有不同信息**。比如:a=4=100,b=3=011,ab=c=111
1377+
- a异或c的结果就是b,比如:a=4=100,c=111,a^c=011=3=b
1378+
- b异或c的结果就是a,比如:b=3=011,c=111,b^c=100=4=a
1379+
1380+
说明:位运算的题目基本上都带有靠经验积累才会做的特征,也就是准备阶段需要做足够多的题,面试时才会有良好的感觉。
1381+
1382+
1383+
1384+
## 7. 不使用运算符进行a+b操作
1385+
1386+
- a^b; 得到不含进位之和
1387+
- (a&b)<<1; 进位
1388+
- 只要进位不为零,则迭代;否则返回
1389+
1390+
```java
1391+
public class Solution {
1392+
/*
1393+
* @param : An integer
1394+
* @param : An integer
1395+
* @return: The sum of a and b
1396+
*/
1397+
public int aplusb(int a, int b) {
1398+
1399+
int sum_without_carry, carry;
1400+
sum_without_carry = a^b; //没有进位的和
1401+
carry = (a&b)<<1; //进位
1402+
if(carry==0)
1403+
return sum_without_carry;
1404+
else
1405+
return aplusb(sum_without_carry, carry);
1406+
}
1407+
};
1408+
```
1409+
1410+
1411+
1412+
## 8. &和&& 、|和||的区别?【阿里实习生面试】
1413+
1414+
1415+
​ (1)&&和&都是表示与,区别是&&只要第一个条件不满足,后面条件就不再判断。而&要对所有的条件都进行判断。
1416+
1417+
```java
1418+
// 例如:
1419+
public static void main(String[] args) {
1420+
if((23!=23)&&(100/0==0)){
1421+
System.out.println("运算没有问题。");
1422+
}else{
1423+
System.out.println("没有报错");
1424+
}
1425+
}
1426+
// 输出的是“没有报错”。而将&&改为&就会如下错误:
1427+
// Exception in thread "main" java.lang.ArithmeticException: / by zero
1428+
```
1429+
1430+
- 原因:
1431+
- &&时判断第一个条件为false,后面的100/0==0这个条件就没有进行判断。
1432+
1433+
- &时要对所有的条件进行判断,所以会对后面的条件进行判断,所以会报错。
1434+
1435+
1436+
1437+
(2)||和|都是表示“或”,区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断。 看下面的程序:
1438+
1439+
```java
1440+
public static void main(String[] args) {
1441+
if((23==23)||(100/0==0)){
1442+
System.out.println("运算没有问题。");
1443+
}else{
1444+
System.out.println("没有报错");
1445+
}
1446+
}
1447+
// 此时输出“运算没有问题”。若将||改为|则会报错。
1448+
```
1449+
1450+
- 原因
1451+
- ||判断第一个条件为true,后面的条件就没有进行判断就执行了括号中的代码
1452+
- 而|要对所有的条件进行判断, 所以会报错
12601453

12611454

12621455

@@ -1304,11 +1497,40 @@ Java 还将一些其它基本类型的值放在缓冲池中,包含以下这些
13041497

13051498

13061499

1307-
## 4. 字符串字面量
1500+
## 4. 字面量
1501+
1502+
在编程语言中,字面量(literal)指的是在源代码中直接表示的一个固定的值。 
13081503

1504+
八进制是用在整数字面量之前添加“0”来表示的。 
13091505

1506+
十六进制用在整数字面量之前添加“0x”或者“0X”来表示的
13101507

1508+
Java 7中新增了二进制:用在整数字面量之前添加“0b”或者“0B”来表示的。
13111509

1510+
**在数值字面量中使用下划线**
1511+
在Java7中,数值字面量,不管是证书还是浮点数都允许在数字之间插入任意多个下划线。并且不会对数值产生影响,目的是方便阅读,规则只能在数字之间使用。
1512+
1513+
```java
1514+
public class BinaryIntegralLiteral {
1515+
public static void main(String[] args) {
1516+
System.out.println(0b010101);
1517+
System.out.println(0B010101);
1518+
System.out.println(0x15A);
1519+
System.out.println(0X15A);
1520+
System.out.println(077);
1521+
System.out.println(5_000);
1522+
/**
1523+
* 输出结果
1524+
* 21
1525+
* 21
1526+
* 346
1527+
* 346
1528+
* 63
1529+
* 5000
1530+
*/
1531+
}
1532+
}
1533+
```
13121534

13131535

13141536

@@ -1336,9 +1558,11 @@ Java 还将一些其它基本类型的值放在缓冲池中,包含以下这些
13361558

13371559

13381560

1561+
1562+
13391563
# 七、Object 通用方法
13401564

1341-
## 1.概述
1565+
## 概述
13421566

13431567
```java
13441568
public final native Class<?> getClass()
@@ -1589,10 +1813,6 @@ public class CloneExample implements Cloneable {
15891813

15901814

15911815

1592-
## &和&& 、|和||的区别?【阿里实习生面试】
1593-
1594-
1595-
15961816

15971817

15981818

notes/JavaArchitecture/03 Java 并发编程.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1228,12 +1228,25 @@ public void register(Object o)
12281228

12291229

12301230

1231+
## -----------------------------分割线-----------------------
12311232

12321233

12331234

12341235

12351236

12361237

1238+
1239+
## 从volatile说到,i++原子操作,线程安全问题
1240+
1241+
1242+
1243+
从volatile说到,i++原子操作,线程安全问题 - CSDN博客
1244+
https://blog.csdn.net/zbw18297786698/article/details/53420780
1245+
1246+
1247+
1248+
1249+
12371250
## 附录:参考资料
12381251

12391252
- [Interview-Notebook/Java 并发.md at master · CyC2018/Interview-Notebook](https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Java%20%E5%B9%B6%E5%8F%91.md)
Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,7 @@
1-
### tomcat集群怎么保证同步
1+
## tomcat集群怎么保证同步
2+
3+
4+
5+
6+
7+
## 布隆过滤器

0 commit comments

Comments
 (0)
X Tutup