IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Java——常用类String及方法 -> 正文阅读

[Java知识库]Java——常用类String及方法


java.lang.String

String类特点

String类型不能被继承,因为String是由final修饰

String类型的对象是不可变

换句话说,只要修改字符串,就会产生新对象

@Test
    public void test01(){
        String s  = "你好";
        change(s);
        System.out.println(s);//你好
    }
    public void change(String str){
        str = "hello";
    }

常量池

String对象不可变的特性,使得我们可以把一些字符串存到常量池中,字符串有常量池。常量池中的是可以共享的。

@Test
	public void test02(){
		String s1 = "hello";
		String s2 = "hello";		
		System.out.println(s1 == s2)//true;
		//地址是同一个
	}

字符串常量池在哪里?

Oracle官方虚拟机HotSpot
(1)JDK1.6以及之前:方法区
(2)JDK1.7:挪到堆中,即在堆中单独划分了一块来存字符串常量
(3)JDK1.8:从堆中挪出,挪到一个“元空间meta space”,即类似于方法区

String对象为什么不可变?

①底层char[]数组有final修饰,意味着这个数组不能扩容等,来达到存更多的字符。——无法扩容
②char[]数组是私有的,我们无法直接操作这个char[]数组,而且String没有提供这样的方法,来修改char[]数组的元素的值。——无法修改

String提供的所有的方法,对字符串的修改都是返回一个新的字符串对象。

String对象创建个数与拼接结果

对象创建

String str = "hello";//一个字符串对象

在这里插入图片描述


String str = new String("hello");//两个字符串对象

一个在常量池中:hello。另一个在堆中,String的对象
堆中的这个字符串对象char[]的value数组,指向常量池中"hello"的char[]的value

在这里插入图片描述

拼接

拼接的结果在堆还是在常量池?
(1)常量 + 常量在常量池
(2)变量 +常量在堆
(3)变量 + 变量在堆
(4)xx.intern():在常量池

@Test
	public void test06(){
		String s1 = "hello";
		String s2 = "world";
		String s3 = "helloworld";
		
		String s4 = (s1 + "world").intern();//把拼接的结果放到常量池中
		String s5 = (s1 + s2).intern();
		
		System.out.println(s3 == s4);//true
		System.out.println(s3 == s5);//true
	}
	
	@Test
	public void test05(){
		final String s1 = "hello";
		final String s2 = "world";
		String s3 = "helloworld";
		
		String s4 = s1 + "world";//s4字符串内容也helloworld,s1是常量,"world"常量,常量+ 常量 结果在常量池中
		String s5 = s1 + s2;//s5字符串内容也helloworld,s1和s2都是常量,常量+ 常量 结果在常量池中
		String s6 = "hello" + "world";//常量+ 常量 结果在常量池中,因为编译期间就可以确定结果
		
		System.out.println(s3 == s4);//true
		System.out.println(s3 == s5);//true
		System.out.println(s3 == s6);//true
	}
	
	@Test
	public void test04(){
		String s1 = "hello";
		String s2 = "world";
		String s3 = "helloworld";
		
		String s4 = s1 + "world";//s4字符串内容也helloworld,s1是变量,"world"常量,变量 + 常量的结果在堆中
		String s5 = s1 + s2;//s5字符串内容也helloworld,s1和s2都是变量,变量 + 变量的结果在堆中
		String s6 = "hello" + "world";//常量+ 常量 结果在常量池中,因为编译期间就可以确定结果
		
		System.out.println(s3 == s4);//false
		System.out.println(s3 == s5);//false
		System.out.println(s3 == s6);//true
	}

空字符串

(1)""
(2)new String()
(3)new String("")

@Test
	public void test07(){
		String s1; //局部变量未初始化
		String s2 = null;//初始化null
		String s3 = "";//空字符串常量对象
		String s4 = new String();//空字符串对象
		String s5 = new String("");//两个对象,一个是常量池中的,一个是堆中
		
      //System.out.println(s1);//无法使用
      //System.out.println(s2.length());//空指针异常
		
		System.out.println(s3.length());
		System.out.println(s4.length());
		System.out.println(s5.length());
	}

判断空字符串
四种方式:
(1)if(str != null && str.length() == 0)

(2)if(str != null && str.equals(""))
(3)if("".equals(str)) 推荐

(4)if(str!=null && str.isEmpty())

String对象的比较

(1)==:比较对象的地址
结论:只有两个字符串的常量对象比较时才会返回true,其他的都是false

(2)equals:比较字符串的内容,严格区分大小写
因为String类型重写了Object的equals

==与equals的详细分析和区别,请参考文章:equals与==的区别.

(3)equalsIgnoreCase(String anotherString) :比较字符串内容,不区分大小写

(4)大小比较,严格区分大小写
String类型实现了Comparable接口,重写了compareTo方法,严格区分大小写

@Test
	public void test06(){
		String s1 = new String("hello");
		String s2 = new String("helloworld");	
	/*	if(s1 > s2){//不能直接使用比较运算符		
		}*/
		
		if(s1.compareTo(s2) > 0){
			System.out.println(s1 + ">" + s2);
		}else if(s1.compareTo(s2) < 0){
			System.out.println(s1 + "<" + s2);
		}else{
			System.out.println(s1 + "=" + s2);
		}	
		//hello<helloworld
	}

依次比较对应位置的字符
hello和Hello,先[0]位置的h和H,h>H,就直接认定hello>Hello
否则继续按位比较。

(5)大小比较:不区分大小写

**@Test
	public void test07(){
		String s1 = new String("hello");
		String s2 = new String("Hello");
		
		if(s1.compareToIgnoreCase(s2) > 0){
			System.out.println(s1 + ">" + s2);
		}else if(s1.compareToIgnoreCase(s2) < 0){
			System.out.println(s1 + "<" + s2);
		}else{
			System.out.println(s1 + "=" + s2);
		}
		//hello=Hello
	}**
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 11:52:07  更:2021-10-17 11:52:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:25:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码