1/* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18package java.lang; 19 20/** 21 * The wrapper for the primitive type {@code byte}. 22 * 23 * @since 1.1 24 */ 25@FindBugsSuppressWarnings("DM_NUMBER_CTOR") 26public final class Byte extends Number implements Comparable<Byte> { 27 28 private static final long serialVersionUID = -7183698231559129828L; 29 30 /** 31 * The value which the receiver represents. 32 */ 33 private final byte value; 34 35 /** 36 * The maximum {@code Byte} value, 2<sup>7</sup>-1. 37 */ 38 public static final byte MAX_VALUE = (byte) 0x7F; 39 40 /** 41 * The minimum {@code Byte} value, -2<sup>7</sup>. 42 */ 43 public static final byte MIN_VALUE = (byte) 0x80; 44 45 /** 46 * The number of bits needed to represent a {@code Byte} value in two's 47 * complement form. 48 * 49 * @since 1.5 50 */ 51 public static final int SIZE = 8; 52 53 /** 54 * The {@link Class} object that represents the primitive type {@code byte}. 55 */ 56 @SuppressWarnings("unchecked") 57 public static final Class<Byte> TYPE 58 = (Class<Byte>) byte[].class.getComponentType(); 59 // Note: Byte.TYPE can't be set to "byte.class", since *that* is 60 // defined to be "java.lang.Byte.TYPE"; 61 62 /** 63 * Constructs a new {@code Byte} with the specified primitive byte value. 64 * 65 * @param value 66 * the primitive byte value to store in the new instance. 67 */ 68 public Byte(byte value) { 69 this.value = value; 70 } 71 72 /** 73 * Constructs a new {@code Byte} from the specified string. 74 * 75 * @param string 76 * the string representation of a single byte value. 77 * @throws NumberFormatException 78 * if {@code string} cannot be parsed as a byte value. 79 * @see #parseByte(String) 80 */ 81 public Byte(String string) throws NumberFormatException { 82 this(parseByte(string)); 83 } 84 85 /** 86 * Gets the primitive value of this byte. 87 * 88 * @return this object's primitive value. 89 */ 90 @Override 91 public byte byteValue() { 92 return value; 93 } 94 95 /** 96 * Compares this object to the specified byte object to determine their 97 * relative order. 98 * 99 * @param object 100 * the byte object to compare this object to. 101 * @return a negative value if the value of this byte is less than the value 102 * of {@code object}; 0 if the value of this byte and the value of 103 * {@code object} are equal; a positive value if the value of this 104 * byte is greater than the value of {@code object}. 105 * @see java.lang.Comparable 106 * @since 1.2 107 */ 108 public int compareTo(Byte object) { 109 return compare(value, object.value); 110 } 111 112 /** 113 * Compares two {@code byte} values. 114 * @return 0 if lhs = rhs, less than 0 if lhs < rhs, and greater than 0 if lhs > rhs. 115 * @since 1.7 116 * @hide 1.7 117 */ 118 public static int compare(byte lhs, byte rhs) { 119 return lhs > rhs ? 1 : (lhs < rhs ? -1 : 0); 120 } 121 122 /** 123 * Parses the specified string and returns a {@code Byte} instance if the 124 * string can be decoded into a single byte value. The string may be an 125 * optional minus sign "-" followed by a hexadecimal ("0x..." or "#..."), 126 * octal ("0..."), or decimal ("...") representation of a byte. 127 * 128 * @param string 129 * a string representation of a single byte value. 130 * @return a {@code Byte} containing the value represented by {@code string}. 131 * @throws NumberFormatException 132 * if {@code string} cannot be parsed as a byte value. 133 */ 134 public static Byte decode(String string) throws NumberFormatException { 135 int intValue = Integer.decode(string); 136 byte result = (byte) intValue; 137 if (result == intValue) { 138 return valueOf(result); 139 } 140 throw new NumberFormatException("Value out of range for byte: \"" + string + "\""); 141 } 142 143 @Override 144 public double doubleValue() { 145 return value; 146 } 147 148 /** 149 * Compares this object with the specified object and indicates if they are 150 * equal. In order to be equal, {@code object} must be an instance of 151 * {@code Byte} and have the same byte value as this object. 152 * 153 * @param object 154 * the object to compare this byte with. 155 * @return {@code true} if the specified object is equal to this 156 * {@code Byte}; {@code false} otherwise. 157 */ 158 @Override 159 @FindBugsSuppressWarnings("RC_REF_COMPARISON") 160 public boolean equals(Object object) { 161 return (object == this) || ((object instanceof Byte) && (((Byte) object).value == value)); 162 } 163 164 @Override 165 public float floatValue() { 166 return value; 167 } 168 169 @Override 170 public int hashCode() { 171 return value; 172 } 173 174 @Override 175 public int intValue() { 176 return value; 177 } 178 179 @Override 180 public long longValue() { 181 return value; 182 } 183 184 /** 185 * Parses the specified string as a signed decimal byte value. The ASCII 186 * character \u002d ('-') is recognized as the minus sign. 187 * 188 * @param string 189 * the string representation of a single byte value. 190 * @return the primitive byte value represented by {@code string}. 191 * @throws NumberFormatException 192 * if {@code string} can not be parsed as a byte value. 193 */ 194 public static byte parseByte(String string) throws NumberFormatException { 195 return parseByte(string, 10); 196 } 197 198 /** 199 * Parses the specified string as a signed byte value using the specified 200 * radix. The ASCII character \u002d ('-') is recognized as the minus sign. 201 * 202 * @param string 203 * the string representation of a single byte value. 204 * @param radix 205 * the radix to use when parsing. 206 * @return the primitive byte value represented by {@code string} using 207 * {@code radix}. 208 * @throws NumberFormatException 209 * if {@code string} can not be parsed as a byte value, or 210 * {@code radix < Character.MIN_RADIX || 211 * radix > Character.MAX_RADIX}. 212 */ 213 public static byte parseByte(String string, int radix) throws NumberFormatException { 214 int intValue = Integer.parseInt(string, radix); 215 byte result = (byte) intValue; 216 if (result == intValue) { 217 return result; 218 } 219 throw new NumberFormatException("Value out of range for byte: \"" + string + "\""); 220 } 221 222 @Override 223 public short shortValue() { 224 return value; 225 } 226 227 @Override 228 public String toString() { 229 return Integer.toString(value); 230 } 231 232 /** 233 * Returns a two-digit hex string. That is, -1 becomes "ff" or "FF" and 2 becomes "02". 234 * @hide internal use only 235 */ 236 public static String toHexString(byte b, boolean upperCase) { 237 return IntegralToString.byteToHexString(b, upperCase); 238 } 239 240 /** 241 * Returns a string containing a concise, human-readable description of the 242 * specified byte value. 243 * 244 * @param value 245 * the byte to convert to a string. 246 * @return a printable representation of {@code value}. 247 */ 248 public static String toString(byte value) { 249 return Integer.toString(value); 250 } 251 252 /** 253 * Parses the specified string as a signed decimal byte value. 254 * 255 * @param string 256 * the string representation of a single byte value. 257 * @return a {@code Byte} instance containing the byte value represented by 258 * {@code string}. 259 * @throws NumberFormatException 260 * if {@code string} can not be parsed as a byte value. 261 * @see #parseByte(String) 262 */ 263 public static Byte valueOf(String string) throws NumberFormatException { 264 return valueOf(parseByte(string)); 265 } 266 267 /** 268 * Parses the specified string as a signed byte value using the specified 269 * radix. 270 * 271 * @param string 272 * the string representation of a single byte value. 273 * @param radix 274 * the radix to use when parsing. 275 * @return a {@code Byte} instance containing the byte value represented by 276 * {@code string} using {@code radix}. 277 * @throws NumberFormatException 278 * if {@code string} can not be parsed as a byte value, or 279 * {@code radix < Character.MIN_RADIX || 280 * radix > Character.MAX_RADIX}. 281 * @see #parseByte(String, int) 282 */ 283 public static Byte valueOf(String string, int radix) throws NumberFormatException { 284 return valueOf(parseByte(string, radix)); 285 } 286 287 /** 288 * Returns a {@code Byte} instance for the specified byte value. 289 * <p> 290 * If it is not necessary to get a new {@code Byte} instance, it is 291 * recommended to use this method instead of the constructor, since it 292 * maintains a cache of instances which may result in better performance. 293 * 294 * @param b 295 * the byte value to store in the instance. 296 * @return a {@code Byte} instance containing {@code b}. 297 * @since 1.5 298 */ 299 public static Byte valueOf(byte b) { 300 return VALUES[b + 128]; 301 } 302 303 /** 304 * A cache of instances used by {@link Byte#valueOf(byte)} and auto-boxing 305 */ 306 private static final Byte[] VALUES = new Byte[256]; 307 308 static { 309 for (int i = -128; i < 128; i++) { 310 VALUES[i + 128] = new Byte((byte) i); 311 } 312 } 313} 314