文章目录
1.Number类
Java 为每种基本数据类型分别设计了对应的类,称之为包装类。
基本数据类型 | 大小 | 最小值 | 最大值 | 默认值 | 包装类 |
---|---|---|---|---|---|
byte | 8bits | -2^7 | 2^7-1 | 0 | Byte |
short | 16bits | -2^15 | 2^15-1 | 0 | Short |
int | 32bits | -2^31 | 2^31-1 | 0 | Integer |
long | 64bits | -2^63 | 2^63-1 | 0L | Long |
float | 32bits | IEEE 754 | IEEE 754 | 0.0f | Float |
double | 64bits | IEEE 754 | IEEE 754 | 0.od | Double |
char | 16-bit | Unicode 0(’\u0000’) | Unicode 2^16-1(’\ufffff’) | ‘\u0000’ | Character |
boolean | - | - | - | false | Boolean |
用于高精度计算的类:BigInteger(支持任意精度的整数)和BigDecimal(支持任意精度的浮点数),它们可以完成和基本数据类型一样的操作,只不过必须以方法调用的方式来实现,也因此速度会慢很多,以速度换精度
装箱:基本数据类型转换为包装类的过程。
拆箱:包装类转换为基本数据类型的过程。
什么是自动装箱、拆箱? 基础数据类型与它们的包装类进行运算时,编译器会自动帮我们进行转换。
有如下几种情况时,编译器会自动帮我们进行装箱或拆箱.出处
- 进行 = 赋值操作(装箱或拆箱)
- 进行+,-,*,/混合运算 (拆箱)
- 进行>,<,==比较运算(拆箱)
- 调用equals进行比较(装箱)
- ArrayList,HashMap等集合类 添加基础类型数据时(装箱)
以float和Float为例,装箱就是调用Float的valueOf方法new一个Float并赋值,拆箱就是调用Float对象的floatValue方法并赋值返回给float。
下面再总结一下包装类常用的方法:详细文档
Integer:
- 构造方法 Integer(int value/ String str) 构造一个新对象,表示指定的int值或String参数所指示的int值
- byteValue(), shortValue(), intValue() 以T类型返回该Integer的值
- toString() 返回一个表示该Integer值的String对象
- boolean equals(Object obj) 比较两对象是否相等
- compareTo(Integer) 在数值上比较两个Integer对象,相等返回0,比参数小返回负值,比参数大返回正值
- valueOf(String str) 返回保存指定String值的Integer对象
- parseInt()String str) 将字符串转换为int值
- 四个常量 Integer.MAX_VALUE; Integer.MIN_VALUE; Integer.SIZE(以二进制补码形式表示 int 值的比特位数); Integr.TYPE(表示基本类型int的Class实例)
2.String
2.1String 不可变字符串
首先值得注意的是String对象是不可变(只读)的,即声明为final class,String类中每一个看起来会修改String值的方法,实际上都是创建了一个全新的String对象,用来包含修改后的字符串的内容。在Java8中使用private final char value[];
来存储数据。下面看看几种创建字符串对象的方式:
String s1 = "Runoob"; // String 直接创建,会直接放入字符串常量池(公共池)中
String s2 = "Runoob"; // String 直接创建
String s3 = s1; // 相同引用
String s4 = new String("Runoob"); // String 对象创建
String s5 = new String("Runoob"); // String 对象创建
需要注意的是:使⽤new String(“Runoob”)⼀共会创建两个字符串对象(前提是String Pool 中还没有 “Runoob” 字符串对象)
- “Runoob” 属于字符串字⾯量,因此编译时期会在 String Pool 中创建⼀个字符串对象,指向这个 "abc"字符串字⾯量;
- 使⽤ new 的⽅式会在堆中创建⼀个字符串对象。
String Pool:字符串常量池,保存着所有字符串字面量,这些字⾯量在编译时期就确定。
可以使⽤ String 的 str = str1.intern() ⽅法在运⾏过程将字符串添加到 String Pool 中。当⼀个字符串调⽤ intern() ⽅法时,如果 String Pool 中已经存在⼀个字符串和该字符串值相等(使⽤equals() ⽅法进⾏确定),那么就会返回 String Pool 中字符串的引⽤;否则,就会在 String Pool 中添加⼀个新的字符串,并返回这个新字符串的引⽤。
String不可变的好处
- 可以缓存 hash 值。因为 String 的 hash 值经常被使⽤,例如 String ⽤做 HashMap 的 key。不可变的特性可以使得 hash值也不可变,因此只需要进⾏⼀次计算。
- String Pool 的需要。如果⼀个 String 对象已经被创建过了,那么就会从 String Pool 中取得引⽤。只有 String 是不可变的,才可能使⽤ String Pool。
- 安全性。String 经常作为参数,String 不可变性可以保证参数不可变
- 线程安全。String 不可变性天⽣具备线程安全,可以在多个线程中安全地使⽤。
`
方法 | 应用 |
---|---|
str1.concat(str2) | 连接两个字符串 |
str.length() | 返回字符串长度 |
str.equal(_str), str.equalIgnoreCase(忽略大小写) | 比较两个String内容是否相同 |
String.valueOf() | 返回表示参数内容的String |
str.toLowerCase(), str.toUpperCase() | 返回大小写转换后的新String |
str.trim() | 返回去除str两端空格后的新String。如果没有改变发生,则返回原始的String |
str.subString(int beginIndex, (int endIndex)) | 返回从索引开始位置到结尾或索引结束位置的新String,[begin,end) |
str.split(_str, (int limit)) | 按指定_str分隔符对原字符串进行分割,分割后的内容存入字符串数组中。limit表示分割后产生的字符串限制个数 |
str.replace(String oldChar, String newChar) | 用于将str里所有的oldChar替换为newChar |
str.charAt(int) | 返回索引位置上的字符 |
str.indexof(String/char, (int fromIndex)),str.lastIndexof(String/char, (int fromIndex)) | 返回字符(串)在str中首次出现的索引位置, last为从后面向前面搜索 |
2.2StringBuffer和StringBuilder 可变字符串
StringBuilder类(jdk1.5新增)和StringBuffer类均为可变字符串类(字符串缓冲区),方法基本相似。
建议操作少量数据使用String,单线程操作大量数据((或通常情况下需要可变字符串))使用StringBuilder,多线程操作大量数据使用StringBuffer。
- StringBuilder() 构造器
- str.toString() 返回一个与缓冲区内容相同得字符串
- str.append(String _str/ char c) 追加一个字符串或字符
- str.insert(int i, String _str/ char c) 在第i个位置插入一个字符串或字符
- str.reverse() 反转字符串
- str.delete(int beginIndex, int endIndex) 删除字符串[begin,end)
3.Arrays类
Arrays类里均为static修饰的方法,因此可直接通过类名调用,即Arrays.xxx(x)。
- static List asList(T[] a) 返回将参数数组转换为固定大小的列表
- int binarySearch ( T[] a,(int fromIndex,int toIndex), T key ) 前提数组元素已按升序排列。返回key元素在数组中(或从fromIndex到toIndex查找)出现的索引
- T[] copeOf ( T[] old, int length) 将old数组复制成一个新数组,length为新数组长度(会出现截断或补零(数值类型)、false(布尔类型)、null(引用类型)的操作)。相似的还有T[] copeOfRange( T[] old, int fromIndex, int toIndex )
- boolean equals( T[] a, T[] _a ) 当a.length=_a.length且a与_a元素一一相同,返回true
- void fill( T[] a, (int fromIndex, int toIndex), T val) 以val值填充数组
- void sort( T[] a, (int fromIndex, int toIndex) ) 排序
- String toString(T[] a) 将数组转换为字符串。即按顺序将元素连接在一起,并用逗号隔开
- String replace(int start, int end, String str) 使用给定 String 中的字符替换此序列的子字符串中的字符。
4.Scanner类
import java.util.Scanner
public class ScannerDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in); //从键盘接收数据
//next方式接收 scanner demo
while(sc.hasNext()) {
String str = scan.next(); //str = scanner;demo无法接收到
}
//nextLine方式接收
while(sc.hasNextLine()) {
String str = scan.nextLine();
}
//接受int或float等数据类型
while(sc.hasNextInt()) {
int i = scan.nextInt(); //其余数据类型相似
}
sc.close(); //不要忘记关闭
}
}
next()和nextLine()区别:
next():
- 一定要读取到有效字符后才可以结束输入。
- 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
- 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
- next() 不能得到带有空格的字符串。
nextLine():
- 以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
- 可以获得空白。
5.Object类
Object 类是所有类的父类,即Java所有的类都默认继承了Object,可以使用它的所有方法。因此下面两种表示是一样的。
public class Demo extends Object{
}
public class Demo {
}
常用方法:
- boolean equals(Object obj) 比较两个对象是否相等。判断两个对象引用指向的是同一个对象,即比较 2 个对象的内存地址是否相等。
- String toString() 返回对象的字符串表示形式
- int hashCode() 获取对象的hash值
- Class<?> getClass() 获取对象运行时的实例类
- void notify() / notifyAll 唤醒在该对象上等待的某个或所有线程
- void wait() 让当前线程进入等待状态。直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。