Java语言进阶 #常用API(一) #Day8 #String #Arrays #Math #static

一、String类

1. String特点

  • 不需要导包
    在这里插入图片描述

在这里插入图片描述

  • 程序当中所有的双引号字符串,都是String类的对象(哪怕没new)

JAVA中字符串特点:

  1. 字符串的内容永不可变,是常量!【重点】
  2. 正是因为字符串不可改变,所以字符串是可以共享使用的。
  3. 字符串效果上相当于char[] 字符数组, 但是底层原理是byte[]字节数组。

2. 创建方法

创建方法,常见的有3 + 1种。三种构造方法,一种直接创建。

  • 三种构造方法:
public String();  // 创建一个空白字符串 ""
public String(char[] array);  // 根据字符数组的内容,来创建字符串
public String(byte[] array);  // 根据字节数组的内容,来创建字符串
  • 一种直接创建:
String str = "";

在这里插入图片描述

3. 字符串常量池

我们先拿三种方式创建四个字符串,看是否相等。

对于基本类型 来说,==是进行数值的比较。对于引用类型 来说,==是进行地址值 的比较。
在这里插入图片描述
上面说明了:1和2的地址是一样的,和3和4的地址

3.1 当我操作字符串时,我到底在操作什么

  1. 运行时,main方法加入方法区,加载入栈。字符串常量池在堆中。
    在这里插入图片描述
  2. 栈中直接创建了一个变量str1,保存字符串对象的地址值。堆中字符串对象,保存一个字节数组的地址值。(注: 直接创建才会进常量池
    在这里插入图片描述
  3. 栈中创建一个新变量str2。先去常量池中找,找到了,就直接指向它。
    在这里插入图片描述
  4. 栈中创建一个新数组变量array3,数组是在堆中的,于是在堆中创建一个char[]对象。栈中创建一个新变量str3,因为new了,所以会在堆中创建一个String对象。同时把char[]对象转化的byte[]对象的地址赋给String对象
    在这里插入图片描述
  5. 利用byte[]对象创建字符串比利用char[]对象创建字符串少了转化的步骤。这里不演示了,很好理解。

4. String常用方法

4.1 内容比较

4.1.1 equals 比较内容

equal中文名等于的意思,比较内容是否相等。
在这里插入图片描述

任何对象都能用object进行接收。只有当传入的对象是String,并且内容相等时,才会返回true。

在这里插入图片描述

注意事项:

  1. equals具有对称性,a.equals(b)b.equals(a)结果一样。
  2. 如果比较双方一个常量一个变量,推荐把常量写在前
    在这里插入图片描述

4.1.2 equalsIgnoreCase 忽略大小写比较内容

equalsIgnoreCase也是比较内容,但是是忽略大小写地比较。
在这里插入图片描述

4.2 获取 & 拼接

4.2.1 length 获取字符串长度

public int length();

4.2.2 concot 拼接字符串

public String concot(String str);

返回拼接后的新的 字符串。(字符串是常量,只要改变了,一定是产生了新的)

4.2.3 charAt 获取指定索引位置的单个字符

public char charAt(int index);

4.2.4 indexOf 查找子串在母串中出现的位置

public int indexOf(String str);

如果未找到,返回-1

示例

加粗样式

4.3 substring 截取

substring的意思是子链(子字符串)的意思

public String substring(int index);  // 截取从参数位置到字符串尾,返回新字符串
public String substring(int begin, int end);  // 截取范围内(begin, end),返回新字符串

在这里插入图片描述

4.4 转换

4.4.1 toCharArray 字符串拆分成字符数组

public char[] toCharArray();

4.4.2 getBytes 字符串拆分成字节数组

public byte[] getBytes();

4.4.3 replace 母串替换子串

查找替换的功能

public String replace(CharSequence oldString, CharSequence newString);
  • CharSequence: 是一个接口,表示char值的一个可读序列。现阶段明白String满足这个条件即可。
  • 如果没有找到该子串,不会发生替换,也不会报错。

示例

在这里插入图片描述

4.5 split分割字符串

public String[] split(String regex);  // 按照参数规则,将字符串分割成若干部分
  • 参数规则: Regular expression正则表达式

在这里插入图片描述

5. 练习

5.1 Test1:把数组拼接,并返回指定格式

  • 把数组拼接,并返回指定格式:<元素1 & 元素2 & …>。我们昨天使用的是循环加判断的方法,今天换一种方法。
  1. 把数组转化为String
  2. 替换

在这里插入图片描述

5.2 Test2:对输入类型的判断

用户输入一个字符串,统计各种类型的数目。

  1. 编写main()函数
    在这里插入图片描述

  2. 编写统计函数
    在这里插入图片描述

  3. 结果
    在这里插入图片描述

二、static静态

一个类创建的对象,可能会有公用的属性,那么这个属性就没必要也不应该存在对象中,而应该直接存在类中。
一旦一个成员变量使用了static关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象共享同一份数据。

1. 基础使用

  1. 写一个标准学生类,班级教室前使用static关键字
    在这里插入图片描述
  2. 只给大雄输入班级教室。静香的教室也被打印了出来
    在这里插入图片描述

2. 典型用法:计数器

我们让这个学生类中,学生的ID自动生成,使用计数器生成。

  1. 下面红色是计数器代码
    在这里插入图片描述
  2. 打印结果
    在这里插入图片描述

3. static修饰成员方法

  • static修饰了成员方法,就会使其成为静态方法,它不再属于对象,而是属于类。
  • 如果没有static关键字,那么必须首先创建对象,然后通过对象才能使用它。
  • 静态方法,可以通过类名.静态方法名直接调用。(也可以通过对象调用,但是不推荐。通过对象名.静态方法名调用,也会在编译后被javac翻译成对象名.静态方法名
  • 对于本类当中的 静态方法可以省略 类名称。

静态变量 & 静态方法() 都最好通过类名称来调用

4. 注意事项

静态不能访问非静态

- -
非静态方法 访问 非静态内容 不 报错
非静态方法 访问 静态内容 不 报错
静态方法 访问 非静态内容 报错
静态方法 访问 静态内容 不 报错

原因: 在内存中是 【先】 有的静态,【后】 有的非静态。


静态方法不能出现this关键字

5. 静态方法内存图

在这里插入图片描述
静态方法全程和对象没有关系 ,当通过类调用静态方法时(如)通过对象名调用,会被翻译为类名调用),会先去方法区找,找到了static关键字就去方法区内的静态区找。

6. 静态代码块

特点:第一次 用到本类时,静态代码块执行唯一的一次 。(可以把重载的创建对象方法理解为对象的初始化,静态代码块理解为类的初始化

  • 代码块: 用大括号包住的部分就叫代码块
  • 由于静态的总是先于非静态的,所以 静态代码块会先于构造方法执行

三、Arrays工具类

在这里插入图片描述
Arrays是一个与数组相关的工具类,提供了大量的静态方法(喜大普奔,不用new直接类名.调用),用来实现数组的常见操作。

还记得我们之前使用的直接打印数组的方法嘛:Arrays.toString(array)

1. 数组按默认格式转变为字符串

public static String toString(数组);  // 按默认形式显示[元素1, 元素2...]

2. 对数组元素进行排序

public static void sort(数组);  // 按照默认升序,对数组元素排序。没有返回值,直接改变原数组。
  1. 如果是数值,按从小到大排序
  2. 如果是字符串,按字母升序
  3. 如果是其它字,按码值
  4. 如果是自定义类型,那么这个自定义的类需要有Comparable或者Comparator接口的支出。(日后再解)

Test3:降序打印字符串

  • 从最后一个元素循环,输入array.forr回车即可自动生成

在这里插入图片描述

四、Math计算类

Math是数学相关的工具类,提供大量静态方法,完成数学运算。

public static double abs(double num);  // 获取绝对值
public static double ceil(double num);  // 向上取整
public static double floor(double num);  // 向下取整
public static long round(double num);  // 四舍五入(不带小数点)
Math.PI;  // π
发布了50 篇原创文章 · 获赞 32 · 访问量 6506

猜你喜欢

转载自blog.csdn.net/weixin_44925501/article/details/105697892