一、Integer的比较存在的坑
1、Int是基本数据类型,默认是0。Integer是对象,默认是null。
2、Int是基本数据类型,存在常量池。Ingeter对于-128到127之间的数,会进行缓存,Integer num = 127时,会将127进行缓存,超出直接new,用new的是在堆。所以-128到127之间的地址是相同的,都在同一个缓存数组中,超出时会new一个Integer,是一个新的对象了,地址指针不一样,==比较为false。所以,Integer用==比较时,要注意如果值不能确定在[-128,127]的缓存区间,不要使用==比较。
3、Integer继承了Number,它是一个对象,有equals()方法。要防equals类型不一致的问题。
二、八大基本类型数值范围
类型 | 所占空间 | 默认值 | 取值范围、可表示小数位 | 举例说明 |
byte | 8位/1字节 | 0 | 【-128 ~ 127】 | byte b = 10; |
short | 16位/2字节 | 0 | 【-215 ~ 215-1】即【-32,768 ~ 32,767】即正负3万左右 | short s = 10; |
int | 32位/4字节 | 0 | 【-231 ~ 231-1】即【-2,147,483,648 ~ 2,147,483,647】,大概表示正负20亿的范围 | int i = 10; |
long | 64位/8字节 | 0 | 【-263 ~ 263-1】即【-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807】 | long l = 10l; |
float | 4字节 | 0.0 | 6-7位小数 | float f = 10.0f; |
double | 8字节 | 0.0 | 15位小数 | double d = 10.0d; |
char | 16位/2字节 | 空 | 【0 ~ 216-1】即【0 ~ 65535】 | char c = 'c'; |
boolean | 8位/1字节 | false | true、false | boolean b = true; |
BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支持任意精度的整数,也就是说在运算中 BigInteger 类型可以准确地表示任何大小的整数值而不会丢失任何信息。
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double。
三、前端溢出
Number,遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 位,其中1位用来表示符号位,11位用来表示指数,剩下52位表示尾数,就是这个Number.MAX_SAFE_INTEGER,又称为最大安全数,其值为2^53 -1,大于 9007199254740992 的可能会丢失精度
数组的最大长度是2的32次方减1,这个不是指数组只能存2^32-1位数据,也不是说数组的下标最大值就是2^32-1,而是指数组的length属性最大值为2^32-1。
ECMAScript 标准约定number数字需要被当成 64 位双精度浮点数处理,但事实上,一直使用 64 位去存储任何数字实际是非常低效的,所以 JavaScript 引擎并不总会使用 64 位去存储数字,引擎会在内部采用其他内存表示方式,如 32 位。
因此,Number整数的表示范围为 -2^53 ~ 2^53(不包含两端) 。在其他语言,如Java中,Long类型占64位二进制bit,最大值为:9223372036854774807(2^63 - 1)长度约19位。而在Js中,由于Number类型的值也包含了小数,最大值为:9007199254740993(2^53 - 1)长度约16位。因此当Java返回超过16位的Long型字段转为json时,前端Js得到的数据将由于溢出而导致精度丢失。
四、MySQL数据库数据类型
数据类型 | 说明 | 典型声明方式、标准格式 | 范围 |
tinyint | 1字节 | 有符号【-128 ~ 127】,无符号【0 ~ 255】 | |
smallint | 2字节 | 有符号【-32,768 ~ 32,767】,无符号【0 ~ 65535】 | |
mediumint | 3字节 | 有符号【-8,388,608 ~ 8,388,607】,无符号【0 ~ 1677215】 | |
int、integer | 4字节 | 有符号【-2,147,483,648 ~ 2,147,483,647】,无符号【0 ~ 4294967295】 | |
bigint | 8字节 | 有符号【-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807】,无符号【0 ~ 18446744073709551615】 | |
float | 4字节 | float(M,D),表示该值一共显示M位,其中D表示小数点后几位 | |
double | 8字节 | double(M,D),表示该值一共显示M位,其中D表示小数点后几位 | |
decimal | M+2个字节 | decimal(M,D),与浮点型一样处理规则。M的取值范围为0~65,D的取值范围为0~30,而且必须<=M,超出范围会报错。DECIMAL如果指定精度时,默认的整数位是10,默认的小数位为0。NUMERIC等价于DECIMAL。 | |
date | 日期 | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 |
time | 时间 | HH:MM:SS | -839:59:59 ~ 839:59:59 |
datetime | 日期时间 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
year | 年份类型 | YYYY和YY(不推荐) | 1901 ~ 2155 |
timestamp | 时间戳 | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 |
char | 定长字符串 | gender Char(1) | char(M),0<=M<=255 |
varchar | 变长字符串 | email varchar(20) | varchar(M),0<=M<=65535,约2w-6w个字符,受字符集影响 |
text | 文本串 | content text | 约2w-6w个字符,受字符集影响 |
[xxx]blob | |||
[xxx]binary | |||
enum | 2字节 | 最多可以有65,535个成员 | |
set | 包含0~64个成员 |
五、雪花算法(Snowflake)
雪花算法是分布式架构中生成ID的神器,总共由64bit组成,其中1位固定位(始终为0),41位时间戳,10位机器码(高位5bit是数据中心ID,低位5bit是工作节点ID),12位序列号(每个节点每毫秒0开始不断累加,最多可以累加到4095,一共可以产生4096个ID),SnowFlake算法在同一毫秒内最多可以生成的ID数量 = 1024 X 4096 = 4194304。如果并发量超过了400w,可以使用分布式ID生成,例如基于数据库或分布式缓存的方案。这样可以将ID生成的压力分散到多个节点上,提高并发能力。
注意:雪花算法使用41位来表示时间戳,可以支持的时间范围大约为69年(2^41 / (1000 * 60 * 60 * 24 * 365) ≈ 69)。由于雪花算法使用的是以毫秒为单位的时间戳,从1970年开始计算,因此到2049年左右,雪花算法的时间范围将会接近极限。雪花算法会因为时钟回拨出现问题。
六、Java集合
1、Java中集合类存放于java.util包中,主要有3中:set(集)、list(列表包含Queue)、map(映射)
2、Collection(接口)是集合set、list、queue的最基本接口;Iterator(接口)是迭代器,可以通过它遍历集合中的数据;Map(接口)是映射表的基础接口;
Collection | List | ArrayList | 排列有序,可重复;底层使用数组;查询速度快,增删慢,getter()、setter()快;线程不安全;容量不够时,是当前容量*1.5+1; |
Collection | List | LinkedList | 排列有序,可重复;底层使用双向循环链表数据结构;查询慢,增删快,add()、remove()快;线程不安全; |
Collecition | List | Vector | 排列有序,可重复;底层使用数组;查询快,增删慢;线程安全,效率低;容量不够时,默认扩展一倍容量; |
Collecition | List | Stack | |
Collection | Set | HashSet | 排列无序,不可重复;底层使用Hash表实现;存取速度快;内部是HashMap; |
Collection | Set | TreeSet | 排列无序,不可重复;底层使用二叉树实现;排序存储;内部是TreeMap的SortedSet; |
Collection | Set | LinkedHashSet | 采用Hast表存储,并用双向链表记录插入顺序;内部是LinkedHashMap; |
Collection | Queue | 在两端出入的List,所以也可以用数组或链表来实现; | |
Map | HashMap | LinkedHashMap | 键不可重复,值可重复;底层Hash表;线程不安全;运行key为null,value也可以为null; |
Map | HashTable | 键不可重复,值可重复;底层Hash表;线程安全;key,value都不允许为null; | |
Map | TreeMap | 键不可重复,值可重复;底层二叉树; |
七、Redis
1、使用Redis的好处八、JDK
1、JDK 5引入自动装箱、拆箱机制。2、JDK 5引入枚举类型,它是比较特殊的引用类型。
3、JDK 5 以前,switch(expr)中,expr 只能是 byte、short、char、int。 JDK 5开始,Java 中引入了枚举类型,expr 也可以是 enum 类型,JDK 7 开始,expr 还可以是字符串(String),但是长整型(long)在目前所有的版本中都是不可以的。
九、Java 中的关键字用法