java学习日记20230404-String类

String类

  • String对象用于保存字符串,也就是一组字符序列;
  • 字符串常量对象使用双引号包括起来的字符序列
  • 字符串的字符使用unicode字符编码,一个字符(不区分字母还是汉字)占用两个字节
  • String常用的构造器:
    • new String();
    • new String(String original);
    • new String(char[] a);
    • new String(char[] a,int startIndex,int count);
  • String实现了Serializable说明String可以串行化,可以网络传输
  • String实现了Comparable接口,说明String对象可以比较
  • String 是final类,不能被继承
  • 字符串本质是char数组,value[]是一个final类型,不可以修改(地址不能修改)
  • String01
    
    public class String01 {
        public static void main(String[] args) {
            String name ="Jack";
            final char[] value = {'a','b'};
            char[] v2 = {'5','4'};
            value[0]='h';
            for(char i:value){
                System.out.println(i);
            }
            
        }
    }
  • 创建String对象的方式
    • 直接赋值:String s="测试";
    • 调用构造器:String s1 = new String("测试");
    • 方式一:先从常量池查看是否有数据空间,如果有,直接指向,如果没有则重新创建,然后指向,最终指向的是常来那个池的空间地址;
    • 方式二:现在堆中创建空间,里面维护了value属性,指向常量池的空间,如果常量池没有,重新创建,如果有,直接通过value指向,最终指向的是堆中的空间地址
    • 当调用intern方法,如果池中包含一个等于String对象的字符串,用equals(object)方法确定,则返回池中的字符串,否则将String对象爱过你添加到池中,并返回此String对象的引用;intern()方法最终返回的是常量池的地址;
    • intern
       public class String01 {
          public static void main(String[] args) {
      
              final char[] value = {'a','b'};
              char[] v2 = {'5','4'};
              value[0]='h';
              for(char i:value){
                  System.out.println(i);
              }
              String name1 = new String("Jack");
              String name ="Jack";
              System.out.println(name == name1.intern());//true
          }
      }
  • String是一个final类,代表不可变的字符序列
  • 字符串是不可变的,,一个字符串对象一旦被分配,其内容是不可变的
  • 底层是StringBuilder sb = new StringBuilder();sb.append(a);sb.append(b);sb是在堆中,并且append是在原来字符串的基础上追加的
  • String c1 = "ab" +"cd";常量相加看的是池,变量相加,是在堆中
  • 方法String示例
     public class String02 {
    
        String  str = new String("hsp");
        final char[] ch = {'j','a','v','a'};
    
        public void change(String str,char ch[]){
            str = "java";
            ch[0] = 'h';
        }
        //调用方法会开一个新栈,方法里的形参是在这个新栈里面创建的变量,String是不可以变更的,所以在新栈中str指向
        //常量池中的java,方法执行完毕后,这个栈也被销毁了,原来的str维持不变
        public static void main(String[] args) {
            String02 string02 = new String02();
            string02.change(string02.str, string02.ch);
            System.out.println(string02.str);//hsp
            System.out.println(string02.ch);//hava
        }
    }
  • String类是保存字符常量的,每次更新都需要重新开辟空间,效率较低,因此java设计者提供了StringBuilder和StringBuffer来增强String的功能,并提高效率
  • String常见的方法
    • equals 区分大小写,判断内容是否相等
    • equalsIgnoreCase忽略大小写判断内容是否相等
    • length获取字符的个数
    • indexOf获取字符在字符串中第一次出现的索引,找不到返回-1
    • lastIndexOf获取字符在字符串中最后一次出现的索引,找不到返回-1
    • substring截取指定范围的字符串
    • trim去掉前后空格
    • charAt获取某索引出的字符
    • toUpperCase
    • toLowerCase
    • concat
    • replace替换字符串中的字符
    • split分割字符串,对于某些分割符,我们需要转义比如|\\
    • compareTo比较两个个字符串大小:返回正数,前者大,相等返回0,长度相等,根据字符从左向右比较差值,字符不等,直接比较字符串长度
    • toCharArray转化为字符数组
    • format格式化字符串%s字符串 %c字符 %d整型 %.2f浮点型 ,其中%s等为占位符
    • String常用方法示例
       public class StringMethod01 {
          public static void main(String[] args) {
              String n1 = "hello";
              String n2 = "Hello";
              System.out.println(n1.toUpperCase());
              System.out.println(n2.toLowerCase());
              System.out.println(n1.concat("测试").concat("2测试").concat("23"));
              System.out.println(n1.replace("hello","开发"));
              System.out.println(n1);
      
              String name = "张三";
              int n23 = 20;
              double sal = 2000.0;
              char gender = '男';
              String test = "我的名字叫%s,今年%d岁,月收入%.2f元,性别是%c";
              System.out.println(test.format(test,name,n23,sal,gender));
              System.out.println(n1.equals(n2));
              System.out.println(n1.equalsIgnoreCase(n2));
              System.out.println(n1.length());
              System.out.println(n1.indexOf("h"));
              System.out.println(n1.indexOf("H"));
              System.out.println("kk"+n1.indexOf("ll"));
              System.out.println(n1.lastIndexOf("l"));
              System.out.println(n1.substring(3));
          }
      }
posted @   、子夜  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示