天天看點

深入學習java源碼之Float.valueOf()與Float.sum()

深入學習java源碼之ArrayList.iterator()與ArrayList.sum() 

float 型: 占 4 位元組,7 位有效數字

double 型:占 8 位元組,15~16 位有效數字

Comparable接口

此接口強行對實作它的每個類的對象進行整體排序。此排序被稱為該類的自然排序 ,類的 compareTo 方法被稱為它的自然比較方法 。實作此接口的對象清單(和數組)可以通過 Collections.sort (和 Arrays.sort )進行自動排序。實作此接口的對象可以用作有序映射表中的鍵或有序集合中的元素,無需指定比較器。 強烈推薦(雖然不是必需的)使自然排序與 equals 一緻。所謂與equals一緻是指對于類 C 的每一個 e1 和 e2 來說,當且僅當 (e1.compareTo((Object)e2) == 0) 與e1.equals((Object)e2) 具有相同的布爾值時,類 C 的自然排序才叫做與 equals 一緻 。

int compareTo(T o) 比較此對象與指定對象的順序。如果該對象小于、等于或大于指定對象,則分别傳回負整數、零或正整數。 強烈推薦 (x.compareTo(y)==0) == (x.equals(y)) 這種做法,但不是 嚴格要求這樣做。一般來說,任何實作 Comparable 接口和違背此條件的類都應該清楚地指出這一事實。推薦如此闡述:“注意:此類具有與 equals 不一緻的自然排序。”

例如

Employee[] staff =  new Employee[ 3 ];  
staff[ 0 ] =  new Employee( "harry Hacker" , 35000 );  
staff[ 1 ] =  new Employee( "carl cracke" , 75000 );  
staff[ 2 ] =  new Employee( "tony Tester" , 38000 );  
Arrays.sort(staff); //sort方法可以實作對對象數組排序,但是必須實作 Comparable接口
           

因為要實作對Employee對象的排序,是以在Employee類中要實作Comparable接口,也就是要實作comepareTo()方法

class Employee  implements Comparable<Employee>  
{  

private int id;  
private String name;  
private double salary;  

public Employee(String n, double s)  
    {  
        name = n;  
        salary = s;  
        Random ID =  new Random();  
        id = ID.nextInt( 10000000 );  
    }  

public int compareTo(Employee other)  
    {  
if (id<other.id) //這裡比較的是什麼 sort方法實作的就是按照此比較的東西從小到大排列
return - 1 ;  
if (id>other.id)  
return 1 ;  
return 0 ;  
    }  
}
           

與Comparator的差別

Comparator位于包java.util下,而Comparable位于包java.lang下,Comparable接口将比較代碼嵌入自身類中,而後者在一個獨立的類中實作比較。 如果類的設計師沒有考慮到Compare的問題而沒有實作Comparable接口,可以通過  Comparator來實作比較算法進行排序,并且為了使用不同的排序标準做準備,比如:升序、降序。

import java.util.TreeSet; 
import java.util.Comparator; 
class NumComparator implements Comparator<NameTag> { 
    public int compare (NameTag left,NameTag right) { 
        return(left.getNumber() - right.getNumber()); 
    } 
} 
public class CollectionNine { 
    public static void main(String arg[]) { 
        new CollectionNine(); 
    } 
    CollectionNine() { 
        NumComparator comparator = new NumComparator(); 
        TreeSet<NameTag> set = new TreeSet<NameTag>(comparator); 
        set.add(new NameTag("Agamemnon",300)); 
        set.add(new NameTag("Cato",400)); 
        set.add(new NameTag("Plato",100)); 
        set.add(new NameTag("Zeno",200)); 
        set.add(new NameTag("Archimedes",500)); 
        for(NameTag tag : set) 
            System.out.println(tag); 
    } 
}
           
Modifier and Type Method and Description

byte

byteValue()

傳回此值

Float

byte

的基本收縮轉換後。

static int

compare(float f1, float f2)

比較兩個指定的

float

值。

int

compareTo(Float anotherFloat)

數字比較兩個

Float

對象。

double

doubleValue()

傳回此值

Float

double

一個寬元轉換後。

boolean

equals(Object obj)

将此對象與指定對象進行比較。

static int

floatToIntBits(float value)

根據IEEE 754浮點“單格式”位布局傳回指定浮點值的表示。

static int

floatToRawIntBits(float value)

根據IEEE 754浮點“單格式”位布局傳回指定浮點值的表示,保留非數字(NaN)值。

float

floatValue()

傳回此

Float

對象的

float

值。

int

hashCode()

傳回此

Float

對象的哈希碼。

static int

hashCode(float value)

傳回一個

float

值的哈希碼; 相容

Float.hashCode()

static float

intBitsToFloat(int bits)

傳回與給

float

表示相對應的

float

值。

int

intValue()

int

後傳回

Float

作為int的值。

static boolean

isFinite(float f)

如果參數是有限浮點值,則傳回

true

; 傳回

false

(對于NaN和無窮大參數)。

boolean

isInfinite()

傳回

true

如果這個

Float

值是無限大,

false

否則。

static boolean

isInfinite(float v)

傳回

true

如果指定的數量是無限大,

false

其他。

boolean

isNaN()

如果這個

Float

Float

數字(NaN),則傳回

true

false

false。

static boolean

isNaN(float v)

如果指定的數字是非數字(NaN)值,則傳回

true

false

false。

long

longValue()

這個的傳回值

Float

long

的基本收縮轉換後。

static float

max(float a, float b)

傳回兩個

float

的較大值,就像調用

Math.max

一樣 。

static float

min(float a, float b)

傳回兩個

float

的較小值,就像調用

Math.min

一樣 。

static float

parseFloat(String s)

傳回一個新

float

初始化為指定的代表的值

String

,如通過執行

valueOf

類的方法

Float

short

shortValue()

傳回此值

Float

short

的基本收縮轉換後。

static float

sum(float a, float b)

根據+運算符将兩個

float

值一起添加。

static String

toHexString(float f)

傳回

float

參數的十六進制字元串

float

形式。

String

toString()

傳回此

Float

對象的字元串表示形式。

static String

toString(float f)

傳回

float

參數的字元串

float

形式。

static Float

valueOf(float f)

傳回一個

Float

指定的

float

值的

Float

執行個體。

static Float

valueOf(String s)

傳回一個

Float

對象,儲存由參數字元串

s

float

值。

java源碼

package java.lang;

import sun.misc.FloatingDecimal;
import sun.misc.FloatConsts;
import sun.misc.DoubleConsts;

public final class Float extends Number implements Comparable<Float> {


    public static final float POSITIVE_INFINITY = 1.0f / 0.0f;

    public static final float NEGATIVE_INFINITY = -1.0f / 0.0f;

    public static final float NaN = 0.0f / 0.0f;
	
    public static final float MAX_VALUE = 0x1.fffffeP+127f; // 3.4028235e+38f	
	
    public static final float MIN_NORMAL = 0x1.0p-126f; // 1.17549435E-38f
	
    public static final float MIN_VALUE = 0x0.000002P-126f; // 1.4e-45f	
	
    public static final int MAX_EXPONENT = 127;	
	
    public static final int MIN_EXPONENT = -126;	
	
    public static final int SIZE = 32;	
	
    public static final int BYTES = SIZE / Byte.SIZE;	
	
    @SuppressWarnings("unchecked")
    public static final Class<Float> TYPE = (Class<Float>) Class.getPrimitiveClass("float");	
	
    public static String toString(float f) {
        return FloatingDecimal.toJavaFormatString(f);
    }	

    public static String toHexString(float f) {
        if (Math.abs(f) < FloatConsts.MIN_NORMAL
            &&  f != 0.0f ) {// float subnormal
            // Adjust exponent to create subnormal double, then
            // replace subnormal double exponent with subnormal float
            // exponent
            String s = Double.toHexString(Math.scalb((double)f,
                                                     /* -1022+126 */
                                                     DoubleConsts.MIN_EXPONENT-
                                                     FloatConsts.MIN_EXPONENT));
            return s.replaceFirst("p-1022$", "p-126");
        }
        else // double string will be the same as float string
            return Double.toHexString(f);
    }

    public static Float valueOf(String s) throws NumberFormatException {
        return new Float(parseFloat(s));
    }

    public static Float valueOf(float f) {
        return new Float(f);
    }

    public static float parseFloat(String s) throws NumberFormatException {
        return FloatingDecimal.parseFloat(s);
    }

    public static boolean isNaN(float v) {
        return (v != v);
    }
	
    public static boolean isInfinite(float v) {
        return (v == POSITIVE_INFINITY) || (v == NEGATIVE_INFINITY);
    }	
	
     public static boolean isFinite(float f) {
        return Math.abs(f) <= FloatConsts.MAX_VALUE;
    }
	
    private final float value;	
	
    public Float(float value) {
        this.value = value;
    }	
	
    public Float(double value) {
        this.value = (float)value;
    }	
	
    public Float(String s) throws NumberFormatException {
        value = parseFloat(s);
    }	
	
    public boolean isNaN() {
        return isNaN(value);
    }	
	
    public boolean isInfinite() {
        return isInfinite(value);
    }	

    public String toString() {
        return Float.toString(value);
    }
	
    public byte byteValue() {
        return (byte)value;
    }	
	
    public short shortValue() {
        return (short)value;
    }

    public int intValue() {
        return (int)value;
    }

    public long longValue() {
        return (long)value;
    }

    public float floatValue() {
        return value;
    }

    public double doubleValue() {
        return (double)value;
    }

    @Override
    public int hashCode() {
        return Float.hashCode(value);
    }

    public static int hashCode(float value) {
        return floatToIntBits(value);
    }

    public boolean equals(Object obj) {
        return (obj instanceof Float)
               && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
    }

    public static int floatToIntBits(float value) {
        int result = floatToRawIntBits(value);
        // Check for NaN based on values of bit fields, maximum
        // exponent and nonzero significand.
        if ( ((result & FloatConsts.EXP_BIT_MASK) ==
              FloatConsts.EXP_BIT_MASK) &&
             (result & FloatConsts.SIGNIF_BIT_MASK) != 0)
            result = 0x7fc00000;
        return result;
    }

    public static native int floatToRawIntBits(float value);


    public static native float intBitsToFloat(int bits);

    public int compareTo(Float anotherFloat) {
        return Float.compare(value, anotherFloat.value);
    }

    public static int compare(float f1, float f2) {
        if (f1 < f2)
            return -1;           // Neither val is NaN, thisVal is smaller
        if (f1 > f2)
            return 1;            // Neither val is NaN, thisVal is larger

        // Cannot use floatToRawIntBits because of possibility of NaNs.
        int thisBits    = Float.floatToIntBits(f1);
        int anotherBits = Float.floatToIntBits(f2);

        return (thisBits == anotherBits ?  0 : // Values are equal
                (thisBits < anotherBits ? -1 : // (-0.0, 0.0) or (!NaN, NaN)
                 1));                          // (0.0, -0.0) or (NaN, !NaN)
    }

    public static float sum(float a, float b) {
        return a + b;
    }

    public static float max(float a, float b) {
        return Math.max(a, b);
    }

    public static float min(float a, float b) {
        return Math.min(a, b);
    }
    private static final long serialVersionUID = -2671257302660747028L;
}
           
package java.lang;
import java.util.*;

public interface Comparable<T> {

    public int compareTo(T o);
}
           
package java.lang;

public abstract class Number implements java.io.Serializable {

    public abstract int intValue();

    public abstract long longValue();

    public abstract float floatValue();

    public abstract double doubleValue();

    public byte byteValue() {
        return (byte)intValue();
    }

    public short shortValue() {
        return (short)intValue();
    }
	
    private static final long serialVersionUID = -8742448824652078965L;
}
           

繼續閱讀