当前位置: 首页 > news >正文

Java数据类型与字符串操作全解析

基本数据类型

数据类型关键字内存大小默认值取值范围说明
整型byte1 字节 (8位)0-128 ~ 127用于处理小型数据,如文件流
short2 字节 (16位)0-32768 ~ 32767不常用,可兼容16位硬件
int4 字节 (32位)0约 -21亿 ~ 21亿最常用、默认的整型
long8 字节 (64位)0L范围极大用于大整数,值后需加 L 或 l
浮点型float4 字节 (32位)0.0f单精度,约6-7位有效数字值后需加 F 或 f
double8 字节 (64位)0.0d双精度,约15位有效数字最常用、默认的浮点型
字符型char2 字节 (16位)'\u0000'0 ~ 65535存储单个 Unicode 字符,用单引号 ''
布尔型boolean无明确规定falsetrue 或 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类定义的对象,

  1. 总是比较内容equals() 比较字符串的内容,而不是内存地址

  2. 注意空指针:调用 equals() 方法的对象不能为null

  3. 推荐写法:把字面量或已知非空对象放在 equals() 前面

  4. 区分大小写:如果需要不区分大小写的比较,使用 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的空StringBuildernew StringBuilder()
StringBuilder(int capacity)StringBuildercapacity: 初始容量创建指定初始容量的空StringBuildernew StringBuilder(100)
StringBuilder(String str)StringBuilderstr: 初始字符串创建包含指定字符串的StringBuildernew StringBuilder("Hello")
追加方法
追加append(String str)StringBuilderstr: 要追加的字符串追加字符串sb.append("World")
append(Object obj)StringBuilderobj: 任意对象追加对象的字符串表示sb.append(123)
append(char[] str)StringBuilderstr: 字符数组追加字符数组sb.append(charArray)
append(char[] str, int offset, int len)StringBuilderstr: 字符数组
offset: 起始位置
len: 长度
追加字符数组的一部分sb.append(chars, 0, 3)
append(boolean b)StringBuilderb: 布尔值追加布尔值sb.append(true)
append(char c)StringBuilderc: 字符追加字符sb.append('!')
append(int i)StringBuilderi: 整数值追加整数值sb.append(100)
append(long l)StringBuilderl: 长整型值追加长整型值sb.append(100L)
append(float f)StringBuilderf: 浮点值追加浮点值sb.append(3.14f)
append(double d)StringBuilderd: 双精度值追加双精度值sb.append(3.14)
插入方法
插入insert(int offset, String str)StringBuilderoffset: 插入位置
str: 要插入的字符串
在指定位置插入字符串sb.insert(5, "插入")
insert(int offset, Object obj)StringBuilderoffset: 插入位置
obj: 要插入的对象
在指定位置插入对象sb.insert(5, 123)
insert(int offset, char[] str)StringBuilderoffset: 插入位置
str: 字符数组
在指定位置插入字符数组sb.insert(5, charArray)
insert(int offset, boolean b)StringBuilderoffset: 插入位置
b: 布尔值
在指定位置插入布尔值sb.insert(5, true)
insert(int offset, char c)StringBuilderoffset: 插入位置
c: 字符
在指定位置插入字符sb.insert(5, '!')
insert(int offset, int i)StringBuilderoffset: 插入位置
i: 整数值
在指定位置插入整数值sb.insert(5, 100)
删除方法
删除delete(int start, int end)StringBuilderstart: 开始位置
end: 结束位置
删除指定范围的字符sb.delete(5, 10)
deleteCharAt(int index)StringBuilderindex: 要删除的字符位置删除指定位置的字符sb.deleteCharAt(5)
替换方法
替换replace(int start, int end, String str)StringBuilderstart: 开始位置
end: 结束位置
str: 替换字符串
替换指定范围的字符sb.replace(5, 10, "新内容")
setCharAt(int index, char ch)StringBuilderindex: 位置
ch: 新字符
设置指定位置的字符sb.setCharAt(5, 'X')
反转方法
反转reverse()StringBuilder反转字符序列sb.reverse()
查找方法
查找indexOf(String str)intstr: 要查找的字符串查找字符串第一次出现的位置sb.indexOf("World")
indexOf(String str, int fromIndex)intstr: 要查找的字符串
fromIndex: 开始位置
从指定位置查找字符串sb.indexOf("World", 5)
lastIndexOf(String str)intstr: 要查找的字符串查找字符串最后一次出现的位置sb.lastIndexOf("World")
lastIndexOf(String str, int fromIndex)intstr: 要查找的字符串
fromIndex: 开始位置
从指定位置反向查找字符串sb.lastIndexOf("World", 10)
charAt(int index)charindex: 位置返回指定位置的字符sb.charAt(5)
子串方法
子串substring(int start)Stringstart: 开始位置返回从开始位置到末尾的子串sb.substring(5)
substring(int start, int end)Stringstart: 开始位置
end: 结束位置
返回指定范围的子串sb.substring(5, 10)
容量管理
容量length()int返回当前字符数sb.length()
capacity()int返回当前容量sb.capacity()
ensureCapacity(int minimumCapacity)voidminimumCapacity: 最小容量确保容量至少等于指定值sb.ensureCapacity(100)
trimToSize()void尝试减少存储空间sb.trimToSize()
setLength(int newLength)voidnewLength: 新长度设置字符序列长度sb.setLength(10)
其他方法
其他toString()String转换为String对象sb.toString()
getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin)voidsrcBegin: 源开始位置
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)StringJoinerdelimiter: 分隔符创建使用指定分隔符的StringJoinernew StringJoiner(",")
StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix)StringJoinerdelimiter: 分隔符
prefix: 前缀
suffix: 后缀
创建带有分隔符、前缀和后缀的StringJoinernew StringJoiner(",", "[", "]")
核心方法
add(CharSequence newElement)StringJoinernewElement: 要添加的元素添加新元素到StringJoinersj.add("A").add("B") → "A,B"
merge(StringJoiner other)StringJoinerother: 另一个StringJoiner合并另一个StringJoiner的内容sj1.merge(sj2)
toString()String返回拼接后的字符串sj.toString() → "A,B,C"
状态查询方法
length()int返回当前字符串长度(包括前缀后缀)sj.length() → 5
setEmptyValue(CharSequence emptyValue)StringJoineremptyValue: 空值显示设置当没有内容时的默认返回值sj.setEmptyValue("空")

http://www.dtcms.com/a/438691.html

相关文章:

  • linux文件系统学习
  • Effective Python 第37条:用组合类实现多层结构,避免嵌套内置类型
  • C语言计算矩阵的逆
  • 如何传递上层变数到编译过的模组当中
  • 广东十大网站建设外贸公司招聘条件
  • C语言类型转换与错误处理
  • 线上宣传方式昆明网络推广优化
  • 日语学习-日语知识点小记-进阶-JLPT-N1阶段应用练习(3):语法 +考え方16+2022年7月N1
  • 51单片机AD/DA
  • 九.寄生参数对变换器参数设计的影响
  • MapSet练习OJ题讲解(2易2中1难)
  • 1.2.1 RAG:构建你的专属知识库
  • 做网站找个人还是公司电商网站建设的意义
  • 网站开发人员定罪成都系统网站建设
  • 小迪web自用笔记49
  • win7 不能安装 scales 1.4.0,ggplot2,无法找到动态链接库的注入点
  • 厦门模板网站极简风格 网站
  • 第四届人工智能与智能信息处理国际学术会议(AIIIP 2025)
  • 网站建设与维护的试卷易点网络科技有限公司
  • wordpress标签调用代码优化师证书
  • 基于ECA-ResNet50的OAM光束相位重建:深度学习在光学涡旋场分析中的突破性应用
  • 搭建nginx的高性能web集群
  • 四川省城乡和建设厅网站微信公众上传wordpress
  • 从单词到语素的形态学
  • c++之基础A(自定义函数)(第二课)
  • 单图像去雨研究综述
  • REST架构的6大约束与API
  • 深圳婚纱摄影网站建设网络维护工程师工资多少
  • 北京企业网站搭建wordpress 国际化
  • uniappx几个生命周期说明