String
最终类,没有子类;Java中的所有的字符串直接量都是string类的对象。
string类的对象都是常量,字符串都是常量,值创建后不能被改变,
因为字符串底层都是依赖于不可改变的字符数组来实现的,创建之后不能改变。
如果string类的对象的内容一致时,则会共享一个常量池里的引用。
如果等号右边的值都是直接常量,编译时进行优化,即将最终结果进行存储。
字符串的底层实现
//字符串创建对象的形式
String str1 = "ab";
String str2 = new String("ab");
String str3 = "ab";
String str4 ="a"+"b";
String str5 ="a";
str5 = str5 + "b";
//比较地址值
System.out.println(str1==str2);//false 因为创建了新的对象 即new了
System.out.println(str1==str3);//true
System.out.println(str1==str4);//true
System.out.println(str1==str5);//false
System.out.println(str2==str5);//false
/* String str1 = "ab"; 指向常量池
* 方法区 = 静态常量池 + 运行常量池(所有的常量)
* 堆的地址存于方法区的常量池
* 栈中存储的是方法区常量的地址
* 栈通过指向方法区的地址间接的访问堆的地址
* String str2 = new String("ab"); 指向堆
* 在堆内存中存储常量的地址
* 栈内存中存储的是堆内存的地址
* String str3 = "ab"; 指向常量池
* String str4 ="a"+"b"; 指向常量池
* byte b = 128-1; 直接量进行运算时,编译时直接进行优化拼接 相当于 “ab”.
* String str5 ="a";str5 = str5 + "b"; 不是直接量的优栈内存和常量池的地址的指向
*/
string中的方法
public static void main(String[] args) {
long starttime = System.currentTimeMillis();
//返回运行前从1970年1月1日0分0秒到现在的毫秒值
//用 + 进行字符拼接
String str="";
for (int i = 0; i < 10000; i++) {
str+="a";
}
long endtime = System.currentTimeMillis();
//返回运行后从1970年1月1日0分0秒到现在的毫秒值
long time =endtime - starttime ;//程序执行时间
System.out.println(time);
String s = "wtrhsfns";
//length()返回字符串的长度
for (int i = 0; i < s.length(); i++) {
//charAt(i)根据下标遍历字符串中的字符 并打印 下标从0开始
System.out.println(i+","+s.charAt(i));
}
//把字符串中的内容转换成字符数组
char[] c = s.toCharArray();
System.out.println(s);
System.out.println(Arrays.toString(c));
//把字符数组转成字符串对象 根据它的含参构造方法进行值的传递
String ss = new String(c,0,4);
System.out.println(ss);
new StringDemo2().TJ("gAZazfgFWW54 09541");
new StringDemo2().stringSum("gAZazfgFWW54 09541");
new StringDemo2().compare();
new StringDemo2().concat();
new StringDemo2().comtainDemo();
new StringDemo2().end();
new StringDemo2().bytes();
}
//判断字符串中是有多少个小写和数子
public void TJ(String str) {
int letter=0;
int num=0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if(c>='a'&&c<='z') {
letter++;
}if(c>='0'&&c<='9'){
num++;
}
}
System.out.println("小写英文字母有"+letter+","+"数字有"+num);
}
//字符串中的数字求和
public void stringSum(String str) {
int num=0;
for (int i = 0; i < str.length(); i++) {
char c = str.charAt(i);
if(c>='0'&&c<='9'){
num+=c-'0';
//java中字符进行运算时 自动变为 原来的那个ascll码值 其原理是一个常量加各自的值
//而0的码值最小 因此 可以通过0的差值来求解
}
}
System.out.println("所有数字之和为"+num);
}
public void compare() {
String name1 = "1604567890";
String name2 = "1234567892";
name1.compareTo(name2);
System.out.println(name1.compareTo(name2));
//比较方法字典比较 compareTo
//分析它的源码可以发现 该方法是用来比较 两个字符串的字符的大小的方法
//即 如果字符串中字符的顺序都一样 那么 直接比较字符串的长度
//如果 字符串中字符的顺序不一样 则直接返回第一个不一样字符的大小差
//具体看源码
//如果返回值是正的 前面的字符串对象大于后面的对象 或 前面字符串的对象的字符比后面的大
}
public void concat() {
String name1 = "abc";
System.out.println(name1.concat("123"));
//拼接字符串concat
//将一个字符串拼接在另一个字符串的末尾
}
public void comtainDemo() {
String name1 = "abc";
System.out.println(name1.contains("a"));
//比较前面的字符串里面是否包含contains函数括号里面的字符
//即判断新字符串是否是旧字符串的连续子字符串
//包含则返回true
//否则则返回false
}
public void end() {
String name1 = "abcd";
System.out.println(name1.endsWith("b"));
//该方法比较原字符串的结尾是否是以endswith后面的括号内的字符结尾
//可以用来查找文件
//可以用来查找班级等
name1.equals("123");
//判断字符串是否一样
}
public void bytes() {
String name1 = "Aabcd0姐";
byte bs[] = name1.getBytes();
System.out.println(bs.length);//运行结果8
System.out.println(Arrays.toString(bs));//运行结果[65, 97, 98, 99, 100, 48, -67, -29]
//由该运行结果可以知道
//该方法是将字符的编码值存于byte数组中
//可以用来判断字符的编码值
}