八、面向对象
1. 简介
1.定义类有哪些建议,有什么需要注意的?
类名首字母建议大写、英文、有意义,满足驼峰模式,不能用关键字,满足标志符规定;
一个代码文件中可以定义多个类,但是只能一个类是public修饰的,public修饰的类名必须是Java代码的文件名称。
2.成员变量的格式是什么样的,有什么特点?
成员变量的完整定义格式是:修饰符 数据类型 变量名称=初始化值;
一般无需指定初始化值。
2. 构造方法标准的JavaBean类
默认调用构造方法,对象创建就调用构造方法
创建完成类的私有属性之后,在类中可以快捷创建构造方法:有两种方法
// 快捷键构造方法
// 创建完成alt + insert 或者alt + Fn + insert
// 使用PTG插件完成
右击鼠标选中Ptg To JavaBean进行创建
3. 成员变量和局部变量
成员变量:类中方法外的变量
局部变量:方法中的变量
九、字符串
1. String概述
1.String是Java定义好的一个类。定义在java.lang包中,所以使用的时候不需要导包。
2.Java 程序中的所有字符串文字(例如"abcdefg"),都被实为此类的对象。
3.字符串不可变,它们的值在创建后不能被更改。
ps:如果想要修改可以将字符串转化为字符数组的形式,然后修改,最后再转化为字符串
2. 字符串的构造方法
2.1. 直接赋值
当使用双引号直接赋值时,系统会检查该字符串在串池中是否存在。不存在则创建新的,存在则复用
//1.使用直接赋值创建一个字符串对象
String s1 = "abc";
System.out.println("s1 = " + s1);
2.2. new空参构造
//2.使用new方法创建一个字符串对象
//空参构造:可以获取一个空白的字符串对象
String s2 = new String();
System.out.println("s2 = " + s2); // s2内容为空
2.3. new含参构造
//3.传递一个字符串,根据传递的字符串内容再创建一个新的字符串对象
String s3 = new String("abc");
System.out.println("s3 = " + s3);
2.4. 字符数组构造
//4.传递一个字符数组,根据字符数组的内容创建一个新的字符串对象
char[] chs = {'a', 'b', 'c', 'd'};
String s4 = new String(chs);
System.out.println("s4 = " + s4);
2.5. 字节数组构造
//5.创建一个字节数组,根据字节数组的内容转化为一个新的字符串对象
byte[] bytes = {97, 98, 99, 100};
String s5 = new String(bytes);
System.out.println("s5 = " + s5);
3. 字符串的比较
直接赋值内存再栈内存中,new出来的数据存贮在堆内存中
基本数据类型比较的是数据值
引用类型比较的是地址值
//1.创建两个字符串对象
String s1 = new String("abc");
String s2 = "abc";
//2.==号比较
//基本数据类型:数据值
//引用数据类型:地址值
System.out.println(s1 == s2);
//3.比较字符串对象中的内容是否相同,equalsIgnoreCase是忽略大小写比较内容
boolean result = s1.equals(s2);
System.out.println(result);
两种:
字符串.euqals(要比较的字符串) 返回值为true则完全一样
字符串.equalsIgnoreCase(要比较的字符串) 忽略字符串的大小写进行比较
ps:键盘录入的字符串内容是new出来的,需要用到equals方法进行判断
4. 字符串截取
使用 字符串名.substring(起始, 结束) 进行截取
public class StringDemo8 {
public static void main(String[] args) {
//1.生成一个手机号码
String phoneNumber = "156320*****";
// 2.获取手机号码的几位
// 包头不包尾,从0截到2
String s1 = phoneNumber.substring(0, 3);
// 从7开始截取到末尾
String s2 = phoneNumber.substring(7);
// 屏蔽手机号码,进行拼接
String s3 = s1 + "****" + s2;
System.out.println(s3);
}
}
获取身份证年月日以及性别
public class StringDemo9 {
public static void main(String[] args) {
// 1.定义一个字符串记录身份证号码
String id = "130***20040910**70";
// 2.获取出生年月日
String year = id.substring(6, 10);
String month = id.substring(10, 12);
String day = id.substring(12, 14);
System.out.println("year:" + year);
System.out.println("month:" + month);
System.out.println("day:" + day);
// 3.获取性别,数字为字符型的,需要转换
char sexNum = id.charAt(16);
// 利用ASCII标进行转换
// '0' --> 48
// '1' --> 49
// 这样就得到了数字型的7
int num = sexNum - 48;
if (num % 2 == 1) {
System.out.println("sex:男");
}else System.out.println("sex:女");
}
}
5. 字符串替换
String 变量名接收 = 字符串名.replace(改前内容, 改后内容)
public class StringDemo10 {
public static void main(String[] args) {
// 获取
String str1 = "你好,世界!";
// 修改赋值
String str2 = str1.replace("你好", "Hello");
// 输出
System.out.println(str2);
}
}
6. StringBuilder
6.1. 基础方法
构造方法:
常用使用方法:
package StringBuilder;
import java.util.Scanner;
public class StringBuilderDemo2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.nextLine();
// 创建StringBuilder对象
StringBuilder s1 = new StringBuilder(str);
// 将StringBuilder对象反转再 转化为字符串对象
String str2 = s1.reverse().toString();
// 判断是否对称
if (str.equals(str2)) System.out.println("对称字符串:" + str);
else System.out.println("不对称字符串:" + str);
}
}
package StringBuilder;
import java.util.Scanner;
public class StringBuilderDemo2_ {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个字符串:");
String str = sc.nextLine();
// 链式创建逆序的字符串
String s1 = new StringBuilder(str).reverse().toString();
if (str.equals(s1)) System.out.println("对称字符串:" + str);
else System.out.println("不对称字符串:" + str);
}
}
6.2. 底层逻辑原理
StringBuilder扩容:
StringBuilder会自动创建一个长度为16的字节数组,如果添加字符串长度小于16则直接存入,如果大于16则扩容为原来的2倍再加2,即为16*2+2 = 34,如果长度还是不够则继续扩容,继续扩容的话,是多大就是多大。
对象名.capacity() 获取容量 对象名.length() 获取已经占用的长度
7. StringJoiner
会自动引入 java.util.StringJoiner 类
构造方法:
成员方法:
package StringJoiner;
import java.util.StringJoiner;
public class StringJoinerDemo1 {
public static void main(String[] args) {
// 1.创建一个对象,并执行中间的建个符号
StringJoiner sj = new StringJoiner(", ", "[", "]");
// 2.创建一个数组
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
// 3.拼接
for (int i = 0; i < arr.length; i++) {
sj.add(String.valueOf(arr[i]));
}
System.out.println(sj.toString());
}
}
总结:
1. String
表示字符串的类,定义了很多操作字符串的方法。
2. StringBuilder
一个可变的操作字符串的容器,可以高效的拼接字符串,还可以将容器里面的内容反转。
3. Stringjoiner
JDK8出现的一个可变的操作字符串的容器,可以高效,方便的拼接字符串。
在拼接时,可以指定间隔符号,开始符号,结束符号。
8. 字符串的底层逻辑
String相加为什么慢?
字符串相加拼接时需要创建StringBuilder对象并拼接,然后再调用toString方法转变为字符串对象,经历的步骤多,因此慢。实际结果是新new出的一个字符串,记录了字符串的地址。
如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。
如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。
字符串逻辑总结: