- 参考文档:JDK API 1.6 中文手册
- 参考视频教程:java教程
文章目录
〇、引用类型的使用方式
- java中的数据类型分成两种
- 基本数据类型:
int/short/boolean...
- 引用数据类型:
数组/String/类对象...
- 基本数据类型:
- 使用引用数据类型的步骤
- 导包:
import 包路径.类名称;
- 如果需要使用的目标类,和当前类处于同一个包下,则可以省略导包语句
- 只有
java.lang
包下的内容不需要导包,其他的包都要import
语句
- 创建:
类名称 对象名 = new 类名称();
- 使用:
对象名.成员方法名()
- 导包:
一、Scanner类
-
导包:
import java.util.Scanner;
-
说明:一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。
-
功能:实现键盘输入数据到程序当中
-
构造方法摘要:
-
方法摘要(部分):
-
使用示例
import java.util.Scanner; // 导包 public class scanner { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 创建 int num = scanner.nextInt(); // 使用 System.out.println("输入的数字是:" + num); } }
二、Random类
- 导包:
import java.util.Random;
- 说明:此类的实例用于生成伪随机数流。此类使用 48 位的种子,使用线性同余公式对其进行了修改
- 功能:生成随机数
- 构造方法摘要:
- 方法摘要:
- 使用示例
import java.util.Random; public class scanner { public static void main(String[] args) { // 不给出显式种子值,会自动使用系统时钟相关数据生成种子值 Random random = new Random(); //int num = random.nextInt(); // 在int范围内随机返回一个int int num = random.nextInt(3); // 在[0,3)范围内随机返回一个int System.out.println("随机数字是:" + num); } }
三、包装类
-
出于性能考虑,java中基本数据类型不是对象,但java提供了包装类,可以把基本数据类型当成类处理
-
包装类是一种引用数据类型,都位于
java.lang
包下,可以直接使用 -
以下是各种基本数据类型和其包装类的对应关系
基本数据类型 包装类 int Integer double Double float Float char Character byte Byte short Short long Long boolean Boolean -
包装类没有无参构造方法,一般既可以用基本数据类型值,也可以用表示数值的字符串来构造包装类。比如
Integer
类的构造方法摘要如下
使用其他包装类时也类似new Double(5.0) = new Double("5.0") new Integer(5) = new Integer("5")
-
所有的包装类都是不可变的,它们创建的对象也是不可变对象。也就是说其对象一旦创建,其内容不可修改。
String
也是一种不可变类 -
数值包装类都很类似,以下是他们都具备的常见方法
-
都具有把对象转为基本类型值的方法(每个数值类都有全部这些,可以返回类型转换后的值)
.doubleValue() .floatValue() .intValue() .longValue() .shortValue() .byteValue() // 使用示例 new Double(12.4).intValue() // 返回 12 new Integer(12).doubleValue() // 返回 12.0
-
都具有常量
MAX_VALUE
和MIN_VALUE
Byte/Short/Long/Integer
: 表示最大值和最小值Float/Double
: 表示最大值和最小正值
-
都有
.compareTo(x)
方法,用来把对象值和对象x
比较,大于返回1;等于返回0;小于返回-1new Double(12.4).compareTo(new Double(12.3)) // 返回1 new Double(12.4).compareTo(new Double(12.4)) // 返回0 new Double(12.4).compareTo(new Double(12.5)) // 返回-1
-
都有一个静态方法
.valueOf(String s)
,可以创建一个对象,并把它初始化为字符串s
的值Double doubleObject = Double.valueOf("12.4");
-
都有两个静态重载方法,用于返回字符串字面值及进行进制转换
// XXX可以是short/long/int/double/float public static XXX parseXXX(String s) //把十进制写法的字符串转为十进制值 public static XXX parseXXX(String s, int radix) //把radix进制写法的字符串转为十进制值(如果s不是radix进制的写法,会报错) // 示例 Integer.parseInt("11",2) 返回3
-
转字符串方法
.toString()
Integer.toString(num) //十进制形式转字符串 Integer.toString(num,radix) //radix进制形式转字符串
-
-
包装类和基本数据类型的自动转换
-
从JDK1.5+开始,支持自动装箱和拆箱
装箱
:基本类型转为包装类型拆箱
:包装类型转为基本类型
-
如果一个对象出现在需要基本类型值的环境下,编译器会自动拆箱,反之会自动装箱
自动装箱:Integer intObject = 2; 自动变为 Integer intObject = new Integer(2); 自动拆箱:int i = new Integer(1); 自动变为 int i = 1;
-
示例:
Integer[] intArry = { 1,2,3}; //三次自动装箱 System.out.println(intArray[0]+intArray[1]+intArray[2]); //三次自动拆箱
-
四、ArrayList类(集合)
- 导包:
import java.util.ArrayList;
- 说明:
ArrayList
类是一种list列表(存储有序的、可重复的、可变长度的数据)的实现。java中还有vector
和LinkedList
两种list接口vector
类线程安全,而ArrayList
线程不安全,但它们底层都是数组实现LinkedList
类使用双向链表实现,而ArrayList
使用数组实现,但它们都线程不安全- 以上三种list接口都是
泛型
- 功能:List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小
- 构造方法摘要:
- 方法摘要:
- 基础使用示例
package cn.idcast.day04.demo05; import java.util.ArrayList; public class arrayList { public static void main(String[] args) { // 创建一个集合 ArrayList<String> list = new ArrayList<String>(); // 这里右边尖括号中的内容可以省略 // 添加元素 list.add("Bill"); list.add("Tom"); list.add("Marry"); System.out.println(list); // 打印 [Bill, Tom, Marry] // 用索引获取元素 String name = list.get(0); System.out.println(name); // 打印 Bill // 删除元素 String removed = list.remove(0); System.out.println(removed);// 打印 Bill System.out.println(list); // 打印 [Tom, Marry] // 获取集合的大小(其中元素个数) System.out.println(list.size()); // 打印 2 // 遍历集合 for(int i=0;i<list.size();i++) System.out.println(list.get(i)); } }
- 注意:
- 对于
ArrayList
集合来说,直接打印得到的不是地址值,而是内容,若是空集合,打印会得到[]
。这是由于此类重写了toString
方法 ArrayList
集合是一种泛型类型,因此其存储的都是地址值,也就是说ArrayList
只能存储引用类型的数据。要想存储基本类型数据,需要使用基本数据类型的包装类import java.util.ArrayList; public class arrayList { public static void main(String[] args) { // 创建一个集合 ArrayList<Integer> list = new ArrayList<Integer>(); // 这里右边尖括号中的内容可以省略 // 添加元素 list.add(100); list.add(200); list.add(300); System.out.println(list); // 打印 [100, 200, 300] } }
- 对于
五、Arrays类
- 导包:
import java.util.Arrays;
- 说明:
Arrays
类是一个和数组相关的工具类,里面提供了大量静态方法,用来实现对数组的常见操作- 通常不需要创建
Arrays
类对象实例,直接通过类名使用其静态方法即可
- 常用方法:
- 各种类型数组转字符串
public static String toSrting(各类数组)
:这个函数有很多重载,参数可以是各类型数组。默认格式[元素1,元素2,...,元素n]
- 就地排序(默认升序)
public static void sort(各类数组)
- 如果是数值类型,按数值类型升序
- 如果是字符类型,按字母升序
- 如果是自定义类型,这个类型要有
comparable
或comparator
接口的支持
- 各种类型数组转字符串
六、Math类
-
导包:
import java.util.Math;
-
说明:
Arrays
类是一个数学计算相关的工具类,里面提供了大量静态方法,用来实现常见的数学运算- 通常不需要创建
Math
类对象实例,直接通过类名使用其静态方法即可
-
常用方法
-
常量:
Math.PI
、Math.E
-
三角函数方法
-
指数函数方法
-
取整方法
-
最值方法
-
随机数方法
public static double random()
:返回一个[0.0 , 1.0)
之间的double
- 还可以用
Random
类import java.util.Random //先import Random包 int index = new Random().nextInt(N); //index是(0,N]中的任意整数
-
七、String类
1. 概述
- 导包:
String
类位于java.lang
包,不需要导包 - 特点:
String
类代表字符串。Java 程序中的所有字符串字面值(如"abc"
)都作为此类的实例实现。- 字符串是常量(不可变类);它们的值在创建之后不能更改。所以字符串是可以共享使用的(当出现相同的字面值时,会指向堆区的同一个对象)
- 字符串效果上是
char[]
数组,但是底层原理是byte[]
字节数组
2. 创建字符串
-
构造方法摘要
-
常用的构造方法
// 1. 创建一个空白字符串"" String str1 = new String(); // str1 = "" // 2. 通过字符数组创建 char[] charArray = { 'A','B','C'}; String str2 = new String(charArray); // str2 = "ABC" // 3. 通过字节数组创建 byte[] byteArray = { 97,98,99}; // ABC的ASCII码 String str3 = new String(byteArray ); // str3 = "ABC" // 4. 通过字面值直接创建 String str4 = "ABC"; // str4 = "ABC"
3. 字符串常量池
- 字符串常量池是堆中的一块区域,(只有)使用字符串字面值创建的字符串,位于字符串常量池中。
- 字符串常量池中每条记录存储着一个字节数组的地址,这个字节数组就是字符串的底层本质,它也存储在堆中
- 示例
-
示例代码
public class demo06_StringPool { public static void main(String[] args) { String str1 = "ABC"; String str2 = "ABC"; char[] charArray = { 'A','B','C'}; String str3 = new String(charArray); System.out.println(str1 == str2); // true System.out.println(str1 == str3); // false System.out.println(str2 == str3); // false } }
-
看一下内存中的存储情况
- 首先
str1
通过字符串字面值构造的字符串对象,于是jvm在堆中建立了byte数组,然后在字符串常量池中创建一个String对象(假设其地址是0x666
)指向它,最后把str1
指向这个常量池中的对象。 - 当
str2
通过相同的字符串字面值构造时,jvm在字符串常量池中找到了一样的String对象记录,于是直接把其地址0x666
赋值给str2
- 通过char数组创建
str3
时,jvm先把char数组转换为byte数组存储于堆中,再在堆中非字符串常量池区域建立一个String对象(假设它的地址是0x999
)指向它,最后把str3
指向这个String对象。
- 首先
-
输出分析:java中使用
==
进行比较时- 若比较的是基本类型:直接比较字面值
- 若比较的是引用类型:直接引用值(地址值)
由于
str1
和str2
指向堆中同一个String对象,而str3
指向不同的String对象,所以输出为true
,false
,false
-
4. 常用方法
- String类提供了非常多方法,具体可以查API手册,这里仅说明常用方法
- 字面值比较方法:
public boolean equals(object obj)
:参数可以是任何对象,只有参数是一个字符串并有相同的字面值才返回true
- 任何对象都能用object进行接受
equals
方法具有对称性,a.equals(b)
和b.equals(a)
效果相同- 若比较双方一个常量一个变量,推荐把常量字符串写在前面:
"hello".equals(str)
,避免str
为null
时出现空指针异常
- 忽略大小写字面值比较方法
public boolean equalsIgnoreCase(String str)
- 获取字符串长度
public int length()
- 拼接字符串
public String concat(String str)
- 获取指定索引位置的字符
public char charAt(int index)
- 搜索子串
public int indexOf(String str)
:返回str
在本字符串中首次出现的位置。若没找到,返回-1
- 获取子串
public String subString(int index)
:截取并返回从index
到最后的子串
获取子串public String subString(int begin,int end)
:截取并返回索引在[begin,end)
的子串 - 转换为字符数组
public char[] toCharArray()
- 转换为字节数组
public byte[] getBytes()
- 替换子串
public String replace(charSequence oldString , charSequence newString)
:将所有出现的老字符串替换为新串,然后返回。这里charSequence
就是说可以接受字符串类型 - 按参数规则切分字符串
public String[] split(String regex)
注意这里的参数其实是一个正则表达式。比如要按String str = "aaa,bbb,ccc"; String[] array = str.split(","); // ["aaa","bbb","ccc"]
.
切分,参数需要写\\.
(.
在正则表达式中是特殊的)
- 字面值比较方法: