java.lang包是java语言中被用于编程的基本包。编写的程序基本上都要用到这个包内的常用类。

包含了基本数据类型包装类(Boolean,Number,Character,Void)以及常用类型类(String,StringBuilder,StringBuffer)

Number类    是所有数值类的父类,其直接子类

AtomicIntegerAtomicLongBigDecimalBigIntegerByteDoubleFloatIntegerLongShort

一、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类的更多相关文章

  1. java学习(五)Number类、Math类

    Number类 顾名思义嘛,搞数字的,以前也用到过,就是相当于内置了一堆数字的类嘛,用哪种类型的就引用下这个包就好了呗 Integer.Long.Byte.Double.Float.Short都是Nu ...

  2. java学习笔记07--日期操作类

    java学习笔记07--日期操作类   一.Date类 在java.util包中定义了Date类,Date类本身使用非常简单,直接输出其实例化对象即可. public class T { public ...

  3. java学习笔记之日期日历类

    java学习笔记之日期日历 Date日期类概述: 表示特定的瞬间,精确到毫秒 Date类的构造方法: 1.空参数构造方法 Date date = new Date(); 获取到当前操作系统中的时间和日 ...

  4. Java学习之IO之File类二

    之前学了File便想把我学习视频的名字改了,因为文件名太长不好看,便试着写了个功能实现 package com.gh.file; import java.io.File; /** * 批量文件命名 * ...

  5. Java学习--使用 Date 和 SimpleDateFormat 类表示时间

    使用 Date 和 SimpleDateFormat 类表示时间 在程序开发中,经常需要处理日期和时间的相关数据,此时我们可以使用 java.util 包中的 Date 类.这个类最主要的作用就是获取 ...

  6. [Java学习] Java虚拟机(JVM)以及跨平台原理

    相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的. 那么,跨平台是怎样实现的呢?这就 ...

  7. [Java学习] java泛型通配符和类型参数的范围

    本节先讲解如何限制类型参数的范围,再讲解通配符(?). 类型参数的范围 在泛型中,如果不对类型参数加以限制,它就可以接受任意的数据类型,只要它是被定义过的.但是,很多时候我们只需要一部分数据类型就够了 ...

  8. java学习-java.lang.Math随机数生成

    java中的随机数,java.lang.Math.random()和java.util.Random.nextDouble() Math.random()方法是生成0.0---1.0区域内的随机数,每 ...

  9. [Java学习] Java Object类

    Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来. 定义Java类时如果没有显示的指明父类,那么就默认继承了 Object 类.例如: 1 ...

随机推荐

  1. D3_book 7 area

    <!-- area的例子csv使用node.js提供的 --> <!DOCTYPE html> <meta charset="utf-8"> & ...

  2. EBS R12 探索之路【EBS 经典SQL分享】

    http://bbs.erp100.com/thread-251217-1-1.html 1. 查询EBS 系统在线人数 SELECT U.USER_NAME ,APP.APPLICATION_SHO ...

  3. C# 读取Excel,一波华丽的操作

    C# 读取Excel,其实有很多方法.但是今天要来一波华丽的操作. 先看效果: 以上这波操作使用了 ExcelDataReader 和 ExcelDataReader.DataSet 完成的. Exc ...

  4. leetcode 之突然不做了

    最近心情也不好,学不会的东西太多,以前能懂为什么,现在完全不知道为什么,只能依葫芦画瓢了,所以我写出了的代码到底是会了吗?还是瓢画的好? 热血之三分钟热度小张发现leetcode里会做的好像都做了,剩 ...

  5. OI动态规划&&优化 简单学习笔记

    持续更新!! DP的难点主要分为两类,一类以状态设计为难点,一类以转移的优化为难点. DP的类型 序列DP [例题]BZOJ2298 problem a 数位DP 常用来统计或者查找一个区间满足条件的 ...

  6. CentOS 7 - 安装Eclipse

    注意问题:Eclipse官方网站提供的tar文件有可能有问题,我今天下载的一个tar文件,在Windows下解压缩,随后放到CentOS 7里面不行,随后我又重新下载一份,还是不行,最终我下载了另外一 ...

  7. Dockerfile数据管理

    本文介绍Docker内部以及容器间的数据管理,在容器中管理数据主要有两种方式: 数据卷(Volumes) 挂载主机目录(Bind mounts) 数据卷 数据卷是一个可供一个或则多个目录使用的特殊目录 ...

  8. snmpv3-snmpd.conf解析

    1.先指定createUser语句,设置密码和传输密钥. createUser user1 createUser user2 MD5 user2password createUser user3 MD ...

  9. 使用.net core读取Json文件配置

    1.使用vs2017创建一个应用台程序 2.使用程序包管理器控制台执行命令 Install-Package Microsoft.AspNetCore -Version 2.0.1 3.创建一个json ...

  10. 【bzoj3489】 A simple rmq problem k-d树

    由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ...