1、
基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE= -2147483648 (-2的31次方)
最大值:Integer.MAX_VALUE= 2147483647 (2的31次方-1)
2、
基本类型:short 二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768 (-2的15此方)
最大值:Short.MAX_VALUE=32767 (2的15次方-1)
3、
基本类型:long 二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808 (-2的63次方)
最大值:Long.MAX_VALUE=9223372036854775807 (2的63次方-1)
4、
基本类型:float 二进制位数:32
包装类:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45 (2的-149次方)
最大值:Float.MAX_VALUE=3.4028235E38 (2的128次方-1)
5、
基本类型:double 二进制位数:64
包装类:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324 (2的-1074次方)
最大值:Double.MAX_VALUE=1.7976931348623157E308 (2的1024次方-1)
装箱,拆箱的定义
基本数据类型 | 包装器类 |
---|---|
int(4Byte) | Integer |
byte(1) | Byte |
short(2) | Short |
long(8) | Long |
float(4) | Float |
double(8) | Double |
char(2) | Char |
boolean(1字节) | Boolean |
细节注意:Integer的Valueof方法中调用了一个IntegerCache的静态类。静态类中针对数值为-128~127范围内的数据,返回指向IntegerCache.cache中已经存在的对象的引用;否则创建一个新的Integer对象。
new出来的对象肯定不等;(new Integer(1)!=new Integer(2))
自动装箱的可能相等(Integer c =1;Integer d =1 -> c==d true)
Boolean包装器valueOf方法中直接定义了TRUE和FALSE的两个静态成员变量(存于方法区),所以无论怎么new都是指向同一个
基本类型和包装类型的区别
Java学习笔记(六)–包装类、基本类型、拆箱、装箱:https://blog.csdn.net/zh15732621679/article/details/79623414
深入剖析Java中的装箱和拆箱: http://www.cnblogs.com/dolphin0520/p/3780005.html
1、String是字符串常量,StringBuffer和StringBuilder都是字符串变量。后两者的字符内容可变,而前者创建后内容不可变。
2、String不可变是因为在JDK中String类被声明为一个final类。
3、StringBuffer是线程同步且安全的(用synchronized修饰),而StringBuilder是非同步且非线程安全的。
4.执行速度:StringBuilder > StringBuffer > String(String为常量不可更改所以最慢)
ps:线程安全会带来额外的系统开销,所以StringBuilder的效率比StringBuffer高。如果对系统中的线程是否安全很掌握,可用StringBuffer,在线程不安全处加上关键字Synchronize。
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
Tips:
StringBuilder(“null”).append(“abc”).toString();
4.1四种创建方式
public class MyRunnable extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
}
2.实例化一个Thread对象,并传入自己的MyRunnable实例
MyRunnable myr = new MyThread();
Thread thread = new Thread(myr);
thread.start();
3.事实上,当传入一个Runnable target参数给Thread后,Thread对象的run()方法就会调用target.run():jdk源码
public void run() {
if (target != null) {
target.run();
}
}
Tips1:通过继承Thread类创建和实现Runnable接口创建有什么区别
继承Runnable接口的3个优势:
Tips2:线程中run和start方法的区别
调用start()方法后不会立刻执行,线程会被放到等待队列,等待CPU调度,线程进入就绪状态;调用run()方法后,直接执行线程的线程体(即run方法)。调用start()的原因是为了真正实现多线程运行
java Future接口介绍:https://blog.csdn.net/liutong123987/article/details/79377764
Java并发编程:Callable、Future和FutureTask原理解析:https://blog.csdn.net/codershamo/article/details/51901057
JAVA多线程实现的四种方式(该篇重点看线程池)
https://www.cnblogs.com/felixzh/p/6036074.html
4.2各自使用场景(?自己想的不一定对)
Thread:继承父类
Runable:对同一资源进行多线程竞争;类已经extends某个父类不能够继承Thread
Callable:要求有返回值
Pool:一个应用中多次使用线程,需要对线程进行统一管理,对线程有多种约束
public ThreadPoolExecutor(int corePoolSize, //核心线程数,即使不被使用也不收回
int maximumPoolSize, //线程中可容纳的最大线程数
long keepAliveTime, //针对非和新县城来说,可以在贤臣池中存活的最长时间
TimeUnit unit, //计时单位
BlockingQueue workQueue, //等待队列,任务可以存储在等待队列中等待被执行(FIFO)
ThreadFactory threadFactory, //船舰现成的工厂
RejectedExecutionHandler handler)//拒绝策略
线程池的操作流程:
四种常见的线程池:
1.CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。2.SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。
3.SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。
4.FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程
使用线程池的好处
1.使用new Thread的弊端:
2.使用线程池的好处:
(1)ConcurrentHashMap对整个桶数组进行了分割分段(Segment),然后在每一个分段上都用lock锁进行保护,相对于HashTable的syn关键字锁的粒度更精细了一些,并发性能更好,而HashMap没有锁机制,不是线程安全的。
(2)HashMap的键值对允许有null,但是ConCurrentHashMap都不允许。
Java集合——HashMap、HashTable以及ConCurrentHashMap异同比较:https://www.cnblogs.com/zx-bob-123/archive/2017/12/26/8118074.html
面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别:https://www.cnblogs.com/heyonggang/p/9112731.html
《Java线程池》:任务拒绝策略 :https://www.cnblogs.com/zhangtan/p/7607321.html
MySQL数据库优化的八种方式(经典必看):https://blog.csdn.net/zhangbijun1230/article/details/81608252
数据库SQL优化大总结之 百万级数据库优化方案:https://www.cnblogs.com/yunfeifei/p/3850440.html
MySQL优化技术——20条建议:https://blog.csdn.net/qq_37939251/article/details/83022638
MYSQL 八大优化方案: https://blog.csdn.net/liuyanqiangpk/article/details/79827239
数据库优化一般思路(个人经验之谈):https://blog.csdn.net/zhoupan301415/article/details/78257783
java把内存划分为两种:堆内存和栈内存。
在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
1.栈内存存储的是局部变量而堆内存存储的是实体;
2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;
3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。
Java堆和栈的区别,JVM堆和栈的介绍:https://blog.csdn.net/qq_41675686/article/details/80400775
网络是不可靠的,有可以最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文。在Client发送出最后的ACK回复,但该ACK可能丢失。Server如果没有收到ACK,将不断重复发送FIN片段。所以Client不能立即关闭,它必须确认Server接收到了该ACK。Client会在发送出ACK之后进入到TIME_WAIT状态。Client会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。所谓的2MSL是两倍的MSL(Maximum Segment Lifetime)。MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
下面这个连接包括具体建立连接和释放连接的流程以及常见面试题
TCP的三次握手与四次挥手理解及面试题(很全面):https://blog.csdn.net/qq_38950316/article/details/81087809
Tips:为什么建立连接要三次握手
Tcp为什么是三次握手而不是两次:https://blog.csdn.net/lengxiao1993/article/details/82771768
封装:将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问。
继承:类与类的一种关系,是一种**“is a”**的关系。比如“狗”继承“动物”,这里动物类是狗类的父类或者基类,狗类是动物类的子类或者派生类。
多态:多种形态(比如接口的多种不同实现方式)
java中多态的两种表现
JAVA基础——面向对象三大特性:封装、继承、多态 :https://www.cnblogs.com/hysum/p/7100874.html
产生死锁的原因
竞争资源
进程间顺序的非法推进
死锁发生条件
解除死锁
预防死锁
检测死锁
首先为每个进程和每个资源指定一个唯一的号码; 然后建立资源分配表和进程等待表。
避免死锁
1、申请的贷款额度不能超过银行现有的资金总额
2、分批次向银行提款,但是贷款额度不能超过一开始最大需求量的总额
3、暂时不能满足客户申请的资金额度时,在有限时间内给予贷款
4、客户要在规定的时间内还款
银行家算法——概念和举例:https://blog.csdn.net/wyf2017/article/details/80068608
死锁面试题集合:https://blog.csdn.net/hd12370/article/details/82814348
进程线程通信的区别:https://www.cnblogs.com/xh0102/p/5710074.html
什么是线程?线程的优缺点和使用场景:https://blog.csdn.net/ffsiwei/article/details/81230374
17.tcp,udp特点,区别,应用场景(×2)
18.hashmap技术细节(×2)
19.java垃圾回收机制,怎么排查
19.1.gc了解多少/CMS工作步骤/CMS优缺点
20.Java如何使用线程?重写Run方法和实现Runable接口有什么不同?
21.如何进行线程管理
22.设计模式的了解(手写双重检查锁的单例模式 )
23.http和https的区别
24.详细讲一下浏览器输入网址到显示出网页的全部网络交互过程
25.线程池设计思路
26.消息队列概念及使用
27.一个100G的文件里,记录了不重复的数字,只给单台1G内存的主机,如何快速的查找某一个数字。
多线程分片:分多少片?
问题升级一下,这个数据集内数字可重复,找出重复次数最多的
28.画出线程的状态之间的转化
29.冒泡排序
30.new一个对象jvm内存区域的情况
31.sql注入在ssm框架里如何解决
32.cookie,session
33.tcl了解吗
34…线程池参数/调优/无界阻塞队列/和阻塞队列put、offer、add三种方法有何区别(就是是否阻塞,会不会抛出异常)
35.b+树的结构,说说插入元素操作如何进行,还提了一下叶子节点的连接
36.二叉树前序遍历
37.迭代器的实现?
38.深拷贝浅拷贝
39.类的继承,具体问的啥忘了,super的用法吧好像
40.除了修改构造函数,还能通过什么方法编辑一个类的属性?(当时心里mmp这啥问题,现在觉得大概是想让我说 @property或者slots)
41.数据库事务
42.双向链表实现
43.生产消费者模式(多线程)
44.String的底层hashcode怎么写的
45.-6的补码多少
46.看了那些源码(hashmap,string的equals)
47.多线程原理
synchronized,volatile
Java中成员变量、局部变量、全局变量、静态变量存在位置及初始化:https://blog.csdn.net/sophia__yu/article/details/83578934
.