Skip to content

第三章 基本类型、字符串与数组 v1.0 ​

第一部分 变量的声明 ​

  1. 任何局部变量使用前必须赋初值,直接使用会报错;类变量与数组生成时会初始化默认值,可以不赋初值
  2. Java中,在类型兼容的情况下(如boolean不兼容其他基本类型),小类型可以自动转换为大类型,如:char可以转为int
  3. 在类型兼容的情况下,大类型可以强制类型转换为小类型,如:(short)intNum

第二部分 基本数据结构 ​

一、Java基本类型 ​

分为原始数据类型(基本数据类型,8种)与引用数据类型(包装类型)

声明常量:final int X=1; //命名规范全大写

1.8种内置数据类型 ​

基本类型包装类型说明初始值范围
byteByte字节整型0-2^7 ~ 2^7-1
shortShort短整型0-2^15 ~ 2^15-1
intInteger整型0-2^31 ~ 2^31-1
longLong长整型0-2^63 ~ 2^63-1
floatFloat单精度浮点型0.0(32位)
doubleDouble双精度浮点型0.0(64位)
charCharacterUnicode字符01或2字节
booleanBoolean布尔值falsetrue或false

2.包装类型 ​

a.Number类 ​

Number类是java.lang包下的一个抽象类,提供了将包装类型拆箱成基本类型的方法

所有基本数值类型包括包装类型(Character&Boolean除外)都继承了Number类,并且声明为final不可继承改变

Number类实例方法:

方法作用
byteValue()以byte形式返回指定数字的值
doubleValue()以double形式返回指定数字的值
floatValue()以float形式返回指定数字的值
intValue()以int形式返回指定数字的值
longValue()以long形式返回指定数字的值
shortValue()以short形式返回指定数字的值
b.装箱与拆箱 ​

编译器支持(装箱与拆箱在Java中由编译器特别支持)的包装称为装箱,当内置类型被当作对象使用的时候,编译器会把内置类型装箱为包装类。相似的,编译器也可以把一个对象拆箱为内置类型。

c.包装类型的特有功能 ​
  1. 将基本类型的数据转为字符串类型,例:String num = Integer.toString();
  2. 将字符串类型数值转换成真实数据,例:int number = Integer.parseInt("123");
d.基本类型与包装类型的优缺点 ​

基本类型:

优点:占用内存空间相对较小,在计算性能上优于对象类型

缺点:但只能存储数值,具备操作数据的方法

包装类型:

优点:实际上是某个类的实例,拥有属性方法等,而非单一存储数值,提供各种对数值的操作方法

缺点:但代价就是牺牲一些性能并占用更多的内存空间

3.Java计数方法(进制) ​

Java程序中支持书写二进制、八进制、十六进制的数据,分别需要以0B或者0b、0、0X或者0x开头。

例:int i=0x61;表示将十六进制的61(十进制为97)赋给i,若按十进制(默认)输出为97

二、常用类型 ​

1.字符类(Character) ​

在Java中,Character类提供了一系列方法来操纵字符

字符类常用方法 ​
方法作用
characterObj.isLetter()是否是一个字母
characterObj.isDigit()是否是一个数字字符
characterObj.isWhitespace()是否一个空格
characterObj.isUpperCase()是否是大写字母
characterObj.isLowerCase()是否是小写字母
characterObj.toUpperCase()指定字母的大写形式
characterObj.toLowerCase()指定字母的小写形式
characterObj.toString()返回字符的字符串形式,字符串的长度仅为1

2.字符串类(String) ​

字符串对象一旦被创建,其值是不能改变的,但可以使用其他变量重新赋值的方式进行更改

a.创建字符串对象 ​
  1. 直接使用"字符串"定义

String str = "字符串"; //不赋初值为null

  1. 通过构造函数创建对象

String str = new String(字符串/字符数组/字节数组/...) //更多详见API文档

b.注意要点 ​
  1. 两种创建字符串对象的方式的区别

以"字符串"定义给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份。

而通过构造器new对象,每new-次都会产生一 个新对象, 放在堆内存中。

java
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // true
char[] chs = {'a','b','c'};
String s3 = new String(chs);
String s4 = new String(chs) ;
System.out.println(s3 == s4); // false
  1. 创建对象的个数
java
String s1 = "abc";  //创建了一个对象(在常量池中创建了字面量"abc")
String s2 = new String("abc");  //创建了一个对象(字面量"abc"已经存在)

String s3 = new String("ab");  //创建了两个对象(字面量"ab"与新的字符串对象"ab")
String s4 = "ab";  //没有创建对象
  1. 字符串拼接原理

常量与常量的拼接结果在常量池(不会存在相同内容常量),原理是编译期优化

只要其中有一个是变量,结果就在堆中,变量拼接的原理是StringBuilder

java
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
String s4 = "a" + "b" + "c";
System.out.println(s1 == s3);  //结果为false
System.out.println(s1 == s4);  //结果为true
c.格式化字符串方法 ​

格式化字符串方法:String.format("格式化字符串"[,参数列表]);

转换符说明
%s字符串类型
%c字符类型
%b布尔类型
%d(十进制)整数类型
%x(十六进制)整数类型
%o(八进制)整数类型
%f(十进制)浮点类型
%a(十六进制)浮点类型
%e指数类型

搭配转换符使用

转换符说明示例
+为正数或者负数添加符号("%+d",15) //+15
-左对齐("%-5d",15) //|15 |
0数字前面补0(加密常用)("%04d", 99) //0099
空格在整数之前添加指定数量的空格("% 4d", 99) //| 99|
,以“,”对数字分组(常用显示金额)("%,f", 9999.99) //9,999.990000
(使用括号包含负数("%(f", -99.99) //(99.990000)
#如果是浮点数则包含小数点如果是16进制或8进制则添加0x或0("%#x", 99) //0x63("%#o", 99) //0143
<格式化前一个转换符所描述的参数("%f和%<3.2f", 99.45) //99.450000和99.45
$被格式化的参数索引("%1$d,%2$s", 99,"abc") //99,abc
d.字符串类常用方法 ​
方法作用
stringObj1.equals(stringObj2)比较字符串内容是否相同
stringObj1.concat(stringObj2)返回将字符串与另一个字符串连接后的结果字符串
stringObj.length()获取字符串长度
stringObj.substring(begin,end)截取指定范围(索引[begin,end-1])的内容
stringObj.split(c)按指定的分割符将目标字符串分割为字符串数组
stringObj.trim()移除字符串两侧的空白字符或其他预定义字符
stringObj.replace(old,new)将字符串中的指定字符串替换成新的字符串
stringObj.replaceFirst(regex,new)将字符串中匹配某正则的首个子串替换成新的字符串
stringObj.replaceAll(regex,new)将字符串中匹配某正则的所有子串替换成新的字符串
stringObj.matches(regex)确认字符串模式是否与某正则的模式匹配
stringObj.indexOf(value,[index])查找字符串中[从index开始]首次出现的索引位置,未找到返回-1
stringObj.lastlndexOf(value,[index])查找字符串中[从index开始]最后出现的索引位置,未找到返回-1
stringObj.charAt(index)在字符串内根据指定的索引查找字符
stringObj.toLowerCase()所有字符全部转换成小写,而非字母的字符不受影响
stringObj.toUpperCase()所有字符全部转换成大写,而非字母的字符不受影响

3.StringBuffer类与StringBuilder类 ​

String类生成之后无法对其进行修改,使用StringBuffer类与StringBuilder类可以提供对字符串做修改的方法,StringBuffer 类是可变字符串类,创建 StringBuffer 类的对象后可以随意修改字符串的内容。每个 StringBuffer 类的对象都能够存储指定容量的字符串,如果字符串的长度超过了 StringBuffer 类对象的容量,则该对象的容量会自动扩大。

a.StringBuffer类与StringBuilder类区别 ​
  • StringBuilder相较StringBuffer有速度优势,所以多数情况下建议使用StringBuilder类。
  • StringBuffer是线程安全的,在应用程序要求线程安全的情况下,则必须使用StringBuffer类。
b.StringBuffer支持常用方法 ​
方法作用
stringBufferObj.append(s)将指定的字符串追加到此字符序列
stringBufferObj.reverse()将此字符序列用其反转形式取代
stringBufferObj.setCharAt(idx,c)在字符串的指定索引位置替换一个字符
stringBufferObj.deleteCharAt(index)移除字符串序列中指定位置的字符
stringBufferObj.delete(begin,end)移除字符串序列中子字符串(索引[begin,end-1])的字符
stringBufferObj.insert(pop,type)将type类型的字符串表示形式插入此序列pop位置
stringBufferObj.replace(start,end,str)使用给定String中的字符替换此序列的子字符串中的字符
c.使用环境 ​
  • 操作少量的数据使用 String。
  • 单线程操作大量数据使用 StringBuilder。
  • 多线程操作大量数据使用 StringBuffer。

三、数组 ​

1.定义 ​

Java中数组是用来存储固定大小的同类型元素(与C++类似)。

2.一维数组的声明与创建 ​

  • 声明一个数组:类型名[] 数组名;
  • 使用new操作符创建一个数组:类型名[] 数组名=new 类型名[数组元素数量];
  • 创建并初始化一个数组:类型名[] 数组名={元素1, 元素2, ...}; //数组长度为元素个数

注:未赋值的数字类型默认为0,字符串类型默认为"null"

3.访问数组元素 ​

Java中数组元素通过索引访问(Java中数组索引从0开始),例:arr[0]=10;

4.获取数组的长度 ​

在Java中,可以通过length属性来计算一个数组的长度,也就是所存储的元素的数量

例:System.out.println(数组名.length); //打印数组长度

5.多维数组 ​

基本操作都类似于一维数组,下面指出常用的一些操作:

java
//创建并初始化一个数组
类型名[][] 数组名={{元素1,元素2,...},{元素1,元素2,...}...};  
//访问数组元素
int[][] arr = {{1,2,3},{4,5,6}}; 
System.out.print(arr[0][1]);    //输出结果为2
//获取数组长度
System.out.println("第一维数组长度: " + arr.length);  //输出2
System.out.println("第二维数组长度: " + arr[0].length);  //输出3

6.使用java.util.Arrays工具类处理数组的常用方法 ​

方法作用
Arrays.toString(array)将一个数组转换成一个字符串
Arrays.equals(arrayA,arrayB);比较数组元素的个数和对应位置的元素是否相等
Arrays.fill(array[,begin,end],value)把数组所有(索引[begin,end-1]位置)的元素都赋值为value
Arrays.sort(array[,begin,end])把数组所有(索引[begin,end-1]位置)的元素进行排序
Arrays.copyOf(array,length)复制数组,length 表示复制后的新数组的长度
Arrays.CopyOfRange(array,begin,end)复制数组索引[begin,end-1]位置的元素
Arrays.binarySearch(array, key)(使用前提:已排序)二分查找,返回数组索引,未找到返回负值