基本功能
Long 类在对象中包装了基本类型 long 的值 每个 Long 类型的对象都包含一个 long 类型的字段 |
static long MAX_VALUE | long 8个字节 最大值2^63-1 十六进制: 0x8000000000000000L |
static long MIN_VALUE | 最小值-2^63 十六进制: 0x7fffffffffffffffL |
static int SIZE | 二进制补码形式表示值时的位数 @Native public static final int SIZE = 64; 8个字节就是64位 |
static Class<Long> TYPE | 表示基本类型 long 的 Class 实例 |
方法分类
实例方法
构造方法 可以通过long或者String构造
![image_5b974562_3c47[6]](https://i-blog.csdnimg.cn/blog_migrate/1ab6b96e123c24e4d37b52e3ae7190f9.png) 字符串参数形式的方法, 内部调用parseLong![image_5b974562_37a5[6]](https://i-blog.csdnimg.cn/blog_migrate/2475b651da01a4c98eea7defe32bac65.png) | java.lang.Long.Long(long) java.lang.Long.Long(String) |
获取指定类型的值 直接返回强转形式 比如: (byte)value (short)value ...... | java.lang.Long.byteValue() java.lang.Long.shortValue() java.lang.Long.intValue() java.lang.Long.longValue() java.lang.Long.floatValue() java.lang.Long.doubleValue() |
对象常规方法 toString依赖静态方法 static String toString(long i) hashCode 依赖静态方法 hashCode static int hashCode(long value) equals 比较内部值是否相同
![image_5b974562_221c[6]](https://i-blog.csdnimg.cn/blog_migrate/1499cbfcb918ebe3d2325963e4733ead.png) compareTo 依赖静态方法static int compare(long x, long y) | java.lang.Long.toString() java.lang.Long.hashCode() java.lang.Long.equals(Object) java.lang.Long.compareTo(Long) |
此系列都是获取指定系统属性的long值相关 第一个参数是通过 System.getProperty(java.lang.String) 方法可以访问到的系统属性的名称 以 long 值的形式解释此属性的字符串值,并返回表示此值的 Long 对象 也就是说参数String为一个系统属性的字符串名称 如果指定名称没有属性,或者指定名称为空或 null,抑或属性不具有正确的数字格式时,则返回 null 并不是转换解析字符串为Long,并不是转换解析字符串为Long,并不是转换解析字符串为Long, | java.lang.Long.getLong(String) java.lang.Long.getLong(String, long) java.lang.Long.getLong(String, Long) |
由上面实例方法的依赖性也可以看得出来,Long类本身静态方法的强大
静态工具方法
toXXXString就是转换为String形式 具体的XXX是什么就是转换为 什么 toString(long, int)转换为指定进制表示的字符串形式,toString(long)为简化版默认十进制 | toString(long) toString(long, int) |
toUnsignedString(long, int)转换为指定进制表示的无符号整数的字符串形式 toUnsignedString(long)为简化版默认十进制 | toUnsignedString(long, int) toUnsignedString(long) |
以十六进制无符号整数形式返回 long 参数的字符串表示形式 以八进制无符号整数形式返回 long 参数的字符串表示形式 以二进制无符号整数形式返回 long 参数的字符串表示形式 | toHexString(long) toOctalString(long) toBinaryString(long) |
parseLong 都是将字符串解析为long, 基本类型! parseLong(String, int)将 string 参数解析为第二个参数指定进制形式的有符号的 long parseLong(String)为简化形式,默认十进制 parseUnsignedLong是parseLong的无符号形式 类似,双参数指定基数进制,单参数默认十进制 使用时需要注意,对应基数(进制)的转换,需要对应的字符,比如十进制你就不能出现十六进制的A | parseLong(String, int) parseLong(String) parseUnsignedLong(String, int) parseUnsignedLong(String) |
valueOf都是将字符串解析为Long, 包装类型 但是,在-128~127之间会使用缓存的值,不在范围内的创建新对象 所以,除非有必要特意创建对象,否则应该使用这个来获取Long对象 valueOf(String, int) 转换指定基数的字符串为Long, valueOf(String)为他的十进制形式 | valueOf(String, int) valueOf(String) valueOf(long) |
![image_5b974562_3976[6]](https://i-blog.csdnimg.cn/blog_migrate/f8199beee44848da5c2de92d1812a449.png) | hashCode(long) |
对于基本类型long的求和 和 大小比较,返回符合条件的long | sum(long, long) max(long, long) min(long, long) |
![image_5b974562_69db[6]](https://i-blog.csdnimg.cn/blog_migrate/11517d3cf310c2779c67440fdf637acd.png) 可以直接将指定形式的字符串进行解析 根据字符串的前缀进行自动匹配 然后,返回一个Long | decode(String) |
比较大小与无符号比较大小
![image_5b974562_4543[6]](https://i-blog.csdnimg.cn/blog_migrate/17860ab2d47615d0696252d432f15a02.png) 无符号的先转换下,然后调用compare![image_5b974562_3d77[6]](https://i-blog.csdnimg.cn/blog_migrate/aca944facf1ba95be37060ba4306ac82.png) | compare(long, long) compareUnsigned(long, long) |
无符号的商与求余 | divideUnsigned(long, long) remainderUnsigned(long, long) |
返回符号 如果指定值为负,则返回值 -1 如果指定值为零,则返回 0 如果指定值为正,则返回 1 | signum(long) |
reverse表示翻转,翻转就是从前往后颠倒过来 逐个比特进行翻转 或者逐个字节(也就是8位为一个单位)进行翻转 看下图就很容易理解 188的二进制 1011 1100 ![image_5b974562_502[6]](https://i-blog.csdnimg.cn/blog_migrate/53e8f0211d5518c1afb7eff70fbc6b4b.png) | reverse(long) reverseBytes(long) |
rotate表示循环移位 循环左移和循环右移 移位负数距离等同于另一个方向的移位 | rotateLeft(long, int) rotateRight(long, int) |
api解释比较抽象,直白的说就是二进制补码序列中 选择从左边开始数(高位)第一个1 或者从右边开始数(低位)第一个1 其余的位置全都写0 所以,对于highestOneBit 如果是0 返回0 ,因为没有一个1 如果是负数,返回的就是最左边一位是1 其余全都是0 也就是Long的最小值 如果是正数,第一位就是原来的最高位,但是抹掉了所有的零头,就是小于等于这个数的第一个2的N次方 对于highestOneBit 如果是0 返回0 否则返回的将是2的N次方 形如1 ....n个零 | highestOneBit(long) lowestOneBit(long) |
与highestOneBit 和 lowestOneBit,本质是互通的,找到了1的位置也就知道了0的个数 知道了0的个数,也就找到了1的位置 返回的是这两个位置的地方,左边和右边的零的个数 | numberOfLeadingZeros(long) numberOfTrailingZeros(long) |
返回二进制补码形式下1的个数![image_5b974562_6f98[6]](https://i-blog.csdnimg.cn/blog_migrate/25cdafea27f291e7e345a2f8a3bcc2c6.png) | bitCount(long) |
特别注意:
value of 与new Long
valueOf就是根据指定的long或者String 返回一个Long对象
java.lang.Long.valueOf(long)是根本方法
![image_5b974562_3723[6]](https://i-blog.csdnimg.cn/blog_migrate/61008246589a47f78b7cda15c7e46f1f.png)
可以看得出来,他会使用LongCache缓存256个对象(0~255)
静态内部类,使用的时候,static块中初始化
![image_5b974562_29c9[6]](https://i-blog.csdnimg.cn/blog_migrate/b2a1bb10c2d8338d3b34fd07786e7823.png)
java.lang.Long.valueOf(String, int)是借助于parseLong进行转换
![image_5b974562_1875[6]](https://i-blog.csdnimg.cn/blog_migrate/31336f17a2306afba29a0da0e0902b33.png)
java.lang.Long.valueOf(String)是他的默认的十进制形式的
![image_5b974562_5147[6]](https://i-blog.csdnimg.cn/blog_migrate/709db6823094fb54fe8fc204d69b8622.png)
简言之就是最核心是valueOf(long),在指定范围内他是有缓存的,不在指定范围内,那么将会创建对象 所以,如果可以,尽量不要使用new Long |
parseLong
从valueOf看得出来,带参数的借助的都是parseLong parseLong是返回的long 基本数据类型,valueOf相当于他的装箱形式(当然,valueOf还有使用缓存数据的功能) |
decode(String nm)
decode将字符串转换为Long,听起来好像跟valueOf 差不多
都是根据字符串转变为Long对象
但是ValueOf要么指定基数要么就是默认十进制,而且不认识0X.#这种形式
decode不需要指定基数,可以根据字符串的前缀进行自己判断基数,用起来比valueOf更加灵活
getLong
getLong根本就不是看起来的样子 java.lang.Long.getLong(String) java.lang.Long.getLong(String, long) java.lang.Long.getLong(String, Long) 他只是valueOf的一个非常小的子集,仅仅是字符串为系统属性的某个变量名时,才是可以用的 ,才是可以解析的 你传入getLong("16"),根本不行 ![image_5b974562_4e41[5]](https://i-blog.csdnimg.cn/blog_migrate/144e406a008b67d2d47a43582bb04cc2.png) |
