• 欢迎光临~

2022-7-20-第八组-曹雨面向对象-字符串

开发技术 开发技术 2022-07-20 次浏览

String 字符串:

String字符串是一个类
类当中可以有属性,方法,构造器。
String一旦声明,不可以改变。(对于基本数据类型,比如int来说,如果你新赋一个值,他会把原来的值,给“干掉”;对于String来说,在内存级别中,你定义了一个String类型的值,它会一直在内存中)
字符串也有长度,也有下标

s1就是String中的一个对象

publlic static void main(String[] args){
        String s1 = "abcdefg";
}

还有第二种写法

创建这个对象调用了一个构造器:
String s2 = new String("abcdefg");
这两种方式虽然都是定义一个字符串,但是并不是一回事:
如果使用了第二种写法,因为有“new”所以它会在堆内存中新开辟一块区域。在栈内存中存s2,通过地址s2在栈内存中找到"abcdefg"的值。
如果使用了第一种写法,s1在栈内存中,但是abcdefg不在存在堆内存中。

我们可以进行验证

System.out.println(s1==s2)
双等号比较的是虚地址,虚地址是对象在内存中的存储位置,而两者不在一个地址内,所以会输出false;

得到的值是:false
小规律:
=赋值,无论怎么比较,都是true
new赋值,用双等号比较,就是false

String字符串的比较:

除了

String a = 1;
String b = 1;
System.out.println(a==b)

这样以外,其他所有方法,都会因为地址不相同,所以都会输出false。

equals方法

1.需要传参,传String类型的参数
2.返回值是boolean类型
3.访问权限public

    Scanner sc = new Scanner(System.in);
    System.out.println("请输入字符串1:");
    String s3 = sc.next();
    System.out.println("请输入字符串2:");
    String s4 = sc.next();
    

    System.out.println(s3.equals(s4));
equals比较的是两个字符串的“值”。不是地址。
length方法:

1.不需要传参
2.有返回值,整型int
3.访问权限public

字符串获取长度的方法和数组获取长度有什么区别?
答:数组的length是属性,字符串的length()是方法

      public static void main(String[] args) {
         
          String s1 = "abcdefg";
          System.out.println(s1.length());
          两者没有任何关系。
          int [] arr = new int[10];
          System.out.println(arr.length);
      }
}
字符串的下标:
ublic static void main(String[] args) {
    String s1 = "abcdefg";
    // 取出指定下标位置的字符
    System.out.println(**s1.charAt(0**));
    Scanner sc = new Scanner(System.in);
    char c = sc.next().charAt(0);
    System.out.println(c + 1);
  }
}
得出结果是:a s1的0下标元素。

输入一个char类型(实质是取你输入元素的第一位)

char c = sc.next().charAt(0);
判断字符串是否存在indexOf
 public static void main(String[] args) {
    String s1 = "abcde";
    s1.indexOf('a');
    System.out.println(s1.lastIndexOf("a",12));
}

小案例:统计一个字符串在另一个字符串中出现的次数!!!

 public int sum(String target,String str) {
    int count = 0;
   
    int i = 0;
    while(i < str.length()) {
        int i1 = str.indexOf(target,i);
        if(i1 != -1){
            count++;
            i = i1 + 1;
        } else {
            i++;
        }
    }
    return count;
}

public static void main(String[] args) {
    Ch05_Demo c = new Ch05_Demo();
    System.out.println(c.sum("b", "abcdefgabcdaaa"));
字符串的截取
     public static void main(String[] args) {
    // 字符串的截取
    String str = "abcdefghijklmn";
    /*
        如果传一个参数,从指定位置开始截取,直到字符串的末尾
        考虑一下?
        包不包括1位置的字符,包括起始位置的字符
        生成一个新的字符串,不会改变原有数据
     */
    String s = str.substring(1);
    // bc or b
    // 包含起始位置,不包含终止位置
    s = str.substring(1,2);
    System.out.println(s);
}
字符串的替换
      public class Ch01 {

public static void main(String[] args) {
    // 字符串的替换
    String str = "hello";
    System.out.println(str.replace('e', 'c'));
    shuchu
    System.out.println(str.replaceAll("l", "i"));
}

字符串和数组的转换

 public static void main(String[] args) {
    // 字符串的替换
       String str = "hello";
       System.out.println(str.replace('e', 'c'));
       System.out.println(str.replaceAll("l", "i"));
}
输出结果:hciio

int转换String:

    int i = 10;
    String s = i+"": //任何数据类型和字符串类型做加法,结果都是字符串,阿里规约中不允许 
    // 把int类型转成字符串(推荐)
   //方法一:
          String s = String.valueOf(i);

转成字节型数组:

    byte[] bytes = str.getBytes();
    for (byte b : bytes) {
        System.out.println(b);
    }

包装器

八种基本数据类型:
byte,short,int,long,float,double,chat,boolean
基本数据类型没有什么功能,不像类。
想要他们有功能就要把他们对应,八个类(把他们首字母大写)
Byte,Short,Integer,Long,Float,Double,Character,Boolean

总结

今天学习了一些关于字符串,与基本数据类型的知识,还算简单。目前主要的任务依旧是在老师昨天布置的任务上下功夫,提出问题:既然定义了private,为什么还要有set方法与get方法去改变这个属性的值?

程序员灯塔
转载请注明原文链接:2022-7-20-第八组-曹雨面向对象-字符串
喜欢 (0)