1、string字符串类型
字符串是常量,会保存在常量池。
注意:必须使用双引号包裹的字符串才是常量,会保存到常量池。
java语言中所有的字符都采用“单引号”括起来
java语言中所有的字符串都采用“双引号”括起来。
特点:创建之后长度内容是不可变的,每次拼接字符串,都会产生新的对象
优点:String类提供了丰富的关于操作字符串的方法,比如:拼接、获取对应下标处的字符、截取子串等等
缺点:在进行字符串拼接+=的时候,效率比较低
(1)java.lang.String使用的final修饰,是final的类,不能被继承
(2)字符串底层封装了字符数组以及针对字符数组的操作算法
(3)Java字符串在内存中采用Unicode编码方式,任何一个字符对应两个字节的编码。
(4)字符串一旦创建,对象内容永远无法改变(因为内部是数组),但字符串引用可以重新赋值((String底层维护的是一个char[],而且String不可变,因为源码中的数组被final修饰了))
例:
String str = new String("你好hello");//不推荐这种赋值模式
String str = "你好hello";//内存中占14个字节 共7个字符,所以占14个字节
char[] chs = {'你','好','h','e','l','l','o'} //字符串底层封装了字符数组,所以对象内容永远无法改变
2、常量池:
(1)java对字符串有一个优化的措施:专门提供了一个字符串常量池(堆中)。
(2)java推荐我们使用字面量/直接量的方式来创建字符串,并且会缓存所有以字面量形式创建的字符串对象到常量池中,当使用相同字面量再次创建字符串时会重用对象以减少内存开销,避免**内存中堆积大量内容相同的字符串对象。
String s1 = "hello";
String s2 = "hello"
//s1和s2的地址值()是不相同的,因为存储机制是不一样的
//但我们直接使用双引号(" ")写出一个字符串时,会先在常量池查找这个字符串
//如果没有相同的则会在常量池开辟空间并创建字符串,如果有则会直接使用常量池中的字符串
例:
package apiday01;
public class StringDemo {
public static void main(String[] args) {
例3:
//如下代码:常量池中会有2个存储,一个是123abc的地址,一个是123的地址
// 一个新的对象,它的值也是123abc
String s1 = "123abc";
//编译器在编译时,若发现一个计算表达式可以在编译期间确定结果,
//则直接运算好并将结果保存到表达式中,相当于String s2 = “123abc”;
String s2 = "123"+"abc";
System.out.println(s1==s2);//true,s1与s2共用常量池中的
String s3 = "123";
//当字符串拼接产生的内容与常量池是某内容相同时,也不会重用常量池的对象
String s4 = s3+"abc";//创建一个新的对象存储123abc
System.out.println(s4==s1);//false,
}
}
(1)如上面试题:
(2)如上例2:字符串不可变特性:
3、String常用方法:
(1)length():获取字符串的长度(字符个数)
package apiday01;
public class LengthDemo {
public static void main(String[] args) {
String str = "我爱Java!";
int len = str.length();
System.out.println(len);//7 即数组的长度
}
}
(2)trim():去除当前字符串两边的空白字符
package apiday01;
public class TrimDemo {
public static void main(String[] args) {
String str = " hello world ";
System.out.println(str);//会输出:[ hello world ]
str = str.trim();//去除当前字符串两边的空白字符
System.out.println(str);//会输出:[hello world]
}
}
(3)
①int indexOf(String str):检索给定字符串在当前字符串的开始位置
②int lastIndexOf(String str):检索给定字符串在当前字符串中最后一次出现的位置
package apiday01;
public class IndexofDemo {
public static void main(String[] args) {
//字符串中字母的排列顺序: 0123456789012345
String str = "thinking in Java";
int index = str.indexOf("in");//检索in在字符串str中出现的开始位置
System.out.println(index);//2
index = str.indexOf("IN");//当前字符串不包含给定内容"IN"时,所以返回值为-1
System.out.println(index);//-1
//重载的indexof可以从指定位置开始检索第一次出现指定字符串的位置
index = str.indexOf("in",3);//从第4个字符开始找in第一次出现的位置
System.out.println(index);//5
//检索给定字符串中最后一次出现的位置
index = str.lastIndexOf("in");//找in最后一次出现的位置
System.out.println(str);//9
}
}
(4)substring(int start,int end):截取当前字符串中指定范围内的字符串(含头不含尾–包含start,但不包含end)
例题1:
package apiday01;
public class SubstringDemo {
public static void main(String[] args) {
// 01234567890
String str = "www.tedu.cn";
String name = str.substring(4,8);//截取第4个到第7个 含头不含尾--包含start,但不包含end
System.out.println(name);//tedu
name = str.substring(4);//tedu.cn 从第4个一直截取到字符串末尾
}
}
拓展例题1:
package apiday01;
public class SubstringDemo {
public static void main(String[] args) {
String name = getName("www.tedu.com.cn");
System.out.println(name); //tedu
String str = getName("http://www.google.com");
System.out.println(str);//google
}
public static String getName(String line){
//0123456789012345
//www.te.du.com.cn
int start = line.indexOf(".")+1;//4 +1的目的是为了找到点后的第一个字符的位置
int end = line.indexOf(".",start);//8 从start往后找第一个“.”的位置
return line.substring(start,end);
}
}
(5)charAt():返回当前字符串指定位置上的字符
package apiday01;
public class CharAtDemo {
public static void main(String[] args) {
// 0123456789012345
String str= "thinking in Java";
char c = str.charAt(9);//获取位置9所对应的字符串
System.out.println(c);//i
}
}
(6)startsWith(String str)和endsWith(String str):判断当前字符串是否是以给定的字符串开始/结尾的
package apiday01;
public class StartswithDemo {
public static void main(String[] args) {
String str = "thinking in Java";
boolean starts = str.startsWith("think");//判断str是否以think开头的
System.out.println("starts:"+starts);//true
boolean ends = str.endsWith(".png");//判断str是否以.png结尾的
System.out.println("starts:"+ends);//false
}
(7)toUpperCase()和toLowerCase():将当前字符串中的英文部分转为全大写/全小写
package apiday01;
import java.util.Locale;
public class ToUpperCaseDemo {
public static void main(String[] args) {
String str = "我爱Java!";
String upper = str.toUpperCase();//将str中英文部分转换为全大写
System.out.println(upper);//我爱JAVA!
String lower = str.toLowerCase();//将str中英文部分转换为全小写
System.out.println(lower);//我爱java!
}
}
(8)valueOf():String类中提供的静态方法,将其它数据类型转换为String
package apiday01;
public class ValueOfDemo {
public static void main(String[] args) {
int a = 123;
String s1 = String.valueOf(a);//将int型变量a转换为String类型赋值给s1 因为是static静态方法,所以类名打点
System.out.println("s1:"+s1);//123
double dou = 123.456;
String s2 = String.valueOf(dou);//将double型变量dou转换为String类型赋值给s2
System.out.println("s1:"+s2);//123.456
String s3 = a+" ";//任何内容与字符串连接结果都是字符串,效率低
System.out.println(s3);//123
}
}
补充:
- ASCII:美国标准编码,是美国最早的字符集,也是计算机最底层的字符集,一个字节GBK:国标编码,中国自己的编码,总共6万多个Unicode:万国码,装全世界所有符号UTF:在Unicode基础之上做的二次编码,里面加入了一个长度信息来标记是按一个字符解析还是按两个字符算
API基础第一天作业:结论:互联网上真正使用的并不是unicode,真正传输出的是UTF这种带长度信息的编码,拿到UTF数据后再把长度去掉,还原成unicode编码。
1、练习String数据类型及常用方法:indexOf()、length()、substring()、charAt()、trim()、startsWith()、endsWith()、toUpperCase()、toLowerCase()、valueOf()
package string;
public class IndexOfDemo {
public static void main(String[] args) {
// 0123456789012345
String str = "thinking in java";
//查找in在当前字符串中第一次出现的位置
int index = str.indexOf("in");
System.out.println(index);//2
//从指定位置开始检索第一次出现给定字符串的位置
index = str.indexOf("in",3);
System.out.println(index);//5
//检索最后一次出现给定字符串的位置
index = str.lastIndexOf("in");
System.out.println(index);//9
}
}
package string;
public class LengthDemo {
public static void main(String[] args) {
String str = "我爱java!";
System.out.println("len:"+str.length());
}
}
package string;
public class SubstringDemo {
public static void main(String[] args) {
String name = getName("www.tedu.com.cn");
System.out.println(name); //tedu
String str = getName("http://www.google.com");
System.out.println(str); //google
}
public static String getName(String line){
//012345678901234
//www.tedu.com.cn 第一个点到第二个点之间的字符串
int start = line.indexOf(".")+1; //4,加1目的是为了找到点后的第一个字符的位置
int end = line.indexOf(".",start); //8,从start往后找第一个.的位置
return line.substring(start,end);
}
}
package string;
public class CharAtDemo {
public static void main(String[] args) {
// 0123456789012345
String str = "thinking in java";
//获取第5个字符是什么?
char c = str.charAt(4);
System.out.println(c);
}
}
package string;
public class TrimDemo {
public static void main(String[] args) {
String str = " hello ";
System.out.println(str);
String trim = str.trim();//trim方法返回后的字符串不含有两边的空白字符
System.out.println(trim);
}
}
package string;
public class StartsWithDemo {
public static void main(String[] args) {
String str = "www.tedu.com";
//查看str是否是以"www."开始的
boolean starts = str.startsWith("www.");
System.out.println(starts);
boolean ends = str.endsWith(".cn");
System.out.println(ends);//false
ends = str.endsWith(".com");
System.out.println(ends);//true
}
}
package string;
public class ToUpperCaseDemo {
public static void main(String[] args) {
String str = "我爱Java";
System.out.println(str);
String upper = str.toUpperCase();
System.out.println(upper);
String lower = str.toLowerCase();
System.out.println(lower);
}
}
package string;
public class valueOfDemo {
public static void main(String[] args) {
int a = 123;
String str = String.valueOf(a);
double dou = 123.123;
String str2 = String.valueOf(dou);
System.out.println(str);
System.out.println(str2);
String str3 = a + "";
System.out.println(str3);
}
}



