String和Object

String和Object,第1张

String和Object

String概述
String 被声明为 final,因此它不可被继承。
在 Java 8 中,String 内部使用 char 数组存储数据。
在 Java 9 之后,String 类的实现改用 byte 数组存储字符串,同时使用 coder 来标识使用了哪种编码。

常用API

//比较字符串的,比较的是字符串内容 ,返回的是boolean
boolean equals(Object anObject)
//根据索引获取对应的字符
char charAt(int index)
//获取字符串长度    
char[] toCharArray()
//将指定的字符串连接到该字符串的末尾。返回的是一个新串
int indexOf (String str) 
//截取,返回一个子字符串,从beginIndex到endIndex截取字符串。含beginIndex,不含endIndex
String substring (int beginIndex, int endIndex)
//将前面的字符串替换成后面的字符串
String replace (CharSequence target, CharSequence replacement)
//将此字符串按照给定的规则拆分为字符串数组,比如按“,”切分,注意按“.”切分需要加“\”转义
String[] split(String regex)
//判断字符串是否是以我们填写的字符串结尾
boolean endsWith(String suffix)
//判断字符串是否是以我们填写的字符串开头
boolean startsWith(String prefix):

new String(“abc”)会创建两个对象(前提是常量池中没有“abc”字符串对象)
首先“abc”是字符串,会在字符串常量池中创建这个对象,指向“abc”这个字符串字面量。
而使用new的话会在堆空间中创建这个对象。

StringBuffer StringBuilder的区别
可变性
String类中使用字符数组保存字符串,private final char value[],所以string对象是不可变的。StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,char[] value,这两种对象都是可变的。

String中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。

每次对String 类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String 对象。StringBuffer每次都会对StringBuffer对象本身进行 *** 作,而不是生成新的对象并改变对象引用。
如果要 *** 作少量的数据用 = String
单线程 *** 作字符串缓冲区 下 *** 作大量数据 = StringBuilder
多线程 *** 作字符串缓冲区 下 *** 作大量数据 = StringBuffer

Object常用的API
hashCode()
equals
clone()
toString
notify()
notifyAll()
wait(long timeout)
对于基本类型, == 判断两个值是否相等,基本类型没有 equals() 方法。
对于引用类型,== 判断两个变量是否引用同一个对象,而 equals() 判断引用的对象是否等价(这
里的等价对于 String 来说是内容相同,对于其它对象来说,可以重写自己的 equals 方法进行定义,
否则使用的是 Object 的 equals 方法,底层实现一样是==)。

hashCode和equals
(1)HashCode介绍:hashCode()的作用是获取哈希码,又称为散列码,实际上是返回一个int型整数,来确定该对象在哈希表中的索引位置。hashCode()定义在JDK的java.object中,因此java中的所有类都包含hashCode()。
哈希表存储的是键值对(key-value),即可以通过键来快速的查找到对应的值。
(2)hashCode存在意义:以HashSet如何检查重复为例
当你把对象加入到HashSet中时,首先会计算该对象的hashcode值来判断对象加入的位置,同时还会与其他对象的hashcode值相比较,如果没有相同的hashcode值,hashset是假定没有重复的对象出现。如果有重复的hashcode值,那么就会调用equals()方法来检查hashcode值相等的两个对象是否真的相等,如果相同,hashset不会让该对象添加,如果不同,就会重新散列到其他位置。
(3)hashcode()与equals()的相关规定
如果两个对象相等,那么equals和hashcode一定相等。
如果两个对象有相同的hashcode值,那么也不一定相等。
因此equals()方法被覆盖时,hashcode也一定被覆盖,因此如果没有重写hashcode的话,那么一定不会相等。

一个好的代码具备什么特点?
(1)具有良好的可维护性
在原有的设计下能快速的修改添加代码,并且出现BUG的几率较小。
(2)具有良好的可读性
编码符合规范,有注释,并且长度适中
(3)可扩展性
在不改动或者少量改动原有代码的前提下,通过扩展增加新的代码
(4)灵活性,简洁性和可重用性
代码简单逻辑清晰,避免写重复代码

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5607941.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存