API、String类和StringBuilder类

本文介绍了Java中的API概念,重点讨论了String类和StringBuilder类的区别,包括String的不可变性质、构造方法、常用方法如equals和substring,以及StringBuilder的可变性、append和reverse方法。同时提到了内存管理在字符串操作中的影响。
摘要由CSDN通过智能技术生成

一.什么是API

API (Application Programming Interface) :应用程序编程接口

其实就是 JDK 中提供的各种功能的 Java类,这些类将底层的实现封装了起来,我们不需要关心这些类是如何实现的,只需要学习这些类如何使用即可,我们可以通过帮助文档来学习这些API如何使用。

通常我们可以借助jdk帮助文档来查询到我们所需的类。

比如,我们可以在搜索栏输入Math关键词来查询到Math类的作用,以及它包含的方法。

往下翻就能找到Math包含的方法,比如abs。

通过帮助文档,我们就可以轻松的找到需要的封装类,更便于我们进行java的学习。

二.String类

String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的对象(实例)。所以我们创建一个字符串,相当于创建了一个String类的对象。

1.字符串的构造方法及特性

常用的String类的构造方法有如下几种:

public String();

eg:

String s=new String();//创建一个空的字符串对象

public String(字符数组);

eg:

char[] c={'a','b','c'};

String s=new String(c);//创建了一个"abc"的字符串

public String("字符串");

eg:

String s=new String("abc");//同样创建了一个"abc"字符串

我们常用的直接赋值的方式相当于最后一种的简化版:String s="abcd";

值得注意的是,当我们直接选择用字符串给字符变量赋值和new一个对象赋值在内存上有一些区别。

通过new创建字符串对象时,不管内存(方法区中的字符串常量池)中有没有相同的字符串常量,系统都会自动在内存(堆空间)中新建一个对象指向字符串常量所在的地址。但如果采用直接赋值字符串的方式新建字符串,而字符串常量池已经存在相同的字符串时,系统就不会新建对象,而是直接指向字符串常量池中的字符串了。

字符串不可变,它们的值在创建后不能被更改。意思是,创建一个字符串后,该字符串就会在字符串常量池中进行维护,你=改变对象的值,其实是创建了一个新的字符串,而开始的字符串依旧存在。

2.String类常用的方法

public boolean equals(String s) 比较两个字符串内容是否相同、区分大小写

下面我们用了equals方法做了个判断字符串的小案例(登录信息的比对):

import java.util.Scanner;
public class lodingImitate {
    public static void main(String[] args) {
        String realName ="ying";//设置正确的用户名
        String realPassword="12345678";//设置正确的的登录密码
        String name;//定义name和password两个变量用于接收录入的姓名和登录密码
        String password;
        Scanner sc = new Scanner(System.in);//创建一个Scanner对象,用于录入信息
        for(int i=1;;i++){
            System.out.println("请输入正确的用户名:");
            name= sc.nextLine();//用name接收录入的姓名信息
            System.out.println("请输入正确的密码:");
            password= sc.nextLine();//接收登录密码
            if(realName.equalsIgnoreCase(name)&&realPassword.equals(password)){
                System.out.println("恭喜你登录成功!");//equals判断真实的姓名和密码是否和录入的相等
                break;
            }else{
                if(i==3){//设置循环次数,如果输入次数满足三则打破循环
                    System.out.println("登录失败,您今日的"+i+"次机会已用完,请明天再来");
                    break;
                }else {
                    System.out.println("很遗憾,您输入的密码或用户名不正确,请重新输入!");
                }
                }
        }
    }
}

上述案例我们使用了equals方法来比较字符串是否相等:realPassword.equals(password)

之所以不用“==”,是因为String是引用类型的数据,用“==”只能比较两个字符串的地址,而不能比较实际的内容。

同时我们也使用了另一个和equals相似的方法:equalsIgnoreCase(参数),这个方法同样是比较字符串是否相等,不同的是,equalsIgnoreCase不区分大小写。

public char charAt(int index):返回指定索引处的char值

public int length():返回此字符串的长度

我们同样用一个遍历字符串的案例来体现这两个方法:

import java.util.Scanner;
//遍历
public class StringErgodic {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);//创建Scanner对象来录入字符串
        System.out.println("请输入所需遍历的字符串:");
        String se=sc.nextLine();//用se来接收录入的字符串
        for (int i=0;i<se.length();i++){//通过length()方法来计算字符串的长度
          if(i==se.length()-1){//此处用了if来判断索引是否为最后一个,如果是,则在字符后不加逗号
              System.out.print(se.charAt(i));//通过charAt来返回索引i处的字符
          }
        else{
              System.out.print(se.charAt(i)+",");
          }
        }
    }
}

public char[] toCharArray( ):将当前字符串拆分为字符数组并返回

如果需要将字符串转成单个字符为单位的字符数组,我们可以使用toCharArray,例如当我们要统计字符串中有多少数字或字母时,可以将字符串转换为字符数组,再通过遍历来统计。

import java.util.Scanner;
public class ToCharArrayTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要统计的字符串:");
        String st=sc.nextLine();
        char[] ch=st.toCharArray();//通过字符串对象st调用toCharArray将字符串st转换成字符数组,再将数组传给ch数组
        int lowercase=0;
        int capital=0;
        int num=0;
        for(int i=0;i< ch.length;i++){//遍历
            if(ch[i]>='a'&&ch[i]<='z'){//由于字母、数字的ASCll码都是连续的,所以可以直接对字母进行判断
                lowercase++;
            }
            else if(ch[i]>='A'&&ch[i]<='Z'){
                capital++;
            }
            else if(ch[i]>='0'&&ch[i]<='9'){
                num++;
            }
        }
        System.out.println("小写字母的个数有:"+lowercase+"大写字母的个数有:"+capital+"数字的个数有:"+num);

    }
}

String类还有不少方法,例如:

​    public String substring(int beginIndex, int endIndex)  根据开始和结束索引进行截取,得到新的字符串(包含头,不包含尾)

​    public String substring(int beginIndex)  从传入的索引处截取,截取到末尾,得到新的字符串

​    public String replace(CharSequence target, CharSequence replacement)  使用新值,将字符串中的旧值替换,得到新的字符串

//屏蔽字符串和替换字符串
import java.util.Scanner;
//手机号屏蔽
//通过subString来截取字符串
public class TelShield {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要屏蔽的手机号(11位):");
        String tel=sc.nextLine();
      String telAfter=  tel.substring(0,3)+"****"+tel.substring(7,11);
        System.out.println("原号码" +tel);//substring截取的字符串会创建一个新的字符串对象,所以不会对原来的字符串进行更改
        System.out.println("截取后"+telAfter);
        System.out.println("=====以下是替换方法replace的应用====");
        System.out.println("请输入包含屏蔽词的话:");
        String mingan=sc.nextLine();
        String minAfter=mingan.replace("死","暴富");//replace来替换内容
        System.out.println("原:"+mingan);
        System.out.println("后:"+minAfter);
    }
}

    public String[] split(String regex)  根据传入的规则切割字符串,得到字符串数组

import com.bean.Student;//导入自建的学生类
import java.util.Scanner;
public class StringSplit {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入学生的姓名和年龄和性别,并用中文格式的’,‘将其分隔开: ");
        String infor = sc.nextLine();
        char c = infor.charAt(1);//charAt(index i);返回指定字符串索引的字符
        System.out.println(c);
        String[] split = infor.split(",");//通过“,”来对字符串进行分割,使其生成所需的字符串数组
       // System.out.println(split.length);
        String name = split[0];
        String agestr = split[1];
        int age = Integer.parseInt(agestr);//Integer.parseInt(String s);可以将字符串转为int型,和valueOf用法一样
        String gender = split[2];
        Student student = new Student(name, age, gender);
        student.show();
    }
}

三.StringBuilder类

上面说到String类是不可变的字符串类,每次修改字符串其实都是新建字符串对象,这样就会造成内存空间浪费,所以我们需要学习可变字符类。

StringBuilder 是一个可变的字符串类,我们可以把它看成是一个容器,这里的可变指的是 StringBuilder 对象中的内容是可变的。

StringBuilder类的构造方法和String相似:

public StringBuilder()创建一个空白可变字符串对象,不含有任何内容
public StringBuilder(String str)根据字符串的内容,来创建可变字符串对象
public class StringbuilderExer {
    public static void main(String[] args) {
        StringBuilder bui = new StringBuilder();//创建一个空白可变字符串对象,不含有任何内容
        StringBuilder builder = new StringBuilder("你好");//StringBuilder可变字符串
        System.out.println(builder);
       // System.out.println(builder.length());
        builder.append("手机号");//append(参数)可对原有的StringBuilder字符串进行手动拼接,结果为:你好手机号
        System.out.println(builder);
        StringBuilder sb=builder;
        System.out.println(sb == builder);//结果为true,因为地址一样
        System.out.println(builder.reverse());//reverse()反转字符串,结果为:号机手好你
    }
}

上述案例中我们还使用了StringBuilder类中的两个常用成员方法:

 public StringBuilder   append(任意类型)        添加数据,并返回对象本身 

 public StringBuilder   reverse()        返回相反的字符序列     

String类和StringBuilder可以相互转换,如下例所示:

public class StringBuider_String {
    public static void main(String[] args) {
        String str = new String("我愿成为一棵树");//创建一个String对象str,并将其赋值为"我愿成为一棵树"
        StringBuilder sb = new StringBuilder(str);//通过创建StringBuilder对象,将String对象str传入,实现String转换为StringBuilder
        System.out.println(str);
        System.out.println(sb);
        sb.append("一半在风里飞扬,一半在土里安详");//append对生成的StringBuilder对象sb进行拼接
        System.out.println(sb);
        String s = sb.toString();//通过toString可以将StringBUilder转化为String
        System.out.println(s);
    }
}

 

  • 15
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值