Java从入门到大神(二)| 起飞~起飞~起飞~

八、面向对象

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出的一个字符串,记录了字符串的地址。

如果没有变量参与,都是字符串直接相加,编译之后就是拼接之后的结果,会复用串池中的字符串。

如果有变量参与,每一行拼接的代码,都会在内存中创建新的字符串,浪费内存。

字符串逻辑总结:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值