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

【Java基础语法】字符修改,以及equals的用法

前言:

小编这里将上一期String类型进行了补充,添加了字符串的修改,以及equals的用法内容,和hashcode的使用;上一期:http://t.csdnimg.cn/ijiM6

 1.字符串的修改

在上一期中我们说到字符串是不能被修改的,所以所有操作都是在新的对象中操作的;

那么如果我们要修改字符串如果用一下代码如何呢?

        String sr="123";sr+="456";System.out.println(sr);

 但是这种方式不推荐使用,因为其效率非常低,中间创建了好多临时对象。

所以我们就要借助StringBuffer 和 StringBuilder

如下代码所示:

long start=System.currentTimeMillis();String s1="";for (int i = 0; i <10000 ; i++) {s1+=i;}long end=System.currentTimeMillis();System.out.println(end-start);long start1=System.currentTimeMillis();StringBuffer stringBuffer=new StringBuffer("");for (int i = 0; i <10000 ; i++) {stringBuffer.append(i);}long end1=System.currentTimeMillis();System.out.println(end1-start1);long start2=System.currentTimeMillis();StringBuilder stringBuilder=new StringBuilder("");for (int i = 0; i <10000 ; i++) {stringBuffer.append(i);}long end2=System.currentTimeMillis();System.out.println(end2-start2);

运行结果

265

1

可以看出,在完成循环时的消耗的毫秒数相差甚远。

StringBufferd的用法

1.StringBuffer append(String str):
在尾部追加,相当于 String += ,可以追加: boolean char char[]
double float int long Object String StringBuff 的变量

例如:

        StringBuffer stringBuffer=new StringBuffer("123");stringBuffer.append("456");System.out.println(stringBuffer);

这里和‘+’法差不多,但是使用的一直是一个对象。 

2.setCharAt(int index, char ch)

index 位置的字符设置为 ch
        StringBuffer stringBuffer=new StringBuffer("123");stringBuffer.setCharAt(0,'3');System.out.println(stringBuffer);

 输出:323

3.int indexOf(String str)
返回 str 第一次出现的位置
int indexOf(String str, int fromIndex)
fromIndex 位置开始查找 str 第一次出现的位置
int lastIndexOf(String str) 
返回最后一次出现 str 的位置
int lastIndexOf(String str, int fromIndex)
fromIndex 位置开始找 str 最后一次出现的位置

这些和String类用法一样,小编上期已经讲解过了,在这里不再赘述。

4.StringBuff insert(int offset, String str)

offset 位置插入:八种基类类型 & String 类型 & Object 类型数据

 

代码如下:

        StringBuffer stringBuffer1=new StringBuffer("aaabbbcccaaabbbccc");stringBuffer1.insert(0,"123");System.out.println(stringBuffer1);

输出:123aaabbbcccaaabbbccc

5.StringBuffer deleteCharAt(int index)

删除 index 位置字符
StringBuffer delete(int start, int end)
删除 [start, end) 区间内的字符

 

 代码如下:

        StringBuffer stringBuffer1=new StringBuffer("aaabbbcccaaabbbccc");StringBuffer stringBuffer2=new StringBuffer("aaabbbcccaaabbbccc");stringBuffer1.delete(0,3);stringBuffer2.deleteCharAt(3);System.out.println(stringBuffer1);System.out.println(stringBuffer2);

输出:

bbbcccaaabbbccc

aaabbcccaaabbbccc

注意: 区间是左闭右开;

6.StringBuffer replace(int start, int end, String str)
[start, end) 位置的字符替换为 str

代码如下:

StringBuffer stringBuffer2=new StringBuffer("aaabbbcccaaabbbccc");stringBuffer2.replace(0,3,"AAA");System.out.println(stringBuffer2);

输出:

 AAAbbbcccaaabbbccc 

7.String substring(int start)
start 开始一直到末尾的字符以 String 的方式返回
String substring(int start,int end)
[start, end) 范围内的字符以 String 的方式返回

 代码如下:

 StringBuffer stringBuffer1=new StringBuffer("aaabbbcccaaabbbccc");StringBuffer stringBuffer2=new StringBuffer("aaabbbcccaaabbbccc");String s1= stringBuffer1.substring(3);String s2= stringBuffer2.substring(3,6);System.out.println(s1);System.out.println(s2);

 输出:

bbbcccaaabbbccc
bbb

8.StringBuffer reverse()

反转字符串

 代码如下:

StringBuffer stringBuffer1=new StringBuffer("12345");
stringBuffer1.reverse();
System.out.println(stringBuffer1);

输出:

54321

9. to String()

转String类型

代码实例:

 StringBuffer stringBuffer1=new StringBuffer("12345");String str=stringBuffer1.toString();System.out.println(str);

总结: 

从上述例子可以看出: String和 StringBuilder最大的区别在于String 的内容无法修改,而
StringBuilder 的内容可以以修改。(StringBuilder与StringBuffer用法基本一致 
频繁修改字符串的情况考虑使用 StringBuilder
注意: String StringBuilder 类不能直接转换。如果要想互相转换,可以采用如下原则 :
String 变为 StringBuilder: 利用 StringBuilder 的构造方法或 append() 方法
StringBuilder 变为 String: 调用 toString() 方法。

2.equals的使用

在Java中,==进行比较时:
如果==左右两侧是基本类型变量,比较的是变量中值是否相同
如果==左右两侧是引用类型变量,比较的是引用变量地址是否相同
如果要比较对象中内容,必须重写Object中的equals方法,因为equals方法默认也是按照地址比

使用引用中的地址直接来进行比较。

例如:

public class test1 {public static void main(String[] args) {Person person1=new Person("小明",15);Person person2=new Person("小明",15);System.out.println(person2==person1);System.out.println(person2.equals(person1));}
}
class Person{public String name;public int age;public Person(String name,int age){this.age=age;this.name=name;}
}

 输出:

false

false

 所以我们此时重写equals方法

class Person{public String name;public int age;public Person(String name,int age){this.age=age;this.name=name;}public boolean equals(Object obj){Person person=(Person) obj;return this.name.equals(person.name)&&this.age==person.age;}
}

此时输出:

false

true 

3.hashcode方法

作用:hashCode()方法帮我算了一个具体的对象位置。

hashcode方法源码:

public native int hashCode();

 该方法是一个native方法,底层是由C/C++代码写的。我们看不到。
我们认为两个名字相同,年龄相同的对象,将存储在同一个位置,如果不重写hashcode()方法,我们可以来看示例代码:

public class test1 {public static void main(String[] args) {Person person1=new Person("小明",15);Person person2=new Person("小明",15);System.out.println(person2.hashCode());System.out.println(person1.hashCode());}
}
class Person{public String name;public int age;public Person(String name,int age){this.age=age;this.name=name;}public boolean equals(Object obj){Person person=(Person) obj;return this.name.equals(person.name)&&this.age==person.age;}
}

输出:

1163157884
1956725890

与equals方法一样,我们重写其方法:

class Person{public String name;public int age;public Person(String name,int age){this.age=age;this.name=name;}@Overridepublic int hashCode() {return Objects.hash(name,age);}

输出:

23458769
23458769 

 4.总结

小编对于String类进行了一次补充,但是hashcode是数据结构的内容,小编只是简单说明了一下其重写和作用,并没有深入讲解。

限于小编能力有限,可能有些地方存在错误,希望各位uu提出宝贵意见。

制作不易,麻烦给小编一个小小的赞吧。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • JS逆向高级爬虫
  • 【BUG】已解决:ERROR: Failed building wheel for jupyter-nbextensions-configurator
  • 【Linux】文件系统|CHS寻址|LBA逻辑块|文件索引|inode|Date block|inodeBitmap|blockBitmap
  • Python3网络爬虫开发实战(4)数据的存储
  • [Vulnhub] Raven2 PHPMailer-RCE+MSQP:Mysql权限提升
  • 【MQTT(4)】开发一个客户端,QT-Android安卓手机版本,Mosquitto替换成libhv库
  • PHP Switch 语句
  • 跨越平台的智能:Mojo模型的自定义与动态部署
  • Vue.js 2 项目实战(五):水果购物车
  • 德国云手机:企业移动办公解决方案
  • transformers进行学习率调整lr_scheduler(warmup)
  • 【详细的springboot自动装载原理】
  • 异常处理和swagger使用
  • Vue3时间选择器datetimerange在数据库存开始时间和结束时间
  • 人工智能技术的分析与探讨
  • Java 网络编程(2):UDP 的使用
  • java第三方包学习之lombok
  • java中具有继承关系的类及其对象初始化顺序
  • Solarized Scheme
  • Spring核心 Bean的高级装配
  • Twitter赢在开放,三年创造奇迹
  • vue脚手架vue-cli
  • 闭包--闭包之tab栏切换(四)
  • 关于字符编码你应该知道的事情
  • 跨域
  • 马上搞懂 GeoJSON
  • 区块链共识机制优缺点对比都是什么
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 微服务入门【系列视频课程】
  • 原生Ajax
  • 智能合约Solidity教程-事件和日志(一)
  • linux 淘宝开源监控工具tsar
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • #VERDI# 关于如何查看FSM状态机的方法
  • #数据结构 笔记三
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (C语言)fread与fwrite详解
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • .NET 药厂业务系统 CPU爆高分析
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET上SQLite的连接
  • @ModelAttribute 注解
  • @RequestBody与@RequestParam
  • [].slice.call()将类数组转化为真正的数组
  • [012-1].第12节:Mysql的配置文件的使用
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解
  • [AMQP Connection 127.0.0.1:5672] An unexpected connection driver error occured
  • [android] 手机卫士黑名单功能(ListView优化)
  • [BUG]vscode插件live server无法自动打开浏览器
  • [C#学习笔记]LINQ