一、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;
long转int这种,大数据类型转小数据类型,可能会发生溢出,所以要避免这种。
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的好处
①速度快,因为数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是 O1)。
②支持丰富数据类型,支持string(字符串),hash(哈希),list(列表),set(集合), zsetsorted set(有序集合)等。
③支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行。
④丰富的特性:可用于缓存,消息,按 key 设置过期时间,过期后将会自动删除。
2、Redis是单进程单线程的
3、一个字符串类型的值能存储最大容量是512M
4、Redis 提供 RDB 和 AOF 两种持久化机制
5、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)在目前所有的版本中都是不可以的。 
4、JDK 5 中引入StringBuilder 。
5、JDK 1.8及以前String使用的是char数组,JDK 1.9及以后使用的是byte数组。

九、Java 中的关键字用法

1、【final】①修饰类:表示该类不能被继承;②修饰方法:表示方法不能被重写;③修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。

  

 

posted on 2023-06-29 11:21  twm7512  阅读(41)  评论(0编辑  收藏  举报