1.String 类12个常用方法
1、用字符数组value创建一个String对象
方法:
public String(char[] value)
实例:
char[] value ={“a”,“b”,“c”,“d”};
String str = new String(value);
//相当于String str = newString(“abcd”);
2、用字符数组以x开始的n个字符创建一个String对象。
方法:
public String(char chars[], int x, int n)
实例:
char[] value ={“a”,“b”,“c”,“d”};
String str = new String(value, 1, 2);
//相当于String str = newString(“bc”);
3、获取字符串长度
方法:
public int length()
实例:
String str = new String(“478bhjd56”);
int strlength = str.length();
4、获取字符串某一位置的字符
方法:
public char charAt(int index)
实例:
String str = new String(“43dfzyd”);
char ch = str.charAt(4);//ch = z
注意:字符串中第一个字符索引是0,最后一个是length()-1。
5、获取字符串的子串
方法:
public String substring(int beginIndex)
//该方法从beginIndex位置起,
//从当前字符串中取出剩余的字符作为一个新的字符串返回。
public String substring(int beginIndex, intendIndex)
//该方法从beginIndex位置起,从当前字符串中
//取出到endIndex-1位置的字符作为一个新的字符串返回。
实例:
String str1 = newString(“asdfzxc”);
String str2 = str1.substring(2);//str2 =“dfzxc”
String str3 = str1.substring(2,5);//str3 =“dfz”
6、字符串的比较
方法:
public int compareTo(String str)
//该方法是对字符串内容按字典顺序进行大小比较,
//通过返回的整数值指明当前字符串与参数字符串的大小关系。
//若当前对象比参数大则返回正整数,反之返回负整数,相等返回0。
public int compareToIgnoreCase (String str)
//与compareTo方法相似,但忽略大小写。
public boolean equals(Object obj)
//比较当前字符串和参数字符串,在两个字符串相等的时候返回true,否则返回false。
public boolean equalsIgnoreCase(String str)
//与equals方法相似,但忽略大小写。
实例:
String str1 = new String(“abc”);
String str2 = new String(“ABC”);
int a = str1.compareTo(str2);//a=32
int b = str1.compareToIgnoreCase(str2);//b=0
boolean c = str1.equals(str2);//c=false
boolean d =str1.equalsIgnoreCase(str2);//d=true
7、查找子串在字符串中的位置
方法:
public int indexOf(String str)
//用于查找当前字符串中字符或子串,返回字符或
//子串在当前字符串中从左边起首次出现的位置,若没有出现则返回-1。
public int indexOf(String str, intfromIndex)
//改方法与第一种类似,区别在于该方法从fromIndex位置向后查找。
public int lastIndexOf(String str)
//该方法与第一种类似,区别在于该方法从字符串的末尾位置向前查找。
public int lastIndexOf(String str, intfromIndex)
//该方法与第二种方法类似,区别于该方法从fromIndex位置向前查找。
实例:
String str = “welcome to readzhiyin”;
int a = str.indexOf(‘t’);//t = 8
int b = str.indexOf(“read”);//b =11
int c = str.indexOf(“l”,3);//c =-1
int d = str.lastIndexOf(“e”);//d= 12
int e =str.lastIndexOf(“i”,2);//e = -1
8、字符串中字符的大小写转换
方法:
public String toLowerCase()
//返回将当前字符串中所有字符转换成小写后的新串
public String toUpperCase()
//返回将当前字符串中所有字符转换成大写后的新串
实例:
String str = new String(“JavaStudy”);
String str1 = str.toLowerCase();
//str1 = “javastudy”
String str2 = str.toUpperCase();
//str2 = “JAVASTUDY”
9、字符串两端去空格
方法:
String trim()
//去除字符串两端的空格,中间的空格不变,一般用于登陆注册时
实例:
String str = " z dali “;
String str1 = str.trim();
int a = str.length();//a = 8
int b = str1.length();//b = 6
System.out.println(a+”\n"+b);
10、将字符串分割成字符串数组
方法:
String[] split(String str)
实例:
String str = “sgs#jkc#eer”;
String[] str1 = str.split("#");
for (int i = 0; i < str1.length; i++) {
System.out.println(str1[i]);
//输出结果是sgs jkc eer
}
11、基本类型转换为字符串
方法:
static String valueOf(xxx xx)
实例:
String s1 = String.valueOf(12.99);
System.out.println(s1);
//double类型转string类型
12、替换字符串
方法:
public String replace(char oldChar, charnewChar)
//用字符newChar替换当前字符串中所有的oldChar字符,
//并返回一个新的字符串。
public String replaceFirst(String regex,String replacement)
//该方法用字符replacement的内容替换当前字符串中遇到的
//第一个和字符串regex相匹配的子串,应将新的字符串返回。
public String replaceAll(String regex,String replacement)
//该方法用字符replacement的内容替换当前字符串中遇到的所有
//和字符串regex相匹配的子串,应将新的字符串返回。
实例:
String str = “hjdfjdskdd”;
String str1 = str.replace(‘h’,‘g’);
//str1 =“gjdfjdskdd”
String str2 =str.replace(“hj”,“xxx”);
//str2 = “xxxdfjdskdd”
String str3 =str.replaceFirst(“d”,“c”);
//str3 = “hjcfjdskdd”
String str4 =str.replaceAll(“hj”,“xxx”);
//str4 = “xxxdfjdskdd”
System.out.println(str1+"\n"+str2+"\n"+str3+"\n"+str4);
2.new String(),一共创建了几个对象
下面,我们可以来分析下String s = new String(“Hollis”);创建对象情况了。
这段代码中,我们可以知道的是,在编译期,符号引用s和字面量Hollis会被加入到Class文件的常量池中,然后在类加载阶段,这两个常量会进入常量池。
但是,这个“进入”过程,并不会直接把所有类中定义的常量全部都加载进来,而是会做个比较,如果需要加到字符串常量池中的字符串已经存在,那么就不需要再把字符串字面量加载进来了。
所以,当我们说<若常量池中已经存在"hollis",则直接引用,也就是此时只会创建一个对象>说的就是这个字符串字面量在字符串池中被创建的过程。
说完了编译期的事儿了,该到运行期了,在运行期,new String(“Hollis”);执行到的时候,是要在Java堆中创建一个字符串对象的,而这个对象所对应的字符串字面量是保存在字符串常量池中的。但是,String s = new String(“Hollis”);,对象的符号引用s是保存在Java虚拟机栈上的,他保存的是堆中刚刚创建出来的的字符串对象的引用。
所以,你也就知道以下代码输出结果为false的原因了。
String s1 = new String(“Hollis”);
String s2 = new String(“Hollis”);
System.out.println(s1 == s2);
因为,==比较的是s1和s2在堆中创建的对象的地址,当然不同了。但是如果使用equals,那么比较的就是字面量的内容了,那就会得到true。
在不同版本的JDK中,Java堆和字符串常量池之间的关系也是不同的,这里为了方便表述,就画成两个独立的物理区域了。具体情况请参考Java虚拟机规范。
上图中s1和s2是两个完全不同的对象,在堆中有自己的内存空间,当然不相等了。
所以,String s = new String(“Hollis”);创建几个对象的答案你也就清楚了。
常量池中的“对象”是在编译期就确定好了的,在类被加载的时候创建的,如果类加载时,该字符串常量在常量池中已经有了,那这一步就省略了。堆中的对象是在运行期才确定的,在代码执行到new的时候创建的。
3.hashCode和equals方法的区别和联系
1、如果两个对象equals相等,那么这两个对象的HashCode一定也相同.
2、如果两个对象的HashCode相同,不代表两个对象就相同,只能说明这两个对象在散列存储结构中,存放于同一个位置.
4.String、StringBuilder、StringBuffer
String 是一个不可变类,即创建String对象后,该对象中的字符串是不可改变的
StringBuffer与StringBuilder都提供了一系列插入、追加、改变字符串里的字符序列的方法,它们的用法基本相同,只是StringBuilder是线程不安全的,StringBuffer是线程安全的。如果只是在单线程中使用字符串缓冲区,则StringBuilder的效率会高些,但是当多线程访问时,最好使用StringBuffer。
5.IP 如何转换成Long类型
6.Java读源码之StringBuffer的append()方法