Java SE String类(一):常用方法(上)

1. 常用方法

1.1 字符串构造

String类的常用构造方法只有以下三种

public class Main {
    public static void main(String[] args) {
        String s1 = "hello";//使用常量串进行构造
        String s2 = new String("hello");//创建String对象
        char[] array = {'h','e','l','l','o'};//使用字符数组
        String s3 = new String(array);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
    }
}

如要使用其他String方法,大家可以查看源码或者是jdk帮助手册
【注意】

  1. String类是引用类型的对象内部其实并不存在字符串本身,我们可以查看String类的部分源码:
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,
               Constable, ConstantDesc {
     private final byte[] value;//用于存字符串的数组,字符存储在这个数组中形成了字符串
     private int hash; // 默认为0
     public String(String original) {//对以上两个成员变量进行构造
        this.value = original.value;
        this.hash = original.hash;
        }
  }

下面我们用一段代码来说明String是引用类型

public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = new String("world");
        char[] array = {'h','i'};//创建了3个不同的引用对象
        String s3 = new String(array);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        String s4 = s3;//s4和s3指向了同一个引用
        System.out.println(s4);
    }
}

字符串的引用方式其实和我们前面提到的数组很类似,因为底层就是数组实现的,我们下面通过画图说明
在这里插入图片描述
2. 在Java中,直接用双引号引起来的对象也是String类

System.out.println("hello");

1.2 字符串的常规方法

  1. 计算长度
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = new String("world");
        char[] array = {'h','i'};//创建了3个不同的引用对象
        String s3 = new String(array);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        String s4 = s3;//s4和s3指向了同一个引用
        System.out.println(s4);
        System.out.println(s3.length());
    }
}

在这里插入图片描述
我们在这里需要注意的一点是,Java中的字符串不想c语言一样有以‘\0’这样的转义字符结尾的说法有几个字母,字符串就是多长,在上面的运行结果我们可以看到,s3的长度为2

  1. 判空
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = new String("");//s2为空字符
        char[] array = {'h','i'};//创建了3个不同的引用对象
        String s3 = new String(array);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        String s4 = s3;//s4和s3指向了同一个引用
        System.out.println(s4);
        System.out.println(s3.length());
        System.out.println(s2.isEmpty());
    }
}

在这里插入图片描述
从上述结果我们可以看出,isEmpty方法如果字符串为空,返回ture,如果不为空,返回false

1.3 String对象的比较

字符串的比较也是常见的操作之一,比如:字符串的排序,Java中总共提供了4种方式

  1. == 比较是否引用同一个对象
    注意:对于内置类型,比较的是变量中的值,对于引用类型比较的是引用中的地址
public class Main {
    public static void main(String[] args) {
        int a = 1;
        int b = 1;
        int c = 2;
        String s1 = "hello";
        String s2 = "hi";
        String s3 = "hello";
        String s4 = s1;
        System.out.println(a == b);//两个值相等
        System.out.println(a == c);//两个值不相等
        System.out.println(s1 == s2);//两个字符串不一样
        System.out.println(s3 == s1);//虽然两个字符串相同,但是指向的引用不同
        System.out.println(s1 == s4);//指向同一个引用
    }
}

在这里插入图片描述

需要注意的是,由于String是引用类型,虽然s1和s3相同,但是它们的引用不同,所以返回false
那么我们如果想要比较两个字符串是否相同,我们有办法吗,当然有,我们下面来介绍它

  1. boolean equals(Object anObject) 方法:按照字典序比较
    字典序:按照字符的大小顺序
    String重写了父类Object方法,Objec中默认使用“==”进行比较,String重写后按照如下规则比较:
public boolean equals(Object anObject) {
	// 1. 先检测this 和 anObject 是否为同一个对象比较,如果是返回true
	if (this == anObject) {
		return true;
	}
	// 2. 检测anObject是否为String类型的对象,如果是继续比较,否则返回false
	if (anObject instanceof String) {
	// 将anObject向下转型为String类型对象
		String anotherString = (String)anObject;
		int n = value.length;
	// 3. this和anObject两个字符串的长度是否相同,是继续比较,否则返回false
	if (n == anotherString.value.length) {
		char v1[] = value;
		char v2[] = anotherString.value;
		int i = 0;
		// 4. 按照字典序,从前往后逐个字符进行比较
		while (n-- != 0) {
			if (v1[i] != v2[i])
			return false;
			i++;
		}
		return true;
		}
	}
	return false;
}
public class Main {
    public static void main(String[] args) {
        int a = 1;
        int b = 1;
        int c = 2;
        String s1 = "hello";
        String s2 = "hi";
        String s3 = "hello";
        String s4 = s1;
        System.out.println(a == b);//两个值相等
        System.out.println(a == c);//两个值不相等
        System.out.println(s1 == s2);//两个字符串不一样
        System.out.println(s3 == s1);//虽然两个字符串相同,但是指向的引用不同
        System.out.println(s1 == s4);//指向同一个引用
        System.out.println(s1.equals(s3));//两个字符串相同
        System.out.println(s2.equals(s1));//两个字符串不同
    }
}

在这里插入图片描述
上述代码我们可以看到,虽然s1和s3指向的是不同的引用,但是只要字符串相同,就返回true
3. int compareTo(String anotherString) 方法:按照字典序比较
与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:

  1. 先按照字典次序大小比较,如果出现不等的字符直接返回这两个字符的大小差值
  2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hi";
        String s3 = "hello";
        String s4 = "helloaaa";
        System.out.println(s1 == s2);//两个字符串不一样
        System.out.println(s3 == s1);//虽然两个字符串相同,但是指向的引用不同
        System.out.println(s1 == s4);//指向同一个引用
        System.out.println(s1.equals(s3));//两个字符串相同
        System.out.println(s2.equals(s1));//两个字符串不同
        System.out.println(s1.compareTo(s2));//返回字典序差值
        System.out.println(s1.compareTo(s3));//相同返回0
        System.out.println(s1.compareTo(s4));//前几个字符相同,返回字符串长度只差

    }
 }

在这里插入图片描述
4. int compareToIgnoreCase(String str) 方法:与compareTo不同的是忽略大小写进行比较

public class Main {
    public static void main(String[] args) {
        String s1 = "Hello";
        String s2 = "hi";
        String s3 = "hello";
        String s4 = "helloaaa";
        System.out.println(s1 == s2);//两个字符串不一样
        System.out.println(s3 == s1);//虽然两个字符串相同,但是指向的引用不同
        System.out.println(s1 == s4);//指向同一个引用
        System.out.println(s1.equals(s3));//两个字符串相同
        System.out.println(s2.equals(s1));//两个字符串不同
        System.out.println(s1.compareTo(s2));//返回字典序差值
        System.out.println(s1.compareTo(s3));//相同返回0
        System.out.println(s1.compareTo(s4));//前几个字符相同,返回字符串长度只差
        System.out.println(s1.compareToIgnoreCase(s3));//忽略大小写进行比较
    }
}

在这里插入图片描述

1.3 字符串查找

字符串查找也是字符串中非常常见的操作,String类提供了如下查找方法:
在这里插入图片描述

public class Main {
    public static void main(String[] args) {
        String s = "aaabbbcccddd";
        System.out.println(s.charAt(2));
        System.out.println(s.indexOf('a'));
        System.out.println(s.indexOf('a',2));
        System.out.println(s.indexOf("bb"));
        System.out.println(s.indexOf("bb",4));
        System.out.println(s.lastIndexOf('d'));
        System.out.println(s.lastIndexOf('d',10));
        System.out.println(s.lastIndexOf("dd"));
        System.out.println(s.lastIndexOf("dd",10));
    }
 }

在这里插入图片描述

1.4 转化

  1. 数值和字符串转化
public class Main {
    public static void main(String[] args) {
        String s1 = String.valueOf(12);
        String s2 = String.valueOf(12.12);
        String s3 = String.valueOf(true);
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        int a = Integer.parseInt(s1);
        double b = Double.parseDouble(s2);
        System.out.println(s1);
        System.out.println(s2);
    }
}

在这里插入图片描述
2. 大小写转换

public class Main {
    public static void main(String[] args) {
        String s1 = "me";
        String s2 = "YOU";
        System.out.println(s1.toUpperCase());
        System.out.println(s2.toLowerCase());
    }
}

在这里插入图片描述
注意:这里在转化的是一个新的字符串,不是在原来的字符串上修改,因为字符串具有不可变性
3. 字符串转数组和字符串转数组

public class Main {
    public static void main(String[] args) {
        String s1 = "abcdefg";
        char[] array = s1.toCharArray();
        System.out.println(Arrays.toString(array));
        String s2 = new String(array);
        System.out.println(s2);
    }
}

在这里插入图片描述
4. 格式化字符串

public class Main {
    public static void main(String[] args) {
        String s = String.format("%d-%d-%d",2024,3,11);
        System.out.println(s);
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/450533.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot的医护人员排班系统

预览地址 论文预览https://pan.imgbed.link/kkpreview/onlinePreview?urlaHR0cHM6Ly9wYW4uaW1nYmVkLmxpbmsvZmlsZS8yMTYxNT9mdWxsZmlsZW5hbWU95Z%2B65LqOc3ByaW5nYm9vdOeahOWMu%2BaKpOS6uuWRmOaOkuePreezu%2Be7n%2BiuuuaWhy5kb2M%3D 链接&#xff1a;https://pan.baidu.com/s/…

数据复制:释放新质生产力的关键钥匙

今年两会&#xff0c;新质生产力成为最热词汇&#xff0c;引起社会各界广泛关注。 所谓新质生产力&#xff0c;本质是一种新型的生产力形态&#xff0c;它由技术革命性突破、生产要素创新性配置、产业深度转型升级而催生&#xff0c;以劳动者、劳动资料、劳动对象及其优化组合…

24-Java策略模式 ( Strategy Pattern )

Java策略模式 摘要实现范例 策略模式的重心不是如何实现算法&#xff0c;而是如何组织、调用这些算法&#xff0c;从而让程序结构更加灵活&#xff0c;具有更好的维护性和扩展性。 策略模式属于行为型模式 摘要 1. 意图 针对一组算法&#xff0c;将每一个算法封装到具有共…

【C++进阶】C++继承概念详解

C继承详解 一&#xff0c;继承的概念和定义1.1 继承的概念1.2 继承的定义1.3 继承关系和访问限定符 二&#xff0c;基类和派生类的对象赋值转移三&#xff0c;继承的作用域四&#xff0c;派生类的默认成员函数五&#xff0c;继承和友元&静态成员和继承六&#xff0c;菱形继…

【案例】义乌佛堂智慧蔬菜产业园投入使用,为高效农业提供技术保障

项目背景 佛堂蔬菜产业园位于佛堂镇毛陈村&#xff0c;由义乌市市场发展集团旗下义乌市农业开发有限公司负责打造。园区于2021年开始筹建&#xff0c;总投资5000万元&#xff0c;占地面积约450亩&#xff0c;建有标准化蔬菜大棚72个。 传统大棚对农民依赖性特别强&#xff0c;需…

视频素材哪里找?几个高清短视频素材下载网站分享

哥们姐妹们&#xff0c;是不是在追求完美的短视频创作路上因为找不到那个令人心动的高清视频素材而头大呢&#xff1f;别着急&#xff0c;我这儿有几个秘密武器&#xff0c;即几个超给力的短视频素材网站&#xff0c;让你的作品从此分分钟高大上起来 1&#xff0c;蛙学府 这里…

什么是模块化机房?

在这个数据驱动的时代&#xff0c;数据中心的作用变得日益重要。而模块化机房&#xff0c;作为一种创新的数据中心解决方案&#xff0c;正在逐渐改变我们构建和管理这些关键设施的方式。但究竟什么是模块化机房呢&#xff1f;它又为何受到越来越多行业的青睐&#xff1f;在本文…

Caffeine--实现进程缓存

本地进程缓存特点 缓存在日常开发中起着至关重要的作用, 由于存储在内存中, 数据的读取速度非常快,能大量减少对数据库的访问,减少数据库的压力. 缓存分为两类: 分布式缓存, 例如Redis: 优点: 存储容量大, 可靠性更好, 可以在集群间共享缺点: 访问缓存存在网络开销场景: 缓存数…

1688平台最关键的接口接入实例|获得1688商品详情| 按关键字搜索商品| 按图搜索1688商品(拍立淘)| 获得淘口令真实url

参数说明 通用参数说明 version:API版本key:调用key,测试key:test_api_keyapi_name:API类型[item_get,item_search]cache:[yes,no]默认yes&#xff0c;将调用缓存的数据&#xff0c;速度比较快result_type:[json,xml,serialize,var_export]返回数据格式&#xff0c;默认为jsonl…

pytorch CV入门3-预训练模型与迁移学习

专栏链接&#xff1a;https://blog.csdn.net/qq_33345365/category_12578430.html 初次编辑&#xff1a;2024/3/7&#xff1b;最后编辑&#xff1a;2024/3/8 参考网站-微软教程&#xff1a;https://learn.microsoft.com/en-us/training/modules/intro-computer-vision-pytorc…

三个el-radio选项怎么知道用户选择了哪一个

问: 回答: 要获取用户选择了第二个还是第三个 <el-radio>&#xff0c;你可以在 change 事件处理函数 changeAPPVersion 中判断选中的值是什么。你需要给第二个和第三个 <el-radio> 设置不同的值&#xff0c;然后在 changeAPPVersion 方法中根据这个值来确定用户选…

Selenium自动化测试面试题全家桶

1、什么是自动化测试、自动化测试的优势是什么&#xff1f; 通过工具或脚本代替手工测试执行过程的测试都叫自动化测试。 自动化测试的优势&#xff1a; 1、减少回归测试成本 2、减少兼容性测试成本 3、提高测试反馈速度 4、提高测试覆盖率 5、让测试工程师做更有意义的…

建造家庭泳池位置选择尤为重要

建造家庭泳池位置选择尤为重要 在自家别墅庭院中建造一座游泳池是很多人的梦想&#xff0c;因为有泳池家人健身起来是非常方便的&#xff0c;但是建造泳池选择合适的位置显得尤为关键&#xff0c;因为合适的选址可以带来美观性及在泳池的日常使用维护中也起到了很重要的作用。…

idea实现ssh远程连接服务器

1. 首先&#xff0c;打开idea&#xff0c;点击左上角File->settings 2. 点击tools->SSH Configurations->填写必要的信息&#xff0c;Host就是访问服务器的ip地址&#xff0c;Username就是服务器的用户账户&#xff0c;比如root&#xff0c;Password账户对应的密码&am…

如何克服应用程序性能监控( APM )面临的挑战

应用程序性能监控&#xff08;APM&#xff09;使组织能够监控性能 其关键业务应用程序的指标&#xff0c;在出现性能问题时及时收到警报&#xff0c;以及生成用于定期性能分析的报告。应用程序性能监视工具对于任何依赖应用程序的组织来说都是必不可少的&#xff0c;它可以帮助…

【渗透测试】常见文件上传漏洞处理与防范

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属的专栏&#xff1a;网络安全渗透 景天的主页&#xff1a;景天科技苑 文章目录 1.文件上传漏洞1.1. 描述1.2. 危害1.3. 有关文件上传的知识1.4…

VB购房系统-175-(代码+开题+文献综述+翻译+说明)

转载地址: http://www.3q2008.com/soft/search.asp?keyword175 1/客户资料登记那张表上不能以客户身份证号作为主键&#xff0c;因为一般来看房的客户不会留下身份证号码&#xff0c;实施起来有难度&#xff0c;你可以设置一个自动编号字段&#xff0c;以这个字段来作为主键。…

电商数据分析|电商数据采集|Python数据采集|电商API接口数据采集系统搭建

电商API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;是指电商平台开放的一组数据接口&#xff0c;通过这些接口可以实现对电商平台商品、订单、物流等信息进行访问、查询、修改、删除等操作。电商API接口涉及到的主要数据包括&…

[论文笔记]跨语言摘要最新综述:典型挑战及解决方案

https://arxiv.org/abs/2203.12515 跨语言摘要是指为给定的一种语言(例如中文)的文档生成另一种语言(例如英文)的摘要。 图1:四个端到端框架的概述。XLS:跨语言摘要;MT:机器翻译;MS:单语摘要。虚线箭头表示监督信号。无框彩色方块表示相应任务的输入或输出…

深入理解,java标识符?类型转换?

1、标识符 下面这张图是中国的一些姓氏 中国人起名字的规则都是以姓开头&#xff0c;名结尾。通过这个规则可以起&#xff1a;刘爱国、张三等&#xff0c;都是以汉字起的。但是不会起李ad、王123等名字&#xff0c;因为不符合规则。 所以&#xff0c;java在给变量、方法、类等…