String: value[] 底层调用Arrays.copyOf (public final class String) 是不可变类,不能修改原来的值,只能产生新对象 单线程
String s = new String(“hello”)和String s = “hello”;的区别?
有。前者会创建2个对象,后者创建1个对象。
==:比较引用类型比较的是地址值是否相同
equals:比较引用类型默认也是比较地址值是否相同,而String类重写了equals()方法,比较的是内容是否相同。
public class Demo2{
public static void main(String[] args) {
String s1 = new String("hello");
String s2 = "hello";
System.out.println(s1 == s2);// false
System.out.println(s1.equals(s2));// true
}
}
字符串如果是变量相加,先开空间,在拼接。
字符串如果是常量相加,是先加,然后在常量池找,如果有就直接返回,否则,就创建
public class Demo3 {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1 + s2);// false
System.out.println(s3.equals(s1 + s2));// true
System.out.println(s3 == "hello" + "world");// false 这个我们错了,应该是true
System.out.println(s3.equals("hello" + "world"));// true
}
}
int length():获取字符串的长度。
char charAt(int index):获取指定索引位置的字符
int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
int indexOf(String str,int fromIndex):返回指定字符串在此字符串中从指定位置后第一次 String substring(int start):从指定位置开始截取字符串,默认到末尾。
String substring(int start,int end):从指定位置开始到指定位置结束截取字符串。**
public class Demo4 {
public static void main(String[] args) {
// 定义一个字符串对象
String s = "helloworld";
// int length():获取字符串的长度。
System.out.println("s.length:" + s.length());
System.out.println("----------------------");
// char charAt(int index):获取指定索引位置的字符
System.out.println("charAt:" + s.charAt(7));
System.out.println("----------------------");
// int indexOf(int ch):返回指定字符在此字符串中第一次出现处的索引。
System.out.println("indexOf:" + s.indexOf('l'));
System.out.println("----------------------");
// int indexOf(String str):返回指定字符串在此字符串中第一次出现处的索引。
System.out.println("indexOf:" + s.indexOf("owo"));
System.out.println("----------------------");
// int indexOf(int ch,int fromIndex):返回指定字符在此字符串中从指定位置后第一次出现处的索引。
System.out.println("indexOf:" + s.indexOf('l', 4));
System.out.println("indexOf:" + s.indexOf('k', 4)); // -1
System.out.println("indexOf:" + s.indexOf('l', 40)); // -1
System.out.println("----------------------");
// String substring(int start):从指定位置开始截取字符串,默认到末尾。包含start
System.out.println("substring:" + s.substring(5));
System.out.println("substring:" + s.substring(0));
System.out.println("----------------------");
// String substring(int start,intend):从指定位置开始到指定位置结束截取字符串。包括start索引但是不包end索引
System.out.println("substring:" + s.substring(3, 8));
System.out.println("substring:" + s.substring(0, s.length()));
}
}
StringBuffer.append 追加 不产生新对象 ; 多线程 synchronized线程保护
StringBuilder append 不产生新对象 单线程
public class StringDemo {
public static void main(String[] args) {
String str1 = "abcde";
String str2 = "hello";
String str3 = str1+str2+"world";
System.out.println(str3);
}
public static void main4(String[] args) {
String str1 = "abcde";
String str2 = "abcde";
System.out.println(Integer.toHexString(str1.hashCode()));
str1 = str1+"fg";
System.out.println(Integer.toHexString(str1.hashCode()));
System.out.println("===========================");
StringBuffer stringBuffer = new StringBuffer("hello");
System.out.println(stringBuffer);
System.out.println(Integer.toHexString(stringBuffer.hashCode()));
stringBuffer.append("world");
System.out.println(stringBuffer);
System.out.println(Integer.toHexString(stringBuffer.hashCode()));
System.out.println("=============stringBuilder==============");
StringBuilder stringBuilder = new StringBuilder("tulun");//"tulunworld"
System.out.println(stringBuilder);
System.out.println(Integer.toHexString(stringBuilder.hashCode()));
stringBuilder.append("world");
System.out.println(stringBuilder);
System.out.println(Integer.toHexString(stringBuilder.hashCode()));
}
练习题:逆置数组
"abcdef" ===> "cdefab"
.整体逆置fedcba
here is tulun==>tulun is here
* 1、abcdef
*/
public class HomeWork {
public static String reverse1(String str,int begin,int end) {
char[] ch = str.toCharArray();
char tmp;
while(begin < end) {
tmp = ch[begin];
ch[begin] = ch[end];
ch[end] = tmp;
begin++;
end--;
}
return String.copyValueOf(ch);//将ch转化为字符串
}
public static void reverse(char[] ch,int begin,int end) {
//char[] ch = str.toCharArray();
char tmp;
while(begin < end) {
tmp = ch[begin];
ch[begin] = ch[end];
ch[end] = tmp;
begin++;
end--;
}
//return String.copyValueOf(ch);//将ch转化为字符串
}
//here is tulun ====> 微信部门
public static String reverseSentence(String str) {
if(str == null) {
return null;
}
char[] ch = str.toCharArray();
//str = reverse(str,0,str.length()-1);//""
reverse(ch,0,ch.length-1);//
int i = 0;//单词的开始
int j = 0;//单词的结束
while(i < str.length()) {
if(ch[i] == ' ') {//str.chaAt(i)
i++;
j++;
} else if(j == ch.length || ch[j] == ' ') {
reverse(ch,i,--j);
i = ++j;
} else {
j++;
}
}
return String.copyValueOf(ch);
}
public static void leftRoadString(String str,int n) {//2
if(str == null || n < 0 || n > str.length()) {
return;
}
//abcdef
int left = 0;
int leftend = n-1;
int right = n;
int rightend = str.length()-1;
str = reverse1(str,left,leftend);//bacdef
str = reverse1(str,right,rightend);//bafedc
str = reverse1(str,left,rightend);//cdefab
System.out.println(str);
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();
System.out.println(reverseSentence(str));
/* int n = scanner.nextInt();
leftRoadString(str,n);*/
/*String string = "abcdef";
char[] chars = new char[10];
//string.getChars(chars,0);
string.getChars(0,4,chars,0);*/
}
}