java学习-java.lang一Number类
java.lang包是java语言中被用于编程的基本包。编写的程序基本上都要用到这个包内的常用类。
包含了基本数据类型包装类(Boolean,Number,Character,Void)以及常用类型类(String,StringBuilder,StringBuffer)
Number类 是所有数值类的父类,其直接子类
AtomicInteger, AtomicLong, BigDecimal, BigInteger, Byte, Double, Float, Integer, Long, Short
一、Integer类 int整型的包装类
数值范围(-231~~231-1) 这是64位的jdk,,占用4字节,最大长度为32位
主要以下部分内容
- Integet类生成整型对象的静态方法 也就是将字符串转换成整型
- Integer对象转换成字符串的方法。
- Integer类的equals(Object obj)和toString()方法
- Comparable<Integer>接口方法的实现
生成Integer对象方法
public static Integer valueOf(String s)或者public static Integer valueOf(String s, int radix)
这两个方法都是将字符串转换成整型对象,
Integer.valueOf("123")和Integer.valueOf("123",10)这方法是等同了,不带radix参数时,默认指定s的值是十进制数据,即radix=10
而如果s的值不是十进制数据时则要调用valueOf(String s, int radix)方法,要指定该字符串是多少进制数据。
如Integer.valueOf("abc",16) 指定字符串"abc" 是十六进制数据
这将会返回一个数值为2748的Integer对象,也就是10*162+11*161+12*160=2748
valueOf()方法直接调用了,public static int parseInt(String s, int radix) ,将字符串解析成整型,
可以代表整型数据的字符,0-9 a-z A-Z 这些数据可以表示整型数据,如果字符串中包含其它字符,则会发生异常。
a-z和A-Z,其实表示的是同一整型数据,a和A 一样表示10,b和B表示11
note:
十六进制 字母范围为只能A-F ,因为十六进制单个字符能够表示的数值为16,满16进1
如果执行语句
parseInt("G",16)
这会报错 java.lang.NumberFormatException: For input string: "G"
指定的进制数不能解析这个字符串
/**
* All possible chars for representing a number as a String
*/
final static char[] digits = {
'0' , '1' , '2' , '3' , '4' , '5' ,
'6' , '7' , '8' , '9' , 'a' , 'b' ,
'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
'o' , 'p' , 'q' , 'r' , 's' , 't' ,
'u' , 'v' , 'w' , 'x' , 'y' , 'z'
};
Integer对象转换成字符串的方法
Integer类内部有一些静态方法,用于将整型转换为字符串类型,
String hexString = Integer.toHexString(50);//整型转换为16进制字符串
String binaryString = Integer.toBinaryString(50);//二进制
String decimalString = Integer.toString(50);//默认十进制
String octalString = Integer.toOctalString(50);//八进制
String otherString = Integer.toString(50, 27);//任意进制,这里为27进制,进制范围为:2~36
System.out.println(hexString);
System.out.println(binaryString);
System.out.println(decimalString);
System.out.println(octalString);
System.out.println(otherString);
输出结果为
10
32
110010
50
62
1n
整型数据转换成字符串用这个没什么问题,但是负数转换成字符串的时候出现了很多问题
除了
Integer.toString(int i)
Integer.toString(int i, int radix)
这两个方法的正负整数转换成字符串只是在前面加一个负号。其他的暂时看不懂,不纠结
10
ffffffce
11111111111111111111111111001110
-50
37777777716
-1n
Integer类的equals(Object obj)和toString()方法
Integer类中重写了继承自Object类的equals(Object obj)方法,
Object类中的equals(Object obj )
public boolean equals(Object obj) {
return (this == obj);
}
由于==这个运算符是判断两个对象引用的内存地址是否相等,相等,表示两个object其实引用的是同一内存地址,同一对象。
Integer.equals(Object obj)
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
重写的equals()方法,如果对象不是Integer类型,返回false,如果是Integer类型,在判断对象的值是否相等。所以要比较两个整型对象的值是否相等,可以使用equals()方法进行比较
Integer.toString(),,也是重写了Object的toString()方法,返回了是Integer对象的值
Object.toString()
public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
Integer.toString()
public String toString() {
return toString(value);
}
public static String toString(int i) {
if (i == Integer.MIN_VALUE)
return "-2147483648";
int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i);
char[] buf = new char[size];
getChars(i, size, buf);
return new String(buf, true);
}
Object的toString()是返回 字符串格式: “类名@16进制的哈希值”,
以后要谨慎使用toString()方法了。
Comparable<Integer>接口方法的实现,对象列表的升序降序接口
我们通过重写改接口方法,可以对列表进行升序或降序排列。
Number类的实现类,也就是基本数据类型的包装类Integer, Float, Double,Long,Byte等都实现的Comparable接口,
默认就可以调用List或者array的排序方法进行升序或降序排序。
This interface imposes a total ordering on the objects of each class that implements it. This ordering is referred to as the class's natural ordering, and the class's compareTo method is referred to as its natural comparison method.
此接口对实现它的每个类的对象强加一个总排序。这种排序被称为类的自然排序,类的compareTo方法被称为其自然比较方法。
Lists (and arrays) of objects that implement this interface can be sorted automatically by Collections.sort
(and Arrays.sort
).
只有实现的这个接口的对象list列表或array数组才可以使用sort方法让列表或数组的元素被自动排序
只需要实现compareTo()方法即可
public int compareTo(){}这个比较方法,,
如果要将对象列表进行升序排序,则第i个元素和第i+1元素 要满足a[i]>a[i+1] 返回1 a[i]<a[i+1] 返回-1 a[i]=a[i+1] 返回0 如果要将对象列表进行降序排序 要满足 a[i]>a[i+1] 返回-1 a[i]<a[i+1] 返回1 a[i]=a[i+1] 返回0
Collections.sort方法实现的就是按照此比较的东西排列
升序(从小到大):
if(price < o.price){
return -1;
}
if(price > o.price){
return 1;
}
降序(从大到小):
if(price < o.price){
return 1;
}
if(price > o.price){
return -1;
}
//将对象按价格进行升序排序
@Override
public int compareTo(flower o) {
//首先比较price,如果price相同返回0
if(price < o.price){
return -1;
}
if(price > o.price){
return 1;
} return 0;
}
为什么升序 返回值为1时,是n的值要大于n+1的值,而返回值为-1时n的值要小于n+1呢?
这个要查看源码才可以知道原理。(不好奇的可以不看哦^~^)
由于这个List.sort()这个排序方法时使用二分排序,源码如下,
private static void binarySort(Object[] a, int lo, int hi, int start) {
assert lo <= start && start <= hi;
if (start == lo)
start++;
for ( ; start < hi; start++) {
Comparable pivot = (Comparable) a[start]; // Set left (and right) to the index where a[start] (pivot) belongs
int left = lo;
int right = start;
assert left <= right;
/*
* Invariants:
* pivot >= all in [lo, left).
* pivot < all in [right, start).
*/
while (left < right) {
int mid = (left + right) >>> 1;
if (pivot.compareTo(a[mid]) < 0)
right = mid;
else
left = mid + 1;
}
assert left == right; /*
* The invariants still hold: pivot >= all in [lo, left) and
* pivot < all in [left, start), so pivot belongs at left. Note
* that if there are elements equal to pivot, left points to the
* first slot after them -- that's why this sort is stable.
* Slide elements over to make room for pivot.
*/
int n = start - left; // The number of elements to move
// Switch is just an optimization for arraycopy in default case
switch (n) {
case 2: a[left + 2] = a[left + 1];
case 1: a[left + 1] = a[left];
break;
default: System.arraycopy(a, left, a, left + 1, n);
}
a[left] = pivot;
}
}
while (left < right) {
int mid = (left + right) >>> 1;
if (pivot.compareTo(a[mid]) < 0)
right = mid;
else
left = mid + 1;
}
这个值是和已排序的数据的中间的数据进行比较,provot.compareTo(a[mid])
注意看,上面的a[mid]是作为比较方法的参数。
当小于0,也就是值为-1时,是我们要插入的数据作为调用方,
小于0时,该数据插入到前面,
大于0时,数据插入到后面
思维惯性以为升序就是第一个元素比第二个元素小。obj1.compareTo(Object obj2)
即obj1=2是第一个元素,obj2=8是第二个元素
那么我们升序时,如果obj1小于obj2,返回值为-1,则会将obj2插入到obj1前面,,排序前【2, 8】这样排序完后却变成了,,【8, 2】
这跟我们想要的升序数据不一样,
原因是java的二分法进行比较了是,,obj2.compareTo(obj1),,与我们想的刚好相反,
所以我们返回的值取反就可以变成升序了,
如这个消费类,,只给出部分代码
public class ConsumInfo implements Comparable<ConsumInfo> {
public double price;
public String name;
public Consuminfo(double price, String name){
this.price = price;
this.name = name;
} @Override
public int compareTo(ConsumInfo o) {
//首先比较price,如果price相同
if(price < o.price){
return -1;
}
if(price > o.price){
return 1;
} return 0;
} }
ConsumInfo consumInfo1 = new ConsumInfo("consumInfo1", 400.0);
ConsumInfo consumInfo2 = new ConsumInfo("consumInfo2", 200.0);
List<ConsumInfo> list = new ArrayList<ConsumInfo>();
list.add(consumInfo1);
list.add(consumInfo2); System.out.println("排序前:");
for(ConsumInfo consumInfo : list ){
System.out.println(consumInfo);
} Collections.sort(list);//排序
System.out.println("排序后:");//排序后
for(ConsumInfo consumInfo :list){
System.out.println(consumInfo);
}
控制台输出信息为:
排序前:
ConsumInfo [name=consumInfo1, price=400.0]
ConsumInfo [name=consumInfo2, price=200.0]
排序后:
ConsumInfo [name=consumInfo2, price=200.0]
ConsumInfo [name=consumInfo1, price=400.0]
上面是最简单的两个元素进行排序,
第一次,往已排序列表中插入第一个元素,即数组中只有一个已排好序的元素,a[0] = consumInfo1
第二次时,left为0,right为1,进入while循环中,
mid=0,privot=consumInfo2
即consumInfo2.comparTo(a[0])
当方法的返回值小于0时,consumInfo2会插入在consumInfo1之前,
大于0时,会在consumInfo1之后
进行比较时,consumInfo2.price<consumInfo1.price 返回值小于0,也就是consumInfo1的值比较大,插入在1之前
java学习-java.lang一Number类的更多相关文章
- java学习(五)Number类、Math类
Number类 顾名思义嘛,搞数字的,以前也用到过,就是相当于内置了一堆数字的类嘛,用哪种类型的就引用下这个包就好了呗 Integer.Long.Byte.Double.Float.Short都是Nu ...
- java学习笔记07--日期操作类
java学习笔记07--日期操作类 一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...
- java学习笔记之日期日历类
java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...
- Java学习之IO之File类二
之前学了File便想把我学习视频的名字改了,因为文件名太长不好看,便试着写了个功能实现 package com.gh.file; import java.io.File; /** * 批量文件命名 * ...
- Java学习--使用 Date 和 SimpleDateFormat 类表示时间
使用 Date 和 SimpleDateFormat 类表示时间 在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类.这个类最主要的作用就是获取 ...
- [Java学习] Java虚拟机(JVM)以及跨平台原理
相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...
- [Java学习] java泛型通配符和类型参数的范围
本节先讲解如何限制类型参数的范围,再讲解通配符(?). 类型参数的范围 在泛型中,如果不对类型参数加以限制,它就可以接受任意的数据类型,只要它是被定义过的.但是,很多时候我们只需要一部分数据类型就够了 ...
- java学习-java.lang.Math随机数生成
java中的随机数,java.lang.Math.random()和java.util.Random.nextDouble() Math.random()方法是生成0.0---1.0区域内的随机数,每 ...
- [Java学习] Java Object类
Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: 1 ...
随机推荐
- 几个经典的数学库之一学习---VCGlib(1)
1. VCG Libary是Visulization and Computer Graphics Libary(可视化与计算机图形学库)的缩写,是一个开源的C++模板库,用于三角网格和四面体网格的控制 ...
- console的所有用法
http://jingyan.baidu.com/article/e75aca855c6419142edac6c1.html 参考它. console.info(), console.debug() ...
- Bad Day -- Daniel Powter
Bad Day Bad Day (坏天气) 来自 Daniel Powter -- 2005年MTV欧洲音乐奖提名最佳新人, 出自专辑 ...
- Java代码优化(一)
前言 2016年3月修改,结合自己的工作和平时学习的体验重新谈一下为什么要进行代码优化.在修改之前,我的说法是这样的: 就像鲸鱼吃虾米一样,也许吃一个两个虾米对于鲸鱼来说作用不大,但是吃的虾米多了,鲸 ...
- 译:Microsoft/ReactXP 简介
在Github的Microsoft项目中发现一个名为ReactXP的项目,这是一个由Skype团队开发的,用于进行Web及跨平台APP开发的库(建立在React Js 和 ReactNative之上) ...
- INNER JOIN与LEFT JOIN在SQL Server的性能
我创建了INNER JOIN 9桌,反正需要很长的(超过五分钟).所以,我的民歌改变INNER JOIN来LEFT JOIN LEFT JOIN的性能较好,在首次尽管我所知道的.之后我变了,查询的速度 ...
- 自定义Asp.net core——日志记录
本文我将演示如何定制日志记录.默认的日志记录仅仅向控制台或者debug窗口输出日志,这样可以满足一些情况,但是你可能还需要把日志记录到一个磁盘文件或者数据库,或者你想为记录额外的信息.这样的场景你就需 ...
- 统一登录中心SSO 单点登录系统的构想
什么是单点登录?我想肯定有一部分人“望文生义”的认为单点登录就是一个用户只能在一处登录,其实这是错误的理解.单点登录指的是多个子系统只需要登录一个,其他系统不需要登录了(一个浏览器内).一个子系统退出 ...
- [原创] 基础中的基础(二):C/C++ 中 const 修饰符用法总结
在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家梳理一下知识,给大家一点点帮助.作者是菜鸟一 ...
- super函数的用法
1.创建一个类. # .创建一个类 class Bird: def __init__(self): self.hungry =True def eat(self): if self.hungry: p ...