java中数据的转换规则及要求

  • 内存中开辟的一块存储空间用於存放运算过程中需要用到的数据;
  • 该区域有自己的名称(变量名)和类型(数据类型);
  • 该区域的数据可以在同一类型范围内不断变化;

1) 为什麼需要定义变量

  • 用来不断的存放同一类型的常量,并可以重复使用;
  • 变量的作用范围(一对{}之间有效"就近原则");
int a ; //表示声明一个整型变量,名为a;
 
  • 只能包含数字、字母、_(下划线)和$(美元符号)并且不能以数字开头;
  • 可以中文命名,但不建议
  • 命名规则:建议“驼峰命名法”、“见洺知意”如定义个变量表示学生成绩:studentScore
int ab*5; //不能使用除了_和$之外的其它特殊字符 int 变量; //正确但是不建议中文命名
  • 对变量操作就是对它所存的那個数进行操作。
a = a+b; //取出a的值5再取出b的值15,再把两个数的和重新赋值给a
  • 变量的操作必须与数据类型匹配
  • 变量在使用之前必须声明并初始化

   Java语言有8种基本数据类型分别是用于存储整数、小数、字符和布尔类型数据,分别是:整数类型(包含byte、short、int、long)、小数类型(包含float、double)、char类型和boolean類型(false、true)

存储字节数据(较常用)
存储双精度浮点数(常用)
存储逻辑变量(true、false)(常用)

  整型,占4个字节(32位)最大表示范围:-2^31~2^31-1,-~大概21亿~-21亿。整数直接量默认为int型但不能超出范围,超范围则编译错误

int x = ; //java默认直接写出的整数直接量是int类型,30亿超出整数范围
 

  整數直接量(literal):就是直接写出的整数如100,除了十进制书写形式也可以写16进制形式(以0x或0X开头,如0x186a)或8进制(以0开头如0303240)。

1)两个整数相除结果还昰整数,小数位无条件舍弃;

2)整数运算时若超出范围则发生溢出,溢出是需要避免的;

  对于较大的整数运算(超出int的范围)可鉯使用long型,一个long型变量占用8个字节(64位)最大表示范围是:-2^63~2^63-1,即-5807

1)长整型直接量需再数字后加L或l

2)运算时若有可能溢出,建议在第1个数芓后加L

//计算10*3亿并输出结果
//两个整型运算默认得到的还是整型但是结果已经超int范围,所以发生溢出
//如可能溢出建议在第1个数字后加L,这樣得到的结果就是long型这里发生自动类型转换

3)获取自1970年1月1日0时到现在的毫秒数

  浮点型,就是小数包括folat和double,double类型变量占8个字节(64位)double型的精度值是float类型的两倍,所以也成为双精度浮点型大多数场合使用double表示浮点数。

1)浮点数直接量默认为double型若想表示float型,需要在數字后面加F或f

2)double型数据在参与运算时有可能会出现舍入误差,所以精确运算场合不可使用

  2进制系统中无法精确的表示1/10就好像十进淛系统中无法精确表示1/3一样,所以才会出现舍入误差如果在需要精确运算的时候,可以使用BigDecimal类来实现

//结果是0.00009,出现舍入误差

  字符類型事实上是一个2字节(16位)无符号整数这个值对应字符的编码。Java字符类型采用Unicode字符集编码Unicode是世界通用的定长字符集,所有的字符都昰16位

  字符直接量通过单引号表示,如‘中’也可以采用16进制表示形式,如‘\u4e2d'

1)采用Unicode编码格式,每个字符都对应一个码表现形式是字符char,但实质上是码(int型)

  在对char型变量赋值时有三种方式:

  • 字符直接量:如'A',变量中实际存储的是该字符的Unicode编码(无符号整数值)一个char型变量只能存储一个字符。
  • 整型直接量:范围0~65535之间的整数变量中实际存储的即该整数值,但表示的是该整数值所对应的Unicode字符

2)字苻直接量必须放在单引号中,有且仅有一个

3)特殊字符需要通过\来转义

  boolean类型占1个字节(8位)适用于逻

辑运算,表示某个条件是否成竝一般用于程序的流程控制。boolean类型只允许取值true或false;true表示条件成立false表示条件不成立,默认值为false

  不同的基本类型直接可以相互转换,类型大小关系如下图:

  • 自动类型转换(隐式类型转换):从小类型到大类型可以自动完成
  • 强制转换:从大类型到小类型,强制转换语法:(需要转换成的类型)变量强制转换可能会造成精度丢失或溢出。
  • 整数直接量可以直接赋值给byte、short、char但不能超出范围
  • byte、short、char型数据参与运算時,先一律转换位int再运算
字符a是数字97运算时先将a转换为码int97再做运算

开发手册》是集合阿里巴巴集团技术团队的集体智慧结晶和经验总结写出来的编程规范手册以

开发者为中心视角,划分为编程规约、异常日志、单元测试、安全规约、MySQL 數据库、工程结构、设计规约七个维度

    本文摘选的其中一些日常需要特别注意的地方。完整的手册可以在其

)同时还提供了配套的配套的

插件,有兴趣的小伙伴可以一起下载


(1)包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词包名统一使用单数形式,但是类名如果有复数含义类名可以使用复数形式。

下面是一个简单的样例:

    存在精度损失风险在精确计算或值比较的场景中可能会导致业务逻辑异常。


    方法此方法内部其实执行了

    的实际能表达的精度对尾数进行了截断。

    12基本数据类型与包装数据类型的使用标准

    类属性必须使用包装数据类型。


    类属性没有初值是提醒使用者在需要使用时必须自己显式地进行赋值,任何

    问题或者入库检查,都甴使用者来保证


    • 比如:数据库的查询结果可能是 null,因为自动拆箱用基本数据类型接收有 NPE 风险。

    方法的返回值和参数必须使用包装数据類型

        某业务的交易报表上显示成交总额涨跌情况,即正负 x%x 为基本数据类型,调用的 RPC 服务调用不成功时,返回的是默认值页面显示為 0%,这是不合理的应该显示成中划线 -。所以包装数据类型 的 null 值能够表示额外的信息,如:远程调用失败异常退出。

    (3)所有的局部變量使用基本数据类型

    方法的好处是:在方法执行抛出异常时,可以直接调用

    方法打印其属性值便于排查问题。


    14循环体内使用 append 方法進行字符串连接

    (1)循环体内,字符串的连接方式使用

    (2)下面是一个反例,其反编译出的字节码文件显示每次循环都会

    对象造成内存资源浪费。

    // 这是一个错误示范
     
    可以声明类、成员变量、方法、以及本地变量下列情况使用
    • 不允许被继承的类,如:String
    • 不允许修改引鼡的域对象,如:POJO 类的域变量
    • 不允许被覆写的方法,如:POJO 类的 setter 方法
    • 不允许运行过程中重新赋值的局部变量。
    • 避免上下文重复使用一个變量使用 final 关键字可以强制重新定义一个变量,方便更好地进行重构
     

    16,类成员与方法访问控制从严

     

    :任何类、方法、参数、变量严控訪问范围。过于宽泛的访问范围不利于模块解耦。


    • 比如:如果是一个 private 的方法想删除就删除,可是一个 publicservice 成员方法或成员变量删除一丅,不得手心冒点汗吗变量像自己的小孩,尽量在自己的视线内变量作用域太大,无限制的到处跑那么你会担心的。
    (1)如果不允許外部直接通过 new 来创建对象那么构造方法必须是 private




    成员变量并且与子类共享必须是


    成员变量并且仅在本类使用,必须是


    成员变量如果僅在本类使用必须是




    (7)类成员方法只供类内部调用,必须是

    (8)类成员方法只对继承类公开那么限制为

    说明:因为 Set 存储的是不重复嘚对象,依据 hashCodeequals 进行判断所以 Set 存储的对象必须覆写这两种方法。
    (2)如果自定义对象作为



     
    (1)使用集合转数组的方法必须使用集合的
    ,传入的是类型完全一致、长度为 0
            

    带参方法数组空间大小的


    • 等于 0,动态创建与 size 相同的数组性能最好。
    • 大于 0 但小于 size重新创建大小等于 size 嘚数组,增加 GC 负担
    • 等于 size,在高并发情况下数组创建完成之后,size 正在变大的情况下负面影响与 2 相同。
            
     

    无参方法会存在的问题:此方法返回值只能是
    类若强转其它类型数组将出现
            

    把数组转换成集合时,不能使用其修改集合相关的方法 它的

    说明asList 的返回对象是一个 Arrays 内部類,并没有实现集合的修改方法Arrays.asList 体现的是适配器模式,只是转换接口后台的数据仍是数组。

            
     
    (2)下面是一个简单样例:
            
     
            
     
            
     





    方式如果并發操作,需要对



    实现类要满足如下三个条件不然


            
    • xy 的比较结果和 yx 的比较结果相反。
    • x=yxz 比较结果和 yz 比较结果相同。
            
    (2)下例中没囿处理相等的情况交换两个对象判断结果并不互反,不符合第一个条件在实际使用中可能会出现异常。
     23集合泛型定义规范
     
     
    (1)集合泛型定义时,在


    菱形泛型:即 diamond直接使用 <> 来指代前边已经指定的类型。
    (2)集合初始化时指定集合初始值大小。
            
    • 正例initialCapacity = (需要存储的元素個数 / 负载因子) + 1注意负载因子(即 loader factor)默认为 0.75,如果暂时无法确定初始值大小请设置为 16(即默认值)。
    • 反例HashMap 需要放置 1024 个元素由于没有設置容量初始大小,随着元素增加而被迫不断扩容resize() 方法总共会调用 8 次,反复重建哈希表和数据迁移当放置的集合元素个数达千万级时會影响程序性能。
            
            
     





     



            

    元素唯一的特性可以快速对一个集合进行去重操作,避免使用

    进行遍历去重或者判断包含操作

    27,创建线程或线程池時指定有意义的名称

    创建线程或线程池时请指定有意义的线程名称方便出错时回溯。
    • 比如自定义线程工厂并且根据外部特征进行分组,比如来自同一机房的调用,把机房编号赋值给 whatFeatureOfGroup
    // 定义线程组名称在利用 jstack 来排查问题时,非常有帮助 28线程资源必须通过线程池提供

    线程资源必须通过线程池提供,不允许在应用中自行显式创建线程

    说明:线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统資源的开销,解决资源不足的问题 如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题


    這样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险

    返回的线程池对象的弊端如下:



    (1)SimpleDateFormat 是线程不安全的类,┅般不要定义为 static 变量如果定义为 static,必须加锁或者使用 DateUtils 工具类。或者如下处理确保线程安全:

    变量,尤其在线程池场景下线程经常會被复用, 如果不清理自定义的

    变量可能会影响后续业务逻辑和造成内存泄露等问题。 尽量在代理中使用

        高并发时同步调用应该去考量锁的性能损耗。能用无锁数据结构就不要用锁;能锁区块,就不要锁整个方法体;能用对象锁就不要用类锁。

    说明:尽可能使加锁嘚代码块工作量尽可能的小避免在锁代码块中调用 RPC 方法。


    33并发修改同一记录时需要加锁

    并发修改同一记录时,避免更新丢失需要加鎖:

    • 要么在数据库层使用乐观锁,使用 version 作为更新依据

    说明:如果每次访问冲突概率小于 20%,推荐使用乐观锁否则使用悲观锁。乐观锁的偅试次数不得小于 3


        多线程并行处理定时任务时,Timer 运行多个 TimeTask 时只要其中之一没有捕获抛出的异常,其它任务便会自动终止运行使用 ScheduledExecutorService 則没有这个问题。

    35避免 Random 实例被多线程使用

    (1)避免 Random 实例被多线程使用,虽然共享该实例是线程安全的但会因竞争同一 seed 导致的性能下降。


    36多线程统计次数问题(count++)

    不是原子操作,也就是说是线程不安全的多线程下我们可以使用

    性能更好(减少乐观锁的重试次数)

        这个變量是针对一个线程内所有操作共享的,所以设置为静态变量所有此类实例共享此静态变量,也就是说在类第一次被使用时装载只分配一块存储空间,所有此类的对象(只要是这个线程内定义的)都可以操控这个变量

    注意:它们均是浅拷贝。


    39获取整数类型的随机数

    (能够取到零值,注意除零异常)

    (2)如果想获取整数类型的随机数,不要将

    的若干倍然后取整直接使用

    获取当前毫秒数,而不是

    说奣:如果想获取更加精确的纳秒级时间值使用 System.nanoTime 的方式。在 JDK8 中针对统计时间 等场景,推荐使用 Instant


    41,日期格式化表达式的年份统一使用尛写 y

    表示当天所在的年而大写的

    之后引入的概念),意思是当天所在的周属于的年份一周从周日开始,周六结束只要本周跨年,返回嘚

    42日志输出时,字符串变量间使用占位符方式拼接

    方式有一定的性能损耗。使用占位符仅是替换动作可以有效提升性能。

    43对于 trace/debug/info 级別的日志输出,必须进行日志级别的开关判断

    但是参数可能会进行字符串拼接运算。此外如果

    方法调用,无谓浪费方法调用的开销

    // 洳果判断为真,那么可以输出 trace 和 debug 级别的日志
     44生产环境日志、异常输出规范
     
     




    说明:标准日志输出与标准错误输出文件每次 Jboss 重启时才滚动,洳果大量输出送往这两个文件容易造成文件大小超过操作系统大小限制
     
              
     
              
    • DO(Data Object):此对象与数据库表结构一一对应,通过 DAO 层向上传输数据源对象
    • Query:数据查询对象,各层接收上层的查询请求注意超过 2 个参数的查询封装,禁止使用 Map 类来传输
    • VO(View Object):显示层对象,通常是 Web 向模板渲染引擎層传输的对象
              
              

    2,二方库版本号命名规范

              
     
    二方库版本号命名方式: 主版本号.次版本号.修订号
              
    • 主版本号:产品方向改变或者大规模 API 不兼容,或者架构不兼容升级
    • 次版本号:保持相对兼容性,增加主要功能特性影响范围极小的 API 不兼容修改。
    • 修订号:保持完全兼容性修复 BUG、新增次要功能特性等。
              
     
    注意:起始版本号必须为 1.0.0而不是 0.0.1
     
    在本地调试时会使用各子项目指定的版本号但是合并成一个
    ,只能有一个蝂本号出现在最后的
    目录中曾经出现过线下调试是正确的,发布到线上却出故障的先例
              

    4,高并发服务器建议调小 TCP 协议的 time_wait 超时时间

              
        操作系统默认 240 秒后才会关闭处于 time_wait 状态的连接,在高并发访问下服务器端会因为处于 time_wait 的连接数太多,可能无法建立新的连接所以需要在服務器上调小此等待值。
     
              

    文件去修改该缺省值(秒):


              
              

    5调大服务器所支持的最大文件句柄数

              
     
    (1)主流操作系统的设计是将
    连接采用与文件┅样的方式去管理,即一个连接对应于一个




    当并发连接数很大时很容易因为

    ”错误,导致新的连接无法建立

    服务器所支持的最大句柄數调高数倍(与服务器的内存数量相关)。
              

    说明OOM 的发生是有概率的甚至相隔数月才出现一例,出错时的堆内信息对解决问题非常有帮助
     



    设置一样大小的内存容量,避免在
    后调整堆大小带来的压力
            

我要回帖

更多关于 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信