Day13---学习Java第二弹
2021-07-23
数组与字符串
字符串(补充)
字符串与基本类型的转换
1、字符串转换为基本类型
java.lang包中有Byte、Short、Integer、Float、Double类的调用方法:
1)public static byte parseByte(String s)
2)public static short parseShort(String s)
3)public static short parseInt(String s)
4)public static long parseLong(String s)
5)public static float parseFloat(String s)
6)public static double parseDouble(String s)
例如:
int n = Integer.parseInt("12"); //n = 12;
float f = Float.parseFloat("12.34"); //f = 12.34
double d = Double.parseDouble("1.1234"); //d = 1.1234
2、基本类型转换为字符串类型
String类中提供了String valueOf()放法,用作基本类型转换为字符串类型。
1)static String valueOf(char data[])
2)static String valueOf(char data[], int offset, int count)
3)static String valueOf(boolean b)
4)static String valueOf(char c)
5)static String valueOf(int i)
6)static String valueOf(long l)
7)static String valueOf(float f)
8)static String valueOf(double d)
例如:
String s1 = String.valueOf(12); //s1 ="12";
String s1 = String.valueOf(12.34); //s1 = "12.34";
StringBuffer和StringBuilder类
StringBuilder和StringBuffer类拥有的成员属性以及成员方法基本相同,区别是StringBuffer类的成员方法前面多了一个关键字:
synchronized,不用多说,这个关键字是在多线程访问时起到安全保护作用的,也就是说StringBuffer是线程安全的。
String、StringBuilder、StringBuffer三者的执行效率:
StringBuilder > StringBuffer > String
当然这个是相对的,不一定在所有情况下都是这样。
比如String str = “hello”+ "world"的效率就比 StringBuilder st = new StringBuilder().append(“hello”).append(“world”)要高。
因此,这三个类是各有利弊,应当根据不同的情况来进行选择使用
当字符串相加操作或者改动较少的情况下,建议使用 String str="hello"这种形式;
当字符串相加操作较多的情况下,建议使用StringBuilder,如果采用了多线程,则使用StringBuffer。
字符串的分割
分析一个字符串并将字符串分解成可被单独使用的单词时,可以使用java.util包中的StringTokenizer类。该类有两个常用的构造方法:
1)StringTokenizer(String s) 为字符串s构造一个分析器 ,使用默认的分隔标记,即空格(若干个连续的空格视为一个空格),换行符,回车符,Tab符等。
2)StringTokenizer(String s,String delim) 为字符串s构造一个分析器,参数delim中的字符任意排列分隔标记
package Liu;
import java.util.StringTokenizer;
public class TestString {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringTokenizer st = new StringTokenizer("I promice love baiyan forever");
System.out.println("分析器分隔出:" + st.countTokens() + "个单词");
while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
}
}
分析器分隔出:5个单词
I
promice
love
baiyan
forever
equals() 和 “==” 的区别
JAVA当中所有的类都是继承于Object这个超类的,在Object类中定义了一个equals的方法,equals的源码是
public boolean equals(Object obj) {
return (this == obj);
}
而在String
类中,此方法被重写了,如下所示:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String aString = (String)anObject;
if (coder() == aString.coder()) {
return isLatin1() ? StringLatin1.equals(value, aString.value)
: StringUTF16.equals(value, aString.value);
}
}
return false;
}
这个方法的初始默认行为是比较对象的内存地址值,一般来说,意义不大。所以,在一些类库当中这个方法被重写了,如String、Integer、Date。
在这些类当中equals有其自身的实现(一般都是用来比较对象的成员变量值是否相同),而不再是比较类在堆内存中的存放地址了。
所以说,对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是内存中的存放位置的地址值,跟双等号(==)的结果相同;如果被复写,按照复写的要求来。
综上:
==: 判断两个字符串在内存中首地址是否相同,即判断是否是同一个字符串对象
在String类中,equals()比较存储在两个字符串对象中的内容是否一致