Java数据类型与字符串操作全解析
基本数据类型
数据类型 | 关键字 | 内存大小 | 默认值 | 取值范围 | 说明 |
---|---|---|---|---|---|
整型 | byte | 1 字节 (8位) | 0 | -128 ~ 127 | 用于处理小型数据,如文件流 |
short | 2 字节 (16位) | 0 | -32768 ~ 32767 | 不常用,可兼容16位硬件 | |
int | 4 字节 (32位) | 0 | 约 -21亿 ~ 21亿 | 最常用、默认的整型 | |
long | 8 字节 (64位) | 0L | 范围极大 | 用于大整数,值后需加 L 或 l | |
浮点型 | float | 4 字节 (32位) | 0.0f | 单精度,约6-7位有效数字 | 值后需加 F 或 f |
double | 8 字节 (64位) | 0.0d | 双精度,约15位有效数字 | 最常用、默认的浮点型 | |
字符型 | char | 2 字节 (16位) | '\u0000' | 0 ~ 65535 | 存储单个 Unicode 字符,用单引号 '' |
布尔型 | boolean | 无明确规定 | false | true 或 false | 表示逻辑真或假,不参与数值运算 |
引用数据类型
引用数据类型存储的是对象在堆内存中的地址(引用),变量本身存储在栈内存中。除了以下列出的几种,所有你自己创建的类也都是引用数据类型。
字符串
基本方法
1.创建字符串:
咱们在创建字符串通常方式是:
String s1 = new String("hello world");
将字符串作为对象来处理,也就是类似创建类的对象一样创建字符串的对象。
同样,其实我们也是可以直接赋值的方式获取字符串的对象:
String s2 = "hello world";
也可以创建一个字符类型地数组,根据其内容创建字符串对象:
char[] s = {'h','e','l','l','o',' ','w','o','r','l','d'};
String s3 = new String(s);
2.连接字符串:
如果我们想要实现两个字符串的拼接,这其实仅需用"+"运算符就可以办到:
String s1 = "hello";
String s2 = "world";
String s3 = s1 + ' ' + s2;
System.out.println(s3);//hello world
如果将字符串同其他的数据类型数据进行连接,则会将其他数据类型地数据直接转换成字符串。
注意:
int a = 1,b = 4,c = 5;
System.out.println("a = " + a + " b = " + b + c + "是c的值");
//a = 1 b = 45是c的值
System.out.println("a = " + a + " b = " + (b + c) + "是c的值");
//a = 1 b = 9是c的值
括号的优先级比加号优先级高,以至于下面的代码会先执行(b + c)。
3.存储原理:
由于String是引用数据类型,所以其存储会与基本数据类型有所区别。
如果是下面的情况:
String s1 = "abc";
那么,JVM会先检查该字符串"abc"在串池是否存在,如果不存在就会创建新的,如果存在,则会复用这个字符串,而不会在串池重新创建新的字符串。(StringTable(串池)在堆内存中)
String s2 = new String("abc");
而如果使用new,就会在堆内存开辟空间创建String类,并通过s2记录对象地址值。
4.==与equals():
如何比较两个引用数据类型的大小呢?
这就需要Java给咱们提供的equals()方法:
public class Csdn1 {public static void main(String[] args) {String s3 = new String("hello");String s4 = new String("hello");System.out.println(s3.equals(s4));//true}
}
==:对于两个基本数据类型的变量比较的是数据值,而对于两个引用数据类型比较的是地址值。
equals():用这种方法比较两个用String类定义的对象,
总是比较内容:
equals()
比较字符串的内容,而不是内存地址注意空指针:调用
equals()
方法的对象不能为null推荐写法:把字面量或已知非空对象放在
equals()
前面区分大小写:如果需要不区分大小写的比较,使用
equalsIgnoreCase()
5.equals()重写:
如果想比较两个类的值,就需要将equals()方法重写,也就是将该方法从Object类中继承并覆盖。
这里我定义一个People类和一个继承People类的Student类:
public class Student extends People{private double score;public Student(int id, String name) {super(id, name);}public Student(int id, String name, double score) {super(id, name);this.score = score;}
}
public class People {private int id;private String name;public People(int id, String name) {this.id = id;this.name = name;}
}
这里我就是为了举例子,在People重写一个equals()方法:
1.判断是否为同一对象
2.将不是People类对象筛除
3.强转想比较的对象,并比较其成员变量
public class People {private int id;private String name;public People(int id, String name) {this.id = id;this.name = name;}public boolean equals(Object obj){//1.同一对象判断if(obj == this)return true;//2.不是People类对象if(!(obj instanceof People))return false;//3.强转成People类对象,比较两个对象的id与namePeople p = (People)obj;return p.id == this.id && p.name.equals(this.name);}
}
随后我把样例主方法放在People类内分析,来更深刻理解一下:
public class People {private int id;private String name;public boolean equals(Object obj){//同一对象判断if(obj == this)return true;//不是People类对象if(!(obj instanceof People))return false;//强转成People类对象People p = (People)obj;//比较两个对象的id与namereturn p.id == this.id && p.name.equals(this.name);}public People(int id, String name) {this.id = id;this.name = name;}public static void main(String[] args) {People p1 = new People(1,"zhangsan");System.out.println(p1.equals(p1));//p1与p1比较结果:truePeople p2 = new People(1,"zhangsan");System.out.println(p1.equals(p2));//p1与p2比较结果:truePeople p3 = new People(2,"lisi");System.out.println(p1.equals(p3));//p1与p3比较结果:falsePeople p4 = new Student(1,"zhangsan",521);System.out.println(p1.equals(p4));//p1与p4比较结果:truePeople p5 = new Student(1,"zhangsan",125);System.out.println(p4.equals(p5));//p4与p5比较结果:true,但是注意因为咱们重写方法时候没有比较score的值以至于结果返回true}
}
6.常用的String类内的方法:
(1)截取字符串:
substring(int index)
public class Csdn1 {public static void main(String[] args) {String s1 = new String("hello");System.out.println(s1.substring(2));//llo}
}
(2)获取单个字符:
charAt(int index)
public class Csdn1 {public static void main(String[] args) {String s1 = new String("hello");System.out.println(s1.charAt(1));//e}
}
(3)按照字典序比较大小:对象1.compareTo(对象2)
public class Csdn1 {public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("hellp");System.out.println(s1.compareTo(s2));//-1}
}
public class Csdn1 {public static void main(String[] args) {String s1 = new String("hello");String s2 = new String("hella");System.out.println(s1.compareTo(s2));//14}
}
StringBuilder类
StringBuilder可以看成是个容器,创建之后里面的内容是可变的。
1.构造方法:
public class Csdn1 {public static void main(String[] args) {StringBuilder sb = new StringBuilder("abc");System.out.println(sb);//abc}
}
2.类内方法:
方法类别 | 方法名 | 返回值类型 | 参数 | 描述 | 示例 |
---|---|---|---|---|---|
构造方法 | |||||
StringBuilder() | StringBuilder | 无 | 创建初始容量16的空StringBuilder | new StringBuilder() | |
StringBuilder(int capacity) | StringBuilder | capacity: 初始容量 | 创建指定初始容量的空StringBuilder | new StringBuilder(100) | |
StringBuilder(String str) | StringBuilder | str: 初始字符串 | 创建包含指定字符串的StringBuilder | new StringBuilder("Hello") | |
追加方法 | |||||
追加 | append(String str) | StringBuilder | str: 要追加的字符串 | 追加字符串 | sb.append("World") |
append(Object obj) | StringBuilder | obj: 任意对象 | 追加对象的字符串表示 | sb.append(123) | |
append(char[] str) | StringBuilder | str: 字符数组 | 追加字符数组 | sb.append(charArray) | |
append(char[] str, int offset, int len) | StringBuilder | str: 字符数组 offset: 起始位置 len: 长度 | 追加字符数组的一部分 | sb.append(chars, 0, 3) | |
append(boolean b) | StringBuilder | b: 布尔值 | 追加布尔值 | sb.append(true) | |
append(char c) | StringBuilder | c: 字符 | 追加字符 | sb.append('!') | |
append(int i) | StringBuilder | i: 整数值 | 追加整数值 | sb.append(100) | |
append(long l) | StringBuilder | l: 长整型值 | 追加长整型值 | sb.append(100L) | |
append(float f) | StringBuilder | f: 浮点值 | 追加浮点值 | sb.append(3.14f) | |
append(double d) | StringBuilder | d: 双精度值 | 追加双精度值 | sb.append(3.14) | |
插入方法 | |||||
插入 | insert(int offset, String str) | StringBuilder | offset: 插入位置 str: 要插入的字符串 | 在指定位置插入字符串 | sb.insert(5, "插入") |
insert(int offset, Object obj) | StringBuilder | offset: 插入位置 obj: 要插入的对象 | 在指定位置插入对象 | sb.insert(5, 123) | |
insert(int offset, char[] str) | StringBuilder | offset: 插入位置 str: 字符数组 | 在指定位置插入字符数组 | sb.insert(5, charArray) | |
insert(int offset, boolean b) | StringBuilder | offset: 插入位置 b: 布尔值 | 在指定位置插入布尔值 | sb.insert(5, true) | |
insert(int offset, char c) | StringBuilder | offset: 插入位置 c: 字符 | 在指定位置插入字符 | sb.insert(5, '!') | |
insert(int offset, int i) | StringBuilder | offset: 插入位置 i: 整数值 | 在指定位置插入整数值 | sb.insert(5, 100) | |
删除方法 | |||||
删除 | delete(int start, int end) | StringBuilder | start: 开始位置 end: 结束位置 | 删除指定范围的字符 | sb.delete(5, 10) |
deleteCharAt(int index) | StringBuilder | index: 要删除的字符位置 | 删除指定位置的字符 | sb.deleteCharAt(5) | |
替换方法 | |||||
替换 | replace(int start, int end, String str) | StringBuilder | start: 开始位置 end: 结束位置 str: 替换字符串 | 替换指定范围的字符 | sb.replace(5, 10, "新内容") |
setCharAt(int index, char ch) | StringBuilder | index: 位置 ch: 新字符 | 设置指定位置的字符 | sb.setCharAt(5, 'X') | |
反转方法 | |||||
反转 | reverse() | StringBuilder | 无 | 反转字符序列 | sb.reverse() |
查找方法 | |||||
查找 | indexOf(String str) | int | str: 要查找的字符串 | 查找字符串第一次出现的位置 | sb.indexOf("World") |
indexOf(String str, int fromIndex) | int | str: 要查找的字符串 fromIndex: 开始位置 | 从指定位置查找字符串 | sb.indexOf("World", 5) | |
lastIndexOf(String str) | int | str: 要查找的字符串 | 查找字符串最后一次出现的位置 | sb.lastIndexOf("World") | |
lastIndexOf(String str, int fromIndex) | int | str: 要查找的字符串 fromIndex: 开始位置 | 从指定位置反向查找字符串 | sb.lastIndexOf("World", 10) | |
charAt(int index) | char | index: 位置 | 返回指定位置的字符 | sb.charAt(5) | |
子串方法 | |||||
子串 | substring(int start) | String | start: 开始位置 | 返回从开始位置到末尾的子串 | sb.substring(5) |
substring(int start, int end) | String | start: 开始位置 end: 结束位置 | 返回指定范围的子串 | sb.substring(5, 10) | |
容量管理 | |||||
容量 | length() | int | 无 | 返回当前字符数 | sb.length() |
capacity() | int | 无 | 返回当前容量 | sb.capacity() | |
ensureCapacity(int minimumCapacity) | void | minimumCapacity: 最小容量 | 确保容量至少等于指定值 | sb.ensureCapacity(100) | |
trimToSize() | void | 无 | 尝试减少存储空间 | sb.trimToSize() | |
setLength(int newLength) | void | newLength: 新长度 | 设置字符序列长度 | sb.setLength(10) | |
其他方法 | |||||
其他 | toString() | String | 无 | 转换为String对象 | sb.toString() |
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) | void | srcBegin: 源开始位置 srcEnd: 源结束位置 dst: 目标数组 dstBegin: 目标开始位置 | 将字符复制到目标数组 | sb.getChars(0, 5, dst, 0) |
3.链式编程
当我们调用方法时候,不需要用变量接收其结构,可以继续在此基础上调用其他方法:
public class Csdn1 {public static void main(String[] args) {StringBuilder sb = new StringBuilder("abc").append("d").reverse();System.out.println(sb.toString());//dcba}
}
StringJoiner类
StringJoiner跟StringBuilder一样,可以看成容器,创建之后里面内容可变的,能够提高字符串操作效率,代码简洁。
1.构造方法
import java.util.StringJoiner;public class Csdn1 {public static void main(String[] args) {StringJoiner sj = new StringJoiner("-","[","]");System.out.println(sj);//[]}
}
这个相比于StringBuilder,其可以自己定义间隔符号以及头尾符号。
2.类内方法
方法名 | 返回值类型 | 参数 | 描述 | 示例 |
---|---|---|---|---|
构造方法 | ||||
StringJoiner(CharSequence delimiter) | StringJoiner | delimiter: 分隔符 | 创建使用指定分隔符的StringJoiner | new StringJoiner(",") |
StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix) | StringJoiner | delimiter: 分隔符 prefix: 前缀 suffix: 后缀 | 创建带有分隔符、前缀和后缀的StringJoiner | new StringJoiner(",", "[", "]") |
核心方法 | ||||
add(CharSequence newElement) | StringJoiner | newElement: 要添加的元素 | 添加新元素到StringJoiner | sj.add("A").add("B") → "A,B" |
merge(StringJoiner other) | StringJoiner | other: 另一个StringJoiner | 合并另一个StringJoiner的内容 | sj1.merge(sj2) |
toString() | String | 无 | 返回拼接后的字符串 | sj.toString() → "A,B,C" |
状态查询方法 | ||||
length() | int | 无 | 返回当前字符串长度(包括前缀后缀) | sj.length() → 5 |
setEmptyValue(CharSequence emptyValue) | StringJoiner | emptyValue: 空值显示 | 设置当没有内容时的默认返回值 | sj.setEmptyValue("空") |