System 类 {#System 类}
java.lang.System
类中提供了大量的静态方法,可以获取与系统相关的信息或系统级操作,在System
类的API
文 档中,常用的方法有:
public static long currentTimeMillis()
:返回以毫秒为单位的当前时间。public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
:将 数组中指定的数据拷贝到另一个数组中。
currentTimeMillis()方法 {#currentTimeMillis- 方法}
实际上,currentTimeMillis 方法就是 获取当前系统时间与 1970 年 01 月 01 日 00:00 点之间的毫秒差值
代码示例 {#代码示例}
/**
* Software:IntelliJ IDEA 2018.2.4 x64
* Author: MoBai·杰
* Date: 2020/5/6 10:19
* ClassName:SystemDemo1
* 类描述:获取当前时间毫秒值
*/
public class SystemDemo1 {
public static void main(String[] args) {
// 获取当前时间的毫秒值
System.out.println(System.currentTimeMillis());
// 计算程序运行时间
long start = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
System.out.println("i =" + i);
}
long end = System.currentTimeMillis();
// 根据电脑配置以及其他因素我这里运行 1000 次循环 i 时间为: 446 毫秒值
System.out.println("本程序运行时间为:" + (end - start));
}
}
arraycopy(***)方法 {#arraycopy- 方法}
public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) :将 数组中指定的数据拷贝到另一个数组中。
数组的拷贝动作是系统级的,性能很高。System.arraycopy 方法具有 5 个参数,含义分别为
| 参数序号 | 参数名称 | 参数类型 | 参数含义 | |:----:|:-------:|:------:|:----------:| | 1 | src | Object | 源数组 | | 2 | srcPos | int | 源数组起始位置 | | 3 | dest | Object | 目标数组 | | 4 | destPos | int | 目标数组索引起始位置 | | 5 | length | int | 复制元素个数 |
代码参考 {#代码参考}
/**
* Software:IntelliJ IDEA 2018.2.4 x64
* Author: MoBai·杰
* Date: 2020/5/6 10:30
* ClassName:SystemDemo2
* 类描述:复制数组的内容到新数组中
*/
public class SystemDemo2 {
public static void main(String[] args) {
// 创建两个数组, 标记索引
// 0 1 3 4 5
int[] arr1 = {11, 22, 33, 44, 55};
// 0 1 2 3 4 5 6 7 8 9
int[] arr2 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
/*
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 复制数组的内容到新数组中
Object src: 源数组, 要被复制的数组
int srcPos: 从源数组哪个位置开始
Object dest: 目标数组
int destPos: 目标数组的哪个位置
int length: 复制的元素的个数
*/
System.arraycopy(arr1, 4, arr2, 4, 1);
// 调用 Arrays.toString()打印数组
// 复制后的数组:[0, 0, 0, 0, 55, 0, 0, 0, 0, 0]
System.out.println("复制后的数组:" + Arrays.toString(arr2));
}
}
练习 {#练习}
需求: 获取复制一个数组需要消耗的时间
public class SystemDemo3 {
public static void main(String[] args) {
// 开始时间
long start = System.currentTimeMillis();
// 0 1 3 4 5
int[] arr1 = new int[]{11, 22, 33, 44, 55};
// 0 1 2 3 4 5 6 7 8 9
int[] arr2 = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
// 复制数组
System.arraycopy(arr1, 3, arr2, 7, 2);
// 调用 Arrays.toString()打印数组
// 运行结果:[0, 0, 0, 0, 0, 0, 0, 44, 55, 0]
System.out.println(Arrays.toString(arr2));
// 结束时间
long end = System.currentTimeMillis();
// 获取程序执行时间 { 程序运行消耗时间为:1}
System.out.println("程序运行消耗时间为:" + (end - start));
}
}
StringBuilder 类 {#StringBuilder 类}
String
存在一些问题, 由于 String
类的对象内容不可改变,所以每当进行字符串拼接时,总是会在内存中创建一个新的对象。例如:
public class StringBuilderDemo1 {
public static void main(String[] args) {
// test01();
StringBuilder sb = new StringBuilder("hello");
<span class="token comment">// 对象. 方法名();</span>
sb<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"ab"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"好"</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token boolean">true</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token number">66</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"sb ="</span> <span class="token operator">+</span> sb<span class="token punctuation">.</span><span class="token function">toString</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">long</span> start <span class="token operator">=</span> <span class="token class-name">System</span><span class="token punctuation">.</span><span class="token function">currentTimeMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// 23</span>
<span class="token class-name">StringBuilder</span> sb2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">StringBuilder</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">100000</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
sb2<span class="token punctuation">.</span><span class="token function">append</span><span class="token punctuation">(</span><span class="token string">"a"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">long</span> end <span class="token operator">=</span> <span class="token class-name">System</span><span class="token punctuation">.</span><span class="token function">currentTimeMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"消耗时间:"</span> <span class="token operator">+</span> <span class="token punctuation">(</span>end <span class="token operator">-</span> start<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">// String 拼接效率低 2235</span>
<span class="token keyword">public</span> <span class="token keyword">static</span> <span class="token keyword">void</span> <span class="token function">test01</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">String</span> str <span class="token operator">=</span> <span class="token string">"a"</span> <span class="token operator">+</span> <span class="token string">"b"</span> <span class="token operator">+</span> <span class="token string">"c"</span> <span class="token operator">+</span> <span class="token string">"d"</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"str ="</span> <span class="token operator">+</span> str<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">long</span> start <span class="token operator">=</span> <span class="token class-name">System</span><span class="token punctuation">.</span><span class="token function">currentTimeMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">String</span> s <span class="token operator">=</span> <span class="token string">"a"</span><span class="token punctuation">;</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span> i <span class="token operator"><</span> <span class="token number">100000</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
s <span class="token operator">+=</span> <span class="token string">"a"</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">long</span> end <span class="token operator">=</span> <span class="token class-name">System</span><span class="token punctuation">.</span><span class="token function">currentTimeMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"消耗时间:"</span> <span class="token operator">+</span> <span class="token punctuation">(</span>end <span class="token operator">-</span> start<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
}
在
API
中对String
类有这样的描述:字符串是常量,它们的值在创建后不能被更改。
根据这句话分析我们的代码,其实总共产生了三个字符串,即 "Hello" 、 "World" 和 "HelloWorld" 。引用变量 s 首先指向 Hello 对象,终指向拼接出来的新字符串对象,即 HelloWord 。
由此可知,如果对字符串进行拼接操作,每次拼接,都会构建一个新的
String
对象,既耗时,又浪费空间。为了解 决这一问题,可以使用java.lang.StringBuilder
类。
StringBuilder 概述 {#StringBuilder 概述}
查阅 java.lang.StringBuilder
的 API,StringBuilder
又称为可变字符序列,它是一个类似于 String
的字符串缓冲 区,通过某些方法调用可以改变该序列的长度和内容。
原来 StringBuilder
是个字符串的缓冲区,即它是一个容器,容器中可以装很多字符串。并且能够对其中的字符串进 行各种操作。
它的内部拥有一个数组用来存放字符串内容,进行字符串拼接时,直接在数组中加入新内容。StringBuilder
会自动 维护数组的扩容。原理如下图所示:(默认 16 字符空间,超过自动扩充), 简单来说就是:
StringBuilder 类的作用是一个可变的字符串, 拼接效率高
构造方法 {#构造方法}
根据 StringBuilder
的 API 文档,常用构造方法有 2 个:
public StringBuilder()
:构造一个空的StringBuilder
容器。public StringBuilder(String str)
:构造一个StringBuilder
容器,并将字符串添加进去
常用方法 {#常用方法}
StringBuilder
常用的方法有 2 个:
public StringBuilder append(...)
:添加任意类型数据的字符串形式,并返回当前对象自身。public String toString()
:将当前StringBuilder
对象转换为String
对象。
public class StringBuilderDemo2 {
public static void main(String[] args) {
// 创建对象
StringBuilder sb = new StringBuilder();
// append(; 可以添加任意类型, 参数是 Object
sb.append("Hello");
sb.append(true);
sb.append(1999);
sb.append('A');
// 将 StringBuilder 转换为 String 类型
String s = sb.toString();
// 结果是拼接字符串:s = Hellotrue1999A
System.out.println("s =" + s);
// 链式编程
String s1 = sb.append("hello")
.append('a')
.append(999.0)
.append(1000)
.toString();
System.out.println("s1 =" + s1);
}
}
备注:StringBuilder 已经覆盖重写了 Object 当中的 toString 方法。
包装类 {#包装类}
概述 {#概述}
Java 提供了两个类型系统,
基本类型
与引用类型
,使用基本类型在于效率,然而很多情况,会创建对象使用,因为对象可以做更多的功能,如果想要我们的基本类型像对象一样操作,就可以使用基本类型对应的包装类,如下:
public static void main(String[] args) {
// int 类型转换为 String
String s = 10 + ""; // + 和字符串在一起表示连接, 会将其他内容连接到字符串中
System.out.println(s);
<span class="token comment">// String 转换成 int 类型(字符串中要是数字才能转换)</span>
<span class="token comment">// Integer 类:static int parseInt(String s)</span>
<span class="token keyword">int</span> i <span class="token operator">=</span> <span class="token class-name">Integer</span><span class="token punctuation">.</span><span class="token function">parseInt</span><span class="token punctuation">(</span><span class="token string">"20"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"i ="</span> <span class="token operator">+</span> i<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// "2.66"</span>
<span class="token keyword">double</span> v <span class="token operator">=</span> <span class="token class-name">Double</span><span class="token punctuation">.</span><span class="token function">parseDouble</span><span class="token punctuation">(</span><span class="token string">"2.66"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"v ="</span> <span class="token operator">+</span> v<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
| 基本类型 | 对应的包装类 | |:-------:|:-------------:| | byte | Byte | | int | Integer | | short | Short | | long | Long | | double | Double | | char | Character | | boolean | Boolean | | float | Float |
装箱与拆箱 {#装箱与拆箱}
基本类型与对应的包装类对象之间,来回转换的过程称为"装箱"与"拆箱":
- 装箱:从基本类型转换为对应的包装类对象。
- 拆箱:从包装类对象转换为对应的基本类型。
` 用 Integer 与 int 为例:`` - `` 基本数值----> 包装对象 `
Integer i1 = new Integer(4);
Integer i2 = Integer.valueOf(4);
- 包装对象----> 基本数值
int num = i.intValue();
自动装箱与拆箱 {#自动装箱与拆箱}
由于我们经常要做基本类型与包装类之间的转换,从 Java 5(JDK 1.5)开始,基本类型与包装类的装箱、拆箱动作 可以自动完成。例如:
public static void main(String[] args) {
// int -> Integer
// Integer(int value)
// static Integer valueOf(int i)
Integer i1 = new Integer(30);
System.out.println("i1 =" + i1);
<span class="token class-name">Integer</span> i2 <span class="token operator">=</span> <span class="token class-name">Integer</span><span class="token punctuation">.</span><span class="token function">valueOf</span><span class="token punctuation">(</span><span class="token number">50</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">System</span><span class="token punctuation">.</span>out<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span><span class="token string">"i2 ="</span> <span class="token operator">+</span> i2<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 自动装箱: 将基本数据类型转成对应的包装类</span>
<span class="token class-name">Integer</span> i3 <span class="token operator">=</span> <span class="token number">60</span><span class="token punctuation">;</span>
<span class="token comment">// Integer -> int</span>
<span class="token comment">// int intValue(): 返回 Integer 中的 int 值</span>
<span class="token class-name">Integer</span> i4 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Integer</span><span class="token punctuation">(</span><span class="token number">70</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">int</span> num <span class="token operator">=</span> i4<span class="token punctuation">.</span><span class="token function">intValue</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">// 自动拆箱: 将包装类转成基本数据类型</span>
<span class="token keyword">int</span> num2 <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Integer</span><span class="token punctuation">(</span><span class="token number">80</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
### 反编译 {#反编译}
> https://mobaijun.lanzous.com/icb77if
>
>
```java
public static void main(String[] args) {
Integer i1 = 10; // 自动装箱: 底层使用 Integer.valueOf()
int i2 = i1; // 自动拆箱: i1.intValue()
<span class="token comment">// .java(源代码) -> 编译 -> .class 文件</span>
<span class="token comment">// .class 文件 -> 反编译 -> .java(源代码)</span>
<span class="token class-name">Integer</span> i3 <span class="token operator">=</span> <span class="token number">20</span><span class="token punctuation">;</span> <span class="token comment">// Integer i3 = Integer.valueOf(20)</span>
i3 <span class="token operator">+=</span> <span class="token number">10</span><span class="token punctuation">;</span>
<span class="token comment">// i3 = i3 + 10;</span>
<span class="token comment">// i3 + 10; -> i3.intValue() + 10; -> int</span>
<span class="token comment">// i3 = Integer.valueOf(i3.intValue() + 10);</span>
<span class="token punctuation">}</span><span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span></code></pre>
```