Java学习笔记(16)——String、string中的方法

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数组中
  //可以用来判断字符的编码值
 }

猜你喜欢

转载自blog.csdn.net/qq_42351519/article/details/111304189