String 字符串
String 字符串
String 类对象实例化
String 对象实例化
在 Java 程序中使用双引号可以定义字符串,同时字符串的内容长度可以由用户随意定义所有的字符串对应的类型为 String,而要想获取 String 类的实例化对象,可以采用如下两种方式完成:
- 【方式一】直接赋值:String 字符串对象="字符串内容"
- 【方式二】构造方法实例化:String 字符串对象=new String("字符串内容");
详情
class Test1 {
public static void main(String[] args) {
//字符串实例两种方式
String str = "实例化1";
String strS = new String("实例化2");
System.out.println(str);
System.out.println(strS);
}
}
实例化1
实例化2
String 类内部实现源代码分析
在很多传统的编程语言之中会通过数组的形式实现字符串的定义,但是在 Java 中为了帮助开发者简化程序的开发,提供了 String 字符串处理类,但是其内部依然采用了数组的方式进行实现,这一点可以直接通过 String 类的源代码观察到。
- JDK1.8 及以前的 String 类实现源代码:private final char value[];
- JDK 1.9 及以后的 String 类实现源代码:private final byte[] value;
采用文本块定义字符串
从 JDK-13 版本开始,Java 语言吸收了 Python 语言中多行字符串定义的语法形式,也提供了文本块的语法结构,即:使用三个双引号包裹多行字符串。
String message="""
沐言科技:www.yootk.com
李兴华训练营: edu.yootk.com""";
沐言科技:www.yootk.com
李兴华训练营: edu.yootk.com
字符串比较
字符串的实例化格式可以采用赋值运算符“=”直接完成,这一点和基本数据类型的赋值格式是相同,但是在进行字符串相等判断时却不能直接使用"=="完成,因为"=="是数值比较,而应用在字符串对象时其主要完成的是堆内存地址的比较。
详情
//利用"=="进行字符串判断
//equals比较
class Test2 {
public static void main(String[] args) {
String strA = "yix";
String strB = new String("yix");
String strC = strB;
System.out.println(strA == strB);
System.out.println(strA == strC);
System.out.println(strC == strB);
System.out.println(strA.equals(strB));
System.out.println(strA.equals(strC));
System.out.println(strB.equals(strC));
}
}
false
false
true
true
true
true
字符串常量
字符串常量
Java 程序可以直接使用双引号定义字符串,而每一个定义的字符串实际上都是 String 类的匿名对象,所以采用直接赋值形式实例化的 String 类对象本质的核心意义在于:为字符串的匿名对象设置名称,由于 String 类的内部采用了字节数组的形式进行字符串内容存储,所以每一个定义的字符串都是不可更改的,都属于一个字符串常量。
合理利用 equals()避免空指向异常
所有的字符串都是 String 类的匿名对象,也就是说字符串对象永远不可能为空,那么就可以利用这样的规则应用在字符串相等判断中。
String input = null;
"yix".equals(input)
String 对象实例化方式比较
详情
//直接赋值分析
class Test3{
public static void main(String[] args) {
String strA = "yix";
String strB = "yix";
System.out.println(strA == strB);
System.out.println(strA == "yix");
}
}
true
true
通过对象池引用对象
- 在 JVM 的底层存在有一个对象池(String 只是对象池中保存的一种类型,此外还有多种其他类型),当代码中使用了直接赋值的方式定义了一个 String 类对象时,会将此字符串对象所使用的匿名对象入池保存,如果后续还有其他 String 类对象也采用了直接赋值的方式,并且设置了同样内容,那么将不会开辟新的堆内存空间,而是使用已有的对象进行引用的分配,从而继续使用
- 对象池本质为共享设计模式的一种应用,关于共享设计模式的简单解释:好比在家中准备的工具箱一样,如果有一天需要用到螺丝刀,发现家里没有,那么肯定要去买一把新的,但是用完之后不可以丢掉,会将其放到工具箱中以备下次需要时继续使用,工具箱中所保存的工具将为家庭中的每一个成员服务。
字符串实例手工入池
字符串实例手工入池
//手工入池
class Test4 {
public static void main(String[] args) {
String strA = "yix";
String strB = new String("yix").intern();//手动入池
System.out.println(strA == strB);
}
}
true
字符串常量池
在 Java 程序里面字符串如果采用的是直接赋值的形式,那么可以自动的将字符串的内容保存在对象池之中,于是这个过程就可以减少无用的堆内存空间的开辟,但是这种对象池严格意义上来讲应该是字符串对象池,可是在 Java 里面这种字符串常量池分为两种类型
静态常量池:程序在加载的时候会自动的将此程序之中保存的字符串、常量、类和方法等信息全部分配;
运行常量池(动态常量池):在 Java 程序执行的时候有一些字符串的数据是需要通过计算得来的(不是以字符串常量的形式进行的定义)
字符串修改分析
字符串修改
在 Java 里面可以直接使用“"”来定义字符串常量,所以任何的字符串的常量一定都是不可以修改的,但是 String 毕竟是一个符合于 Java 变量结构的特殊的类,所以字符串的对象内容理论上是可以修改的,但是它所做的修改并不是修改具体的堆内存,而是会创建新的堆内存。
主方法组成分析
主方法
主方法是程序执行的起点,也是所有程序启动执行时的推荐做法,而在 Java 中为了考虑到程序结构的合理性,所以在主方法的定义中提供了多个组成部分,下面为读者列出每个组成部分的含义:
- “public”:是 Java 中的访问权限的一种,public 描述的是公开的(private 描述的是私有的不公开的),主方法既然是程序的起点,那么其方法使用权限一定是公开的;
- “static”:按照 Java 本身的定义来讲 static 描述的是一个类方法,类方法的特点是可以由类名称直接进行调用,在 java 程序解释执行的时候采用的是"java 类名称",所以这个时候是通过类名称调用的主方法;
- “void”:主方法是一切的开始,那么既然开始了就没有回头路,所以不能返回任何数据
- “main”:是一个系统内置的方法名称,执行 java 类时会根据此方法名称自动调用执行;
- "String args[]":程序执行时所需要的参数,多个参数使用空格分割;·参数传递的形式:java 类名称 参数 1 参数 2 参数 3 .
class Test4 {
public static void main(String[] args) {
String strA = "yix";
String strB = new String("yix").intern();//手动入池
System.out.println(strA == strB);
}
}
JavaDoc 简介
String 方法查找
在实际 Java 项目开发中,String 类几乎会出现在每一个 Java 项目之中,除了 String 类的基本特点之外,开发者还需要熟练的掌握 String 类的常用操作方法(包括方法名称、参数类型以及返回值类型),如果要想查询 String 类的方法定义,则可以直接查阅 JavaDoc 文档。 https://www.runoob.com/manual/jdk11api/java.base/java/lang/String.html#method.summary
字符串与字符
详情
字符串与字节
字符串比较
字符串查找
字符串替换
字符串拆分
字符串截取
字符串格式化
在 JDK 1.5 之后,,Java 语言为了可以吸引更多的编程爱好者提供了字符串格式化处理操集,技连抚奇以避免玩繁的在代码中便用“+,进行连接的操作。在进行字符串格式化时,可以使用一些格式化标记进行占位,随后再进行内容的填字符串的格式化方法在 String 类的定义如下:
- public static String format(String format, Object... args)
- 该方法需要接收一个格式化字符串,在该字符串中可以包含如下几种数据信息:字符串(%s)、整数(%d)、浮点数(%f)、字符(%c),随后利用后面的可变参数进行内容的填充。