第三章 基本类型、字符串与数组 v1.0
第一部分 变量的声明
- 任何局部变量使用前必须赋初值,直接使用会报错;类变量与数组生成时会初始化默认值,可以不赋初值
- Java中,在类型兼容的情况下(如boolean不兼容其他基本类型),小类型可以自动转换为大类型,如:char可以转为int
- 在类型兼容的情况下,大类型可以强制类型转换为小类型,如:
(short)intNum
第二部分 基本数据结构
一、Java基本类型
分为原始数据类型(基本数据类型,8种)与引用数据类型(包装类型)
声明常量:final int X=1; //命名规范全大写
1.8种内置数据类型
| 基本类型 | 包装类型 | 说明 | 初始值 | 范围 |
|---|---|---|---|---|
| byte | Byte | 字节整型 | 0 | -2^7 ~ 2^7-1 |
| short | Short | 短整型 | 0 | -2^15 ~ 2^15-1 |
| int | Integer | 整型 | 0 | -2^31 ~ 2^31-1 |
| long | Long | 长整型 | 0 | -2^63 ~ 2^63-1 |
| float | Float | 单精度浮点型 | 0.0 | (32位) |
| double | Double | 双精度浮点型 | 0.0 | (64位) |
| char | Character | Unicode字符 | 0 | 1或2字节 |
| boolean | Boolean | 布尔值 | false | true或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.包装类型的特有功能
- 将基本类型的数据转为字符串类型,例:
String num = Integer.toString(); - 将字符串类型数值转换成真实数据,例:
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.创建字符串对象
- 直接使用"字符串"定义
String str = "字符串"; //不赋初值为null
- 通过构造函数创建对象
String str = new String(字符串/字符数组/字节数组/...) //更多详见API文档
b.注意要点
- 两种创建字符串对象的方式的区别
以"字符串"定义给出的字符串对象,在字符串常量池中存储,而且相同内容只会在其中存储一份。
而通过构造器new对象,每new-次都会产生一 个新对象, 放在堆内存中。
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- 创建对象的个数
String s1 = "abc"; //创建了一个对象(在常量池中创建了字面量"abc")
String s2 = new String("abc"); //创建了一个对象(字面量"abc"已经存在)
String s3 = new String("ab"); //创建了两个对象(字面量"ab"与新的字符串对象"ab")
String s4 = "ab"; //没有创建对象- 字符串拼接原理
常量与常量的拼接结果在常量池(不会存在相同内容常量),原理是编译期优化
只要其中有一个是变量,结果就在堆中,变量拼接的原理是StringBuilder
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); //结果为truec.格式化字符串方法
格式化字符串方法: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.多维数组
基本操作都类似于一维数组,下面指出常用的一些操作:
//创建并初始化一个数组
类型名[][] 数组名={{元素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); //输出36.使用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) | (使用前提:已排序)二分查找,返回数组索引,未找到返回负值 |