2020-03-17
java的传递都是值传递,不存在对象传递
异常处理try-catch-finally块中,当try或者catch块中出现return语句时,finally块将在方法返回之前被执行
1 | // 调用f(2)无论如何将返回0 |
2020-03-18
- 深拷贝和浅拷贝的区别
二者对基本数据都是值传递。深拷贝和浅拷贝最根本的区别在于是否真正获取一个对象的复制实体,而不是引用。浅拷贝只是产生一个对原来对象的引用,深拷贝是创建一个新的对象(该新对象完全复制原对象)
- 位运算
1 | // 位运算都是取整数的 |
- ArrayList的扩容机制
初始创建的ArrayList并没有容量,直到第一个数据的添加,容量扩大到10,往后每次扩容(添加第11个数据)之后容量都会变为原来的 1.5 倍左右(oldCapacity为偶数就是1.5倍,否则是1.5倍左右)
ArrayList最大可以扩容到Integer.MAX_VALUE - 8
为什么是减去8呢?数组对象有一个额外的元数据,用于表示数组的大小
在添加大量元素前,应用程序可以使用ensureCapacity
操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量
- HashMap可以有一个key为null
- HashMap默认初始容量为16,当HashMap的键值对个数大于容量的75%时扩容为原先的2倍
- 当你指定HashMap大小,HashMap会将它扩充为2的幂次方大小(HashMap总是使用2的幂次方作为哈希表的大小),比如你指定为3,其实他会默认为2^2即4
- HashMap底层采用了数组加链表的形式,java1.8之后,链表长度超过8后转换为红黑树
- ConcurrentHashMap 1.8之前采用的是分段锁,1.8之后采用的是synchronized和CAS
2020-03-19
- 为什么线程调用start()方法会执行run()方法,为什么不能直接调用run()方法
调用start()方法,会启动一个线程并进入就绪状态,当分到它时间片的时候它就会自动执行run()方法。而直接调用run()方法,只会当做一个普通的方法去调用,并不会有多线程工作
2020-03-23
JAVA创建对象的过程
- 类加载检查
- 分配内存
- 初始化零值
- 设置对象头
- 执行init方法
双亲委派模式
在类加载的时候先会判断当前类是否被加载过,被加载过的直接返回,否则才会尝试加载。加载时,先会把请求委派给父类加载器,当父类加载器无法处理时,才由自己处理
- 双亲委派的优点(避免类的重复加载)
- TCP三次握手
2020-03-24
- TCP、UDP的区别
TCP提供面向连接的服务,在传送数据之前需要先建立起连接,数据传输结束后要释放连接。一般用于文件传输、收发邮件
UDP在传送数据之前不需要先建立起连接,远地主机接收到报文后不需要给出确认。一般用于即时通信(语音,视屏,直播等)
浏览器输入url –》 显示页面内容
- DNS解析(根据域名获取对应的IP)
- TCP连接
- 发送HTTP请求
- 服务器接收请求,并返回HTTP响应
- 浏览器根据响应渲染页面
- 连接结束
HTTP从1.1起就是长连接,WebSocket是持久连接
- Cookie和Session的区别
Cookie通过客户端(浏览器)用来保存用户信息(比如帐号二次登陆不用输入账号密码),Session通过服务端记录用户状态(比如用户的购物车)
- linkedList方法中,PollXXX和PeekXXX方法当链表中无数据时,返回null,其他一些方法会抛出异常