目录
String Stringbuffer Stringbulider区别
通过么
String
特点:字符串一旦被初始化,就不可以改变,存放在方法区中的常量。
String s1 = "abc"; //s1指向的内存中有一个对象abc
String s2 = new String("abc"); //s2指向的内容中有两个对象abc 和 new。
s1 == s2 false
s1.equals(s2) true ,字符串中equals比较的是字符串内容是否相同。
字符串的方法:
构造方法
将字节数组或字符数组转成字符串。
String s1 = new String(); //创建一个空内容的字符串
String s2 = null; //s2没有任何对象指向,是一个null 常量值
String s3 =""; //s3指向一个具体的字符串对象,只不过这个字符串没有内容
一般定义字符串时,不用 new 。直接用 String str="abc"; 这种方式。
new String(char[]); //将字符数组转成字符串
new String(char[]); //将字符数组中的一部分转成字符串
一般方法
1.获取
获取字符串的长度:length();
指定位置的字符:char charAt(index);
获取指定字符的位置。如果不存在返回-1,所以通过返回值-1来判断字符不存在的情况。
int indexOf(int ch); 返回第一次找到的字角脚标
int indexOf(int ch,int formIndex); 返回从指定位置开始第一次找到的角标
int indexOf(String str); 返回第一次找到的字符串角标
int indexOf(String str,int fromIndex);
int LastIndexOf(int ch);
int LastIndexOf(int ch,int formIndex);
int LastIndexOf(String str);
int LastIndexOf(String str,int fromIndex);
获取子串
String substring(int start); 从start位开始,到length()-1位为止。
String substring(int start,int end); 从start开始到end为止,不包含end位。
2.判断
字符串中包含指定的字符串吗? boolean contains(String str);
字符串是否以指定字符串开头 boolean startsWith(String str);
字符串是否以指定字符串结尾 boolean endWith(String str);
判断字符串是否相同 boolean equals(String str); //覆盖了Object中的方法,判断字符串内容是否相同。
判断字符串是否相同,忽略大小写 boolean equalsIgnoreCase(String str);
3.转换
1. 通过构造函数可以将字符数组或者字节数组转换字符串。
2. 可以通过字符串中的静态方法,将字符数组转成字符串。
static String copyValueOf(char[] char);
static String cpyeValusOf(char[] char,int offset, int count);
static String valueOf(char[] char);
static String valueOf(char[] char,int offest,int count);
3、将基本数据类型或者对象转成字符串
static String valueOf(char char);
staic String valueOf(dobble double//float folat/int int /boolean boolean/long long/Object object )
4.将字符串转大小写
String toLowerCase(); String toUpperCase();
5.将字符串转成数组
char[] toCharArray(); 转成字符数组。
byte[] getbyte(); 可以加入编码表。转成字节数组。
6.将字符串转成字符串数组,切割方法
String [] split();
7.将字符串进行内容替换。注意:修改后变成新字符串,并不是将原字符串直接修改。
String replace(CharOldChar ,newChar);
String replace(OldString,newString);
8.String concat(String string); 对字符串进行追加
String trim(); 去除字符串两端的空格
int compareTo(); 如果参数字符串等于此字符串,则返回值0;如果此字符串按字典顺序小于字符串参数,则返回一个小于0的值;如果此字符串按字典顺序大于字符串参数,则返回一个大于0的值。
StringBuffer字符串缓冲区
构造一个其中不带字符的字符串缓冲区,初始容量为16个字符。
1.添加
StringBuffer append(String data); 在缓冲区中追加数据。追加到尾部
StringBuffer insert(index,data); 在指定位置插入数据。
2. 删除
StringBuffer delete(start,end); 删除从start至end-1范围的元素
StringBuffer deleteCharAt(index); 删除指定位置元素
sb.delete(0,sb.length()); 清空缓冲区
3. 修改
StringBuffer replace(start,end,string); 将start至end-1替换成string
void setCharAt(index,char); 替换指定位置的字符
void setLength(len);将原字符串置为指定长度的字符串
4. 查找(查不到返回—1)
int indexOf(string); 返回指定子字符串在此字符串中第一次出现处的索引。
int indexOf(string,int fromIndex);从指定位置开始查找字符串
int lastIndexOf(string); 返回指定子字符串在此字符串中最右边出现处的索引。
int lastIndexOf(string,int fromIndex); 从指定的索引开始反向搜索
5. 获取子串
string substring(start); 返回start到结尾的子串
string substring(start,end); 返回start至end—1的子串
6. 反转
StringBuffer reverse();字符串反转
StringBuilder字符串缓冲区
JDK1.5出现StringBuiler;构造一个其中不带字符的字符串生成器,初始容量为 16 个字符。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。方法和StringBuffer一样;
StringBuffer 和 StringBuilder 的区别:
StringBuffer线程安全,StringBuilder线程不安全。
单线程操作,使用StringBuilder 效率高。
多线程操作,使用StringBuffer 安全。
String Stringbuffer Stringbulider区别
- String 是 final 修饰的,无法被继承。所以 String 不是 Java 的基本数据类型。字符串在 Java 中是不可变的,因此适合在多线程环境下使用。
- 是 “ 字符串常量” , 对象一旦创建就不可改变,这就导致如果字符串常量池中没有所需对象,每次对对象的操作都会创建一个新的对象,这样不仅效率低下,而且还会浪费大量有限的内存空间。
- 与 StringBuilder,是 “字符串变量”, 是可以改变的对象, 和 String 类不同的是,和 StringBuilder 类的对象能够被多次修改,且不产生新的未使用的对象。
- StringBuffer 是线程安全的。
- 在 JDK8 中:String 底层最终使用字符数组 char[] 来存储字符值;但在 JDK9 之后,JDK 维护者将其改为了 byte[] 数组作为底层存储
equal和==区别
- equals 是Object的方法,而 == 是操作符;
- 对于基本类型的变量来说(如 short、 int、 long、 float、 double),只能使用 == ,因为这些基本类型的变量没有 equals 方法。对于基本类型变量的比较,使用 == 比较, 一般比较的是它们的值。 引用数据类型:比较的是引用的地址是否相同,比如说新建了两个User对象,比较的是两个User的地址是否一样。
- 对于引用类型的变量来说(例如 String 类)才有 equals 方法,因为 String 继承了 Object 类, equals 是 Object 类的通用方法。对于该类型对象的比较,默认情况下,也就是没有复写 Object 类的 equals 方法,使用 == 和 equals 比较是一样效果的,都是比较的是它们在内存中的存放地址。但是对于某些类来说,为了满足自身业务需求,可能存在 equals 方法被复写的情况,这时使用 equals 方法比较需要看具体的情况,例如 String 类,使用 equals 方法会比较它们的值;
hashcode与equal区别
- ==对比的是栈中的值,基本数据类型是变量值,引用类型是堆中内存对象的地址 。
- equals:object中默认也是采用==比较,通常会重写。
- 如果两个对象相等,则hashcode一定也是相同的
- 两个对象相等,对两个对象分别调用equals方法都返回true
- 两个对象有相同的hashcode值,它们也不一定是相等的
- 因此,equals方法被覆盖过,则hashCode方法也必须被覆盖
- hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)。
使用场景
hashCode():顶级父类Object的方法,返回值类型为int类型的值,根据一定的规则(存储地址,字段,长度等等)生成一个数组,数据保存的就是Hash值
equals():顶级类Object中的方法,根据一定的比较规则,判断对象是否一致,底层一般逻辑:
1.判断两个对象的内存地址是否一样
2.非空判断和Class类型判断
3.强转
4.对象中的字段一一匹配