文章目录
一、String类
1. String特点
- 不需要导包
- 程序当中所有的双引号字符串,都是String类的对象(哪怕没new)
JAVA中字符串特点:
- 字符串的内容永不可变,是常量!【重点】
- 正是因为字符串不可改变,所以字符串是可以共享使用的。
- 字符串效果上相当于char[] 字符数组, 但是底层原理是byte[]字节数组。
2. 创建方法
创建方法,常见的有3 + 1种。三种构造方法,一种直接创建。
- 三种构造方法:
public String(); // 创建一个空白字符串 ""
public String(char[] array); // 根据字符数组的内容,来创建字符串
public String(byte[] array); // 根据字节数组的内容,来创建字符串
- 一种直接创建:
String str = "";
3. 字符串常量池
我们先拿三种方式创建四个字符串,看是否相等。
对于基本类型 来说,
==
是进行数值的比较。对于引用类型 来说,==
是进行地址值 的比较。
上面说明了:1和2的地址是一样的,和3和4的地址
3.1 当我操作字符串时,我到底在操作什么
- 运行时,main方法加入方法区,加载入栈。字符串常量池在堆中。
- 栈中直接创建了一个
变量
str1,保存字符串对象
的地址值。堆中字符串对象
,保存一个字节数组的地址值。(注: 直接创建才会进常量池)
- 栈中创建一个新
变量
str2。先去常量池中找,找到了,就直接指向它。
- 栈中创建一个新
数组变量
array3,数组是在堆中的,于是在堆中创建一个char[]对象
。栈中创建一个新变量
str3,因为new了,所以会在堆中创建一个String对象
。同时把char[]对象
转化的byte[]对象
的地址赋给String对象
。
- 利用
byte[]对象
创建字符串比利用char[]对象
创建字符串少了转化的步骤。这里不演示了,很好理解。
4. String常用方法
4.1 内容比较
4.1.1 equals 比较内容
equal
中文名等于的意思,比较内容是否相等。
任何对象都能用object进行接收。只有当传入的对象是String,并且内容相等时,才会返回true。
注意事项:
equals
具有对称性,a.equals(b)
与b.equals(a)
结果一样。- 如果比较双方一个常量一个变量,推荐把常量写在前
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 & …>。我们昨天使用的是循环加判断的方法,今天换一种方法。
- 把数组转化为String
- 替换
5.2 Test2:对输入类型的判断
用户输入一个字符串,统计各种类型的数目。
-
编写main()函数
-
编写统计函数
-
结果
二、static静态
一个类创建的对象,可能会有公用的属性,那么这个属性就没必要也不应该存在对象中,而应该直接存在类中。
一旦一个成员变量使用了static
关键字,那么这个变量不再属于对象自己,而是属于所在的类。多个对象共享同一份数据。
1. 基础使用
- 写一个标准学生类,班级教室前使用
static
关键字
- 只给大雄输入班级教室。静香的教室也被打印了出来
2. 典型用法:计数器
我们让这个学生类中,学生的ID自动生成,使用计数器生成。
- 下面红色是计数器代码
- 打印结果
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(数组); // 按照默认升序,对数组元素排序。没有返回值,直接改变原数组。
- 如果是数值,按从小到大排序
- 如果是字符串,按字母升序
- 如果是其它字,按码值
- 如果是自定义类型,那么这个自定义的类需要有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; // π