包装类
概述
Java提供了两个类型系统,基本类型与引用类型,使用基本类型在于效率。
然而很多情况,会创建对象使用,因为对象可以做更多的功能。
如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类。如下:
基本类型 | 对应的包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
装箱与拆箱
基本类型与对应的包装类对象之间,来回转换的过程称为”装箱“与”拆箱“:
-
装箱:基本类型 --> 对应的包装类对象。
-
拆箱:包装类对象 --> 对应的基本类型。
用Integer与 int为例:(看懂代码即可)
基本数值---->包装对象
Integer i = new Integer(4);//使用构造函数函数
Integer iii = Integer.valueOf(4);//使用包装类中的valueOf方法
包装对象---->基本数值
int num = i.intValue();
自动装箱与自动拆箱
由于我们经常要做基本类型与包装类之间的转换,从Java 5(JDK 1.5)开始,
基本类型与包装类的装箱、拆箱动作可以自动完成。例如:
package com;
/**
* 自动装箱和拆箱:基本类型的数据和包装类之间可以自动的互相转换
*
*/
public class IntegerTest {
public static void main(String[] args) {
// 自动装箱,直接把int类型的整数赋值给包装类
Integer i = 1; //相当于 Integer i = new Integer(1);
// 自动拆箱:i是包装类,无法直接参与运算,可以自动转为基本类型再进行计算
// i = i + 2 相当于 i = i.intValue() + 2
// 计算出结果后又自动装箱
i = i +2;
System.out.println(i);
}
}
基本类型与字符串之间的转换
基本类型转换为String
基本类型转换String总共有三种方式,查看课后资料可以得知,这里只讲最简单的一种方式:
-
直接拼接空串,遇到串之后的数据都当成字符串拼接,之前的数据正常运算。比如
"" + 1 + 2 + 3 // 得到123 1 + 2 + "" + 3 // 得 33 1 + 2 + 3 + "" // 得 6
-
调用String的valueOf方法
int num = 123; String str = String.valueOf(num); System.out.println(str);
-
转换成封装类调用toString方法
Integer num = 6; String str = num.toString(); System.out.println(str);
基本类型直接与””相连接即可;如:34 + ""
String转换成对应的基本类型
除了Character类之外,其他所有包装类都具有parseXxx静态方法
可以将字符串参数转换为对应的基本类型:
-
public static byte parseByte(String s)
:将字符串参数转换为对应的byte基本类型。 -
public static short parseShort(String s)
:将字符串参数转换为对应的short基本类型。 -
public static int parseInt(String s)
:将字符串参数转换为对应的int基本类型。 -
public static long parseLong(String s)
:将字符串参数转换为对应的long基本类型。 -
public static float parseFloat(String s)
:将字符串参数转换为对应的float基本类型。 -
public static double parseDouble(String s)
:将字符串参数转换为对应的double基本类型。 -
public static boolean parseBoolean(String s)
:将字符串参数转换为对应的boolean基本类型。
代码使用(仅以Integer类的静态方法parseXxx为例)如:
public class IntegerParse {
public static void main(String[] args) {
int num = Integer.parseInt("100");
}
}
注意:如果字符串参数的内容无法正确转换为对应的基本类型,则会抛出
java.lang.NumberFormatException
异常。
System类
java.lang.System
类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作。它不能被实例化。
在 System
类中,有标准输入、标准输出和错误输出流;
对外部定义的属性和环境变量的访问;加载文件和库的方法;
还有快速复制数组的一部分的实用方法。
字段摘要
字段摘要 | 描述 |
---|---|
static PrintStream err | “标准”错误输出流。 |
static InputStream in | “标准”输入流。 |
static PrintStream out | “标准”输出流。 |
方法摘要
方法 | 描述 |
---|---|
static long currentTimeMillis() | 返回以毫秒为单位的当前时间。 |
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) |
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。 |
static String clearProperty(String key) | 移除指定键指示的系统属性。 |
static Console console() | 返回与当前 Java 虚拟机关联的唯一 Console 对象(如果有)。 |
static void exit(int status) | 终止当前正在运行的 Java 虚拟机。 |
static void gc() | 运行垃圾回收器。 |
static Map<String,String> getenv() | 返回一个不能修改的当前系统环境的字符串映射视图。 |
static String getenv(String name) | 获取指定的环境变量值。 |
static Properties getProperties() | 确定当前的系统属性。 |
static String getProperty(String key) | 获取指定键指示的系统属性。 |
static String getProperty(String key, String def) | 获取用指定键描述的系统属性。 |
static SecurityManager getSecurityManager() | 获取系统安全接口。 |
static int identityHashCode(Object x) | 返回给定对象的哈希码,该代码与默认的方法 hashCode() 返回的代码一样,无论给定对象的类是否重写 hashCode()。 |
static Channel inheritedChannel() | 返回从创建此 Java 虚拟机的实体中继承的信道。 |
static void load(String filename) | 从作为动态库的本地文件系统中以指定的文件名加载代码文件。 |
static void loadLibrary(String libname) | 加载由 libname 参数指定的系统库。 |
static String mapLibraryName(String libname) | 将一个库名称映射到特定于平台的、表示本机库的字符串中。 |
static long nanoTime() | 返回最准确的可用系统计时器的当前值,以毫微秒为单位。 |
static void runFinalization() | 运行处于挂起终止状态的所有对象的终止方法。 |
static void setErr(PrintStream err) | 重新分配“标准”错误输出流。 |
static void setIn(InputStream in) | 重新分配“标准”输入流。 |
static void setOut(PrintStream out) | 重新分配“标准”输出流。 |
static void setProperties(Properties props) | 将系统属性设置为 Properties 参数。 |
static String setProperty(String key, String value) | 设置指定键指示的系统属性。 |
static void setSecurityManager(SecurityManager s) | 设置系统安全性。 |
在System类的API文档中,常用的方法有:
-
public static long currentTimeMillis()
:返回以毫秒为单位的当前时间。 -
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
将数组中指定的数据拷贝到另一个数组中。
currentTimeMillis方法
实际上,currentTimeMillis方法就是 获取当前系统时间与1970年01月01日00:00点之间的毫秒差值
package com;
import java.text.SimpleDateFormat;
import java.util.Date;
public class SystemTest {
public static void main(String[] args) {
//获取当前时间毫秒值
long ms = System.currentTimeMillis();
System.out.println("当前时间戳:" + ms);
Date date = new Date(ms);
System.out.println("默认日期格式:" + date);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("指定日期格式:" + simpleDateFormat.format(date));
}
}
练习
验证for循环打印数字1-9999所需要使用的时间(毫秒)
public class SystemTest1 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
System.out.println(i);
}
long end = System.currentTimeMillis();
System.out.println("共耗时毫秒:" + (end - start));
}
}
arraycopy方法
-
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
将数组中指定的数据拷贝到另一个数组中。
数组的拷贝动作是系统级的,性能很高。System.arraycopy方法具有5个参数,含义分别为:
参数名称 | 参数类型 | 参数含义 |
---|---|---|
src | Object | 源数组 |
srcPos | int | 源数组索引起始位置 |
dest | Object | 目标数组 |
destPos | int | 目标数组索引起始位置 |
length | int | 复制元素个数 |
练习
将src数组中前3个元素,复制到dest数组的前3个位置上
复制元素前:src数组元素[1,2,3,4,5],dest数组元素[6,7,8,9,10]
复制元素后:src数组元素[1,2,3,4,5],dest数组元素[1,2,3,9,10]
import java.util.Arrays;
/**
* 将src数组中前3个元素,复制到dest数组的前3个位置上
* 复制元素前:src数组元素[1,2,3,4,5],dest数组元素[6,7,8,9,10]
* 复制元素后:src数组元素[1,2,3,4,5],dest数组元素[1,2,3,9,10]
*/
public class SystemPractise {
public static void main(String[] args) {
int[] src = {1, 2, 3, 4, 5};
int[] dest = {5, 6, 7, 8, 9};
System.out.println("复制之前:");
System.out.println(Arrays.toString(src));
System.out.println(Arrays.toString(dest));
System.arraycopy(src,0,dest,0,3);
System.out.println("复制之后:");
System.out.println(Arrays.toString(src));
System.out.println(Arrays.toString(dest));
}
}