Java基础语法

每一个追梦的人,付出的努力都不会白费,诸君共勉。

文章目录

目录

文章目录

前言

一、Java的运行机制

二、Java的基础知识

1.标识符与关键字

2.数据类型

3、数据类型的转换

4、常量和变量的定义

1、常量

2、变量

5、运算符

1、算数运算符

2、赋值运算符

3、关系运算符 

4、逻辑运算符

5、自增、自减运算符​​​​​​​

三、尝试调用简单的api(application program interface)

1、Scanner

2、Random

四、三种基本条件结构(if、switch、while/for)

1、if选择结构

2、switch选择结构

1、break关键字

2、default关键字

3、continue关键字

4、switch的用法

补充:

3、循环结构

1、while循环

2、do while循环

3、for循环(最常用)

4、for的增强用法

五、方法的定义和调用

1、方法的定义

2、方法的调用

3、方法的重载

六、数组(引用数据类型)

1、一维数组

1、一维数组的定义

2、一维数组的特点

3、创建数组:动态/静态

4、数组的打印和输出

2、二维数组

1、二维数组的静态初始化

2、二维数组的动态初始化

七、面向对象

1、面向对象的定义

暂且跳过,正在总结。绝对不是博主懒,而是在思考怎么写好。

八、字符串

1、String概述

2、创建String的两种方式

(1)直接赋值法

(2)new关键字法 

(3)联系与区别

(4)equals关键字

3、字符串基础练习

用户登陆判断

字符串的遍历

统计字符次数

字符串的拼接

字符串反转

字符串敏感词屏蔽

手机号中间四位屏蔽

4、StringBuilder

(1)概述

(2)StringBuilder的一些操作

(3)字符串的拼接与反转

(4)判断字符串是否为对陈字符串

5、Stringjoiner

(1)概述

(2)构造方法

(3)关键字

6、String的底层原理和注意事项

(1)字符串存储内存原理

(2)==号比较的是什么

(3)字符串拼接的底层原理

(4)StringBuilder提高效率原理

(5)StringBuilder源码分析

九、集合

总结


前言

Java是一门热门的编程语言,在诸多领域Java都有所涉及。


举个栗子:

public class Hello{
    public static void main(String[] args){
        System.out.println("Hello world!");//输出Hello World
    }
}

此处罗列出一些idea常用快捷键操作:

psvm->public static void main(){}

sout->System.out.println();

arr.fori=for(i=0;i<arr.length;i++){}

option+command+m->抽取方法

shift+f6->全局变量修改

option command t->把一段代码改为循环

control+fn+回车->构造方法


提示:以下是本篇文章正文内容,下面内容可能有误仅供参考。

一、Java的运行机制

Java将源文件(.java)编译成为字节码(.class)文件,将字节码文件加载在虚拟机(Jvm)中运行,因此Java有很强的跨平台性,常应用于互联网相关服务。

jdk=jvm(虚拟机)+核心类库+开发工具


二、Java的基础知识

1.标识符与关键字

标识符应以英文字母或者下划线组成,不可以与关键字重复定义。所谓的关键字是指系统本身命名使用的名字。例如:public(公开的)、class(类)。

2.数据类型

Java语言中并不像c语言有指针指向地址,它使用一种名为引用数据类型的方法代替了指针的效果。Java的数据类型分为两大类,分别是基本数据类型和引用数据类型。

/*
基本数据类型:
数值类型:byte(字节)、short、int、long。
浮点类型:float、double
boolean(布尔)类型:true、false
注:通常情况下,我们定义使用int和double


引用数据类型:
类
数组
接口
*/

//相信大家看到这块内容应该知道Java怎么用注释了吧(笑)

3、数据类型的转换

Java不同类型的数据需要转换成同一类型才可以计算,在实际开发过程中,对数据类型进行转换是我们时常做的一件事情。

1、自动转换:

代码总是自动从数据范围低的转向数据范围高的。

低--------------------------------->高

byte,short,char,int,long,float,double

public class 计算圆的面积 {
    public static void main(String[] args) {
        getArea(1.5);
    }
//***********计算一个圆的面积,半径1.5自动转换成了double类型************

    public static void getArea(double radius) {
        double result=radius*radius*3.14;
        System.out.println(result);
    }
}

2、强制转换

在一些时候为了达到我们的目的,我们需要对代码进行强制数据类型转换,具体操作方法如下:

格式:(范围小的类型)+范围小的变量名=(范围小的类型)+原本范围大的数据。

class Untitled {
	public static void main(String[] args) {
        //a从double被强制转换成为int(整数)类型,并赋值给b。
		double a=36.12213;
		int b=(int) a ;
		System.out.println(b);
	}
}

注意:

(1)转换时可能会出现数据丢失的情况。

(2)布尔类型不可以进行任何的数据转换。

(3)在计算时整数会转换为int,浮点会转换成double。

4、常量和变量的定义

1、常量

定义:在程序运行期间不可修改的量,其存放数据的空间不会随着函数结束调用而释放。

格式: final type varName =value; 

例:final double PI=3.14

常量的命名:全用大写字母,单词之间下滑线隔开。

为了更好的区分和表述,一般将1、23'a'b’truefalse "helloWorld等称为字符常量,而使用final修饰的PI等称为符号常量。

2、变量

1、变量的定义

随时都可以发生变化的量,是最基本的存储单元,要素包括变量名,变量类型和作用域。

public class 三数求和 {
    public static void main(String[] args) {
        System.out.println(getSum(1,2,3));
    }
    //相信各位都可以看得懂(👀)求三数之和
    public static int getSum(int n1,int n2,int n3){
        int result=n1+n2+n3;
        return result;
    }
}

2、变量的作用域

变量分为成员变量和局部变量。

成员变量:写在方法的外面类的里面,不需要手动赋予初始值(每个数据类型有自己默认的数据类型)。

局部变量:写在方法里面的变量(包括main方法),必须进行声明和初始化,随着方法被调用创建,随着方法结束调用消失。

5、运算符

1、算数运算符

+、-、*、/、%(取余数)

public class 比较长方形面积 {
    public static void main(String[] args) {
        int area1=getArea(1,2);
        int area2=getArea(4,2);
        compare(area1,area2);
    }
    //比较两个长方形的面积
    public static int getArea(int length,int width){
        int area=length*width;
        return area;
    }
    public static void compare(int a1,int a2){
        if(a1>a2){
            System.out.println(a1);
        }else{
            System.out.println(a2);
        }
    }
}

2、赋值运算符

注:只有变量才可以进行运算

(1)a=b-------->把b的值赋予给a

(2)+=--------->a=a+b------->把a+b的值赋予给a

(3)-=---------->a=a-b------->把a-b的值赋予给a

(4)/=---------->a=a/b------->把a/b的值赋予给a

(5)%=-------->a=a%b------>把a%b的值赋予给a

(6)*=--------->a=a*b------->把a*b的值赋予给a

3、关系运算符 

<(小于)、>(大于)、>=(大于等于)、<=(小于等于)、==(相等)、!=(不想等)

关系运算符返回值为boolean类型,且不可以多次连续的判断,如想要多次连续的判断需要使用到逻辑运算符。

4、逻辑运算符

&&(按位于)、||(按位或)、!(非)

(表达式1&&表达式2):只有表达式1和2都为真的时候结果才为真,由此可见如果表达式1为假那么结果直接为假,计算机不再进行表达式2的判断。

(表达式1||表达式2):只有表达式1和2都为假的时候结果才为假,由此可见如果表达式1为真那么结果直接为真,计算机不再进行表达式2的判断。

(!表达式1):与表达式1的boolean值取反。

public class 抢红包 {
    public static void main(String[] args) {
        //随机抢红包
        int[] arr = {2, 588, 888, 8888, 66666};
        int[] newarr = new int[arr.length];
        Random r = new Random();
        for (int i = 0; i < 5; ) {
            int RandomInedx = r.nextInt(arr.length);
            int prize = arr[RandomInedx];
            boolean flag=contains(newarr,prize);
            if(!flag){
                newarr[i]=prize;
                i++;
            }
        }
        for (int i = 0; i < newarr.length; i++) {
            System.out.println(newarr[i]);
        }
    }

    public static boolean contains(int[] arr, int prize) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == prize) {
                return true;//抽过被标记为true
            }
        }
        return false;
    }
}

5、自增、自减运算符

++、--

class Untitled {
	public static void main(String[] args) {
	int a=10;
 //等于a-1
    a--;
 //等于a+1
    a++
 //因为加一减一输出的a还等于10
 //注:sout是System.out.println()的缩写,为了代码整洁度(懒)后文会采用此种描述方法
    sout(a)
	}
}


三、尝试调用简单的api(application program interface)

1、Scanner

Scanner让用户方便对变量赋值

用法:

(1)导入Scanner类(注意大小写不可以随便改变) import Java.until.*;

(2)创建Scanner对象 Scanner sc=new Scanner(System.in);

   (3)创建变量int a=sc.nextInt();注:此处的nextInt和前面的定义的变量有关,如果数据类型改变,所需要调用的方法也不同。

next()输入字符串

nextInt()输入整数

nextDouble()输入小数

import Java.until.*

class Untitled {
	public static void main(String[] args) {
	    Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();//输入a的数值
	}
}

2、Random

Random让用户方便的产生一些随机数

用法

(1)导入Random类(注意大小写不可以随便改变) import java.util.Random;

(2)创建Random对象 Random r=new Random();

   (3)创建变量int a=r.nextInt(n);注:此处的n表示生成一个从0-n-1的随机数

例:int a=r.nextInt(10);生成一个0到9 的随机数。

如果想要生成一个从1到10的随机数可以采取int a=r.nextInt(10)+1;

import java.util.Random;
import java.util.Scanner;

//模拟双色球中奖情况
//游戏规则:有6个红色球和一个蓝色球。红球数字不会重复,蓝球数字可以和红球重复
//输入七个数字,和中奖号重复的数字越多获得的奖项越靠前,且不计顺序
public class 模拟双色球 {
    public static void main(String[] args) {
        /*
        1、生成中奖号码
         */
        int[]arr=create();
        System.out.println("******");
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
        System.out.println("******");
        int[] use=user();
        int redCount=0;
        int blueCount=0;
        int redNumber=redCnt(arr, use, redCount);
        int blueNumber=blueCnt(arr[arr.length - 1], use[use.length - 1], blueCount);
        System.out.println(redNumber);
        System.out.println(blueNumber);
        if (redNumber==6&&blueNumber==1){
            System.out.println("1000w");
        }else if(redNumber==6&&blueNumber==0){
            System.out.println("500w");
        }else if(redNumber==5&&blueNumber==1){
            System.out.println("3000");
        }else if((redNumber==5&&blueNumber==0)||(redNumber==4&&blueNumber==1)){
            System.out.println("200");
        }else if((redNumber==4&&blueNumber==0)||(redNumber==3&&blueNumber==1)){
            System.out.println("10");
        }else if((redNumber==2&&blueNumber==1)||(redNumber==1&&blueNumber==1)){
            System.out.println("5");
        }else {
            System.out.println("谢谢参与!!!");
        }
    }

    private static int blueCnt(int i, int blueNumber1, int blueCount) {
        int blueNumber= blueNumber1;
        if(blueNumber== i){
            blueCount++;
        }
        return blueCount;
    }

    private static int redCnt(int[] arr, int[] use, int redCount) {
        for (int i = 0; i < use.length-1; i++) {
            int redNumber= use[i];
            for (int i1 = 0; i1 < arr.length-1; i1++) {
                if(redNumber==arr[i1]){
                    redCount++;
                    break;
                }
            }
        }
        return redCount;
    }

    public static int[] user() {
        int[] arr = new int[7];
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < 6; ) {
            System.out.println("输入第" + (i + 1) + "个号码");
            int redNumber = sc.nextInt();
            if (redNumber >= 1 && redNumber <= 33) {
                boolean flag = contains(arr, redNumber);
                if (!flag) {
                    arr[i] = redNumber;
                    i++;
                } else {
                    System.out.println(false);
                }
            }
        }
            System.out.println("输入蓝球号码");
            while (true) {
                int blueNumber = sc.nextInt();
                if (blueNumber >= 1 && blueNumber <= 16) {
                    arr[arr.length - 1] = blueNumber;
                    break;
                } else {
                    System.out.println(false);
                }
            }
        return arr;
    }

    public static int[] create() {
        /*
        1、创建数组用于添加中奖号码
        2、6个红球 1个蓝球 数组长度:7
         */
        int[] arr = new int[7];
        //红球号码不可以重复,蓝球可以和红球重复
        Random r = new Random();
        for (int i = 0; i < 6;) {
            int redNumber = r.nextInt(33) + 1;
            boolean flag=contains(arr,redNumber);//判断重复
            if(!flag){
                arr[i]=redNumber;
                i++;
            }
        }
        int blueNumber=r.nextInt(16)+1;
        arr[arr.length-1]=blueNumber;
        return arr;
    }

    public static boolean contains(int[] arr, int number) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == number) {
                return true;
            }
        }
        return false;
    }
}

四、三种基本条件结构(if、switch、while/for)

1、if选择结构

(1)表达式中判断为true就执行大括号内的语句,false就跳过大括号内的语句,继续执行接下来的代码。

if(表达式){

        语句;

}     

(2)表达式1为true执行语句1,结束条件判断;表达式1为假继续判断表达式2,程序同上。

if(表达式1){

语句1;

}else if(表达式2){

语句2;

}

(3)表达式1为true执行语句1,结束条件判断;表达式1为假继续判断表达式2,程序同上。如果所有的判断都是假,那么就执行else中的语句。

if(表达式1){

语句1;

}else if(表达式2){

语句2;

}......else{

语句n;

}

import java.util.Scanner;

public class 卖飞机票 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入机票的原价");
        int ticket=sc.nextInt();
        System.out.println("当前的月份");
        int month=sc.nextInt();
        System.out.println("输入仓位0头等1经济");
        int seat=sc.nextInt();
        int tag=0;
        if(month>5&&month<=10){
            if(seat==0){
                ticket=(int)(ticket*0.9);
            }else if(seat==1){
                ticket=(int)(ticket*0.85);
            }else{
                System.out.println(false);
                tag=1;
            }
        }else if((month>=1&&month<=4)||(month>=11&&month<=12)){
            if(seat==0){
                ticket=(int)(ticket*0.7);
            }else if(seat==1){
                ticket=(int)(ticket*0.65);
            }else{
                System.out.println(false);
                tag=1;
            }
        }else {
            System.out.println(false);
            tag=1;
        }
        if(tag==0)
        System.out.println("您的机票价格为"+ticket);
    }
}

2、switch选择结构

1、break关键字

break在循环或者选择结构运行中可以进行中断。

2、default关键字

case匹配失败后执行,类似于else。

3、continue关键字

continue可以跳过本次循环,进入下一次循环中。

4、switch的用法

基础用法:

switch(表达式){
case value1 : 
    语句块 1;
case value2 : 
    语句块 2;
case value3 : 
    语句块 3;
    …
case valueN : 
    语句块 N; 
 
}

例:

switch(n){
case 1 : 
    System.out.println("恭喜你!成绩不错!");
    System.out.println("90 ~ 100");
break;
case 2 : 
    System.out.println("80 ~ 89");
break;
case 3 : 
    System.out.println("70 ~ 79");
break;
case 4 : 
    System.out.println("60 ~ 69");
break;
case 5 : 
    System.out.println("0 ~ 59");
    System.out.println("不及格,要加油咯");
break;
default :
    System.out.println("输入错误");
break;
}

补充:

博主刚刚发现了switch的新用法。

 public static String luoMaGet(int index){
        /*String[] str={"","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        return str[index];
         */
        //通过->的方式,可以进行选择数值而非语句,在jdk12以后可以直接将switch语句的结果赋值给变量,此种写法相当于一条赋值语句,需要在结尾加分号。
        String str=switch (index){
            case '1'->"";
            case '2'->"";
            default -> "";
        };
        return str;
    }

3、循环结构

1、while循环

用法:

while(条件判断){

循环语句;

步进语句;   如:i++;

}

2、do while循环

在执行的时候先执行一遍再进行判断,因而即使不满足条件也至少需要运行一次

用法:

do{

循环体;

步进语句;

}while(条件判断表达式);

3、for循环(最常用)

确定循环次数时使用。

用法:

for(i=0;i<n;i++){

语句;

}

public class 找质数 {
    public static void main(String[] args) {
        int count = 0;
        for (int i = 101; i <= 200; i++) {
            boolean flag = true;
            for (int j = 2; j < i; j++) {
                if (i % j == 0) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                System.out.println(i + " " + "yes");
                count++;
            } else {
                System.out.println(i + " " + "no");
            }
        }
        System.out.println(count);
    }
}

4、for的增强用法

面对实际开发时,我们有时候会遇到一种情况:我们需要进行条件判断,满足条件才让其++。传统的fori无法满足这种需求,因此我们需要小小的改变一下思路。

for(i=0;i<n){

判断{

语句;

i++;

}

}


五、方法的定义和调用

1、方法的定义

修饰符 返回值类型(没有返回值为void)方法名(参数类型 参数名){

方法体;

return 返回值;

}

具体解释:

(1)修饰符可以有public static final等。

(2)返回值void为空,不需要return。

(3)参数类型包括形参和实参 实参表示实际传来的数据 形参表示方法接受外界的数据

2、方法的调用

int max=getMax(arr[]); (从数组中获得最大值)

import java.util.Scanner;

public class 评委打分 {
    public static void main(String[] args) {
        int[] scoreArr = getScores();
        int max=getMax(scoreArr);
        int min=getMin(scoreArr);
        int sum=getSum(scoreArr);
        int avg=(sum-max-min)/(scoreArr.length-2);
        System.out.println(avg);
    }

    public static int[] getScores() {
        int[] scores = new int[6];
        Scanner sc = new Scanner(System.in);
        for (int i = 0; i < scores.length; ) {
            System.out.println("请输入评委的打分");
            int score = sc.nextInt();
            if (score >= 0 && score <= 100) {
                scores[i] = score;
                i++;//为了防止数组被空军
            } else {
                System.out.println("data illegal");
            }
        }
        return scores;
    }

    public static int getMax(int[] scoreArr) {
        int max=scoreArr[0];
        for (int i = 1; i < scoreArr.length; i++) {
           if(scoreArr[i]>max){
               max=scoreArr[i];
           }
        }
        return max;
    }
    public static int getMin(int[] scoreArr) {
        int min =scoreArr[0];
        for (int i = 1; i < scoreArr.length; i++) {
            if(scoreArr[i]< min){
                min =scoreArr[i];
            }
        }
        return min;
    }
    public static int getSum(int[] scoreArr){
        int sum=0;
        for (int i = 0; i < scoreArr.length; i++) {
            sum+=scoreArr[i];
        }
        return sum;
    }
}

3、方法的重载

Java为了方便开发者使用,引入了重载的概念。简单来说就是方法名相同,但是方法内包含的参数类型,或者参数类型的先后顺序不同,和返回值无关

方法重载的规则:

(1)方法名必须相同。

(2)参数名必须不同(个数不同,数据类型不同,排列顺序不同)


六、数组(引用数据类型)

1、一维数组

1、一维数组的定义

数组是一个存储数据的容器,可以用来存储多个数据,就像是一个酒店,其中数据就是住在一个个房间里的客人,数组的索引对应的则是酒店房间的门牌号。

2、一维数组的特点

(1)数组是一种引用类型数据,调用数组时在堆区开辟一片空间,在对数组修改时我们需要先通过地址找到在堆区的数组再进行修改。

思考:如果把一个数组直接==给一个变量得到的是什么? 答案:一个地址。

思考:如果通过一个变量改变了数组,用另一个存储相同地址的变量去查看数组是否会发生变化? 答案:会。

(2)数组中存储的多个数据的数据类型相同。

3、创建数组:动态/静态

(1)静态创建方法:

格式:数据类型[] 数组名称=new 数据类型[]{数据1,数据2,数据3......}

例:int[] arr=new int[]{1,2,3,4,5};

简写可以表示为 int[] arr={1,2,3,4,5};

(2)动态创建方法:

格式:数据类型[] 数组名称=new 数据类型[]{数组长度};

例:int[] arr=new int[]{6};

4、数组的打印和输出

借用fori按照数组下标依次打印和赋值

public class 数组元素的复制 {
    public static void main(String[] args) {
        int arr[]={1,2,3,4,5,6};
        int arr1[]=new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            arr1[i]=arr[i];
        }
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
        }

}

2、二维数组

二维数组相当于在数组里又嵌套了一个数组,在每个数组的存储单元里存放了一个新数组的地址。主要应用于数据的分组管理。

1、二维数组的静态初始化

public class 二维数组静态初始化 {
    public static void main(String[] args) {
        int[][] arr={{1,2,3},{3,4,5,6}};
        for (int i = 0; i < arr.length; i++) {
            for (int i1 = 0; i1 < arr[i].length; i1++) {
                System.out.print(arr[i][i1]+" ");
            }
            System.out.println();
        }
    }
}

2、二维数组的动态初始化


public class 二维数组动态初始化 {
    public static void main(String[] args) {
        int[][] arr={
                {22,44,66},
                {77,45,67},
                {23,4,55}
        };
        //数据分组管理时使用
        int sum=0;
        for (int i = 0; i < arr.length; i++) {
            int[] jidu=arr[i];
            int sum1=getSum(jidu);
            System.out.println(sum1);
            sum+=sum1;
        }
        System.out.println(sum);
    }
    public static int getSum(int[] arr){
        int sum=0;
        for (int i = 0; i < arr.length; i++) {
            sum+=arr[i];
        }
        return sum;
    }
}

七、面向对象

1、面向对象的定义

面向对象是一种编程思维,与面向过程编程不同,面向对象编程更加符合人类的思考模式。

“面向对象的方法主要是把事物给对象化,包括其属性和行为。其本质就是:以类的方式组织代码,以对象的组织封装数据”

类:可以看做图纸,比如说类->手机,包括了手机的几个要素如打电话,解锁,闹钟

对象:是一个真正的物体,用类来描述对象。

暂且跳过,正在总结。绝对不是博主懒,而是在思考怎么写好。

八、字符串

1、String概述

(1)String所在的包为java.lang.String 含有lang的包在使用时不用调包。

(2)字符串的内容是不会发生变化的,它的对象在创建后不可以被更改。

(3)String是一个类,所以String是引用数据类型。

2、创建String的两种方式

(1)直接赋值法

String name="博主好帅";

(2)new关键字法 

构造方法

public String() 创建空白字符串,不含任何内容

public String(String 字符串)根据传入的字符串,创建字符串对象

public String (char[] chs) 根据字符数组,创建字符串对象

public String(byte[] chs)根据字节数组,创建字符串对象

例子:String str=new String( );

import java.util.Scanner;

public class Stringdemo1 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String str1=sc.next();//键盘录入是借用new得到的
        String str2="abc";
        System.out.println(str1==str2);
    }

}

(3)联系与区别

(1)他们都是引用数据类型,数据都存储在堆内存。

(2)直接赋值时,会先对串池进行检查,寻找是否已经存入代存储的数据,如果找到了数据,返回该数据的地址。如果没有找到,将所存储的字符串存储在StringTable(串池)中,方便进行存取操作。

类似的,new关键字在堆内存开辟了一个新的存储空间用来存放字符串的信息,因为字符串本身是不可以修改的,所以想要对字符串进行操作就需要开辟一个新空间并对其赋值。

举个栗子:

(1)String str="博主是个大帅哥";

String str1=new String("博主是个大帅哥");

str1不等于str,这是因为他们存储的是地址,进行对比时str存储在串池中,而str1存储在新开辟的空间中。

(2)String str1="博主宇宙第一帅";

String str2=“博主宇宙第一帅”;

str1等于str2,因为str2在串池中找到了想要存入的字符串,获取了目标字符串的地址,该地址和str1的地址相同。

如果想要对两个字符串进行比较,我们可以采用charAT(index)关键字来按位获取字符串的每一个字符,再进行对比,但是这样无疑是比较浪费时间和空间的。

(4)equals关键字

前文我们提到了字符串如果用简单的==来判断是判断他们的地址,实际开发过程中我们需要去对比两个字符串的内容是否相等,因此我们可以使用java内置的关键字。

s1.equals(s2); 比较两个字符串是否相等,返回值是一个boolean

s1.equalsIgnoreCase(s2);和上面的判断相同,但是忽略大小写的差异。

import java.io.OutputStream;

public class StringDemo {
    public static void main(String[] args) {
        String s1=new String("abc");//在堆区开辟空间
        String s2="Abc";//在字符串常量池赋值,简称串池
        //==号比较
        //基本数据类型,比较数据值
        //引用数据类型,比较地址
        System.out.println(s1==s2);
        boolean result1=s1.equals(s2);
        System.out.println(result1);
        //比较字符串对象中的内容是否相等,忽略大小写
        boolean result2=s1.equalsIgnoreCase(s2);
        System.out.println(result2);
    }
}

补充:

替换字符串中某一小段字符串

.replace(目标字符串,替换成何物); 

获取一小段字符串

.substring(开始位置m,结束位置n) ; 从m 到n-1

.substring(开始位置m);从m到结尾

注意:此截取行为并不会破坏字符串,只能将截取到的内容赋值使用。

截取的区间规则:包左不包右 

获取字符串的单个字符,按照索引获得

.charAt(i);

3、字符串基础练习

用户登陆判断

如果用户名和密码相同,返回登录成功。

import java.util.Scanner;

public class StringDemo2 {
    public static void main(String[] args) {
        String rightUsername="zhangsan";
        String rightPassword="123456";
        Scanner sc=new Scanner(System.in);
        for (int i=0;i<3;i++) {
            System.out.println("输入用户名");
            String username=sc.next();
            System.out.println("请输入密码");
            String password= sc.next();
            if(username.equals(rightUsername)&&password.equals(rightPassword)){
                System.out.println("用户登录成功");
            }else {
                if(i==2){
                    System.out.println("账号"+username+"被锁定,请联系客服");
                }else{
                    System.out.println("用户登录失败,用户名或密码有误,您还剩下"+(2-i)+"次机会");
                }
            }
        }
    }
}

字符串的遍历

(使用到了charAT关键字)

import java.util.Scanner;

public class 遍历字符串 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str= sc.next();
        for (int i = 0; i < str.length(); i++) {
            char c=str.charAt(i);
            System.out.println(c);
        }
    }
}

统计字符次数

import java.util.Scanner;

public class 判断字符串大小写个数 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("输入一个字符串");
        String str= sc.next();
        int bigCount=0;
        int smallCount=0;
        int numberCount=0;
        for (int i = 0; i < str.length(); i++) {//这里的length()调用的是一个方法,所以需要有括号()
            char c=str.charAt(i);
            if(c>='a'&&c<='z'){
                smallCount++;
            }else if(c>='A'&&c<='Z'){
                bigCount++;
            }
            //此处的0和9代表字符,如果换成整数类型的0和9会在ASCALL表中查询
            else if(c>='0'&&c<='9'){
                numberCount++;
            }
        }
        System.out.println(smallCount);
        System.out.println(bigCount);
        System.out.println(numberCount);
    }
}

字符串的拼接

public class 数组拼接成为字符串 {
    public static void main(String[] args) {
        int[] arr={1,2,3};
        String str=arrToString(arr);
        System.out.println(str);
    }
    public static String arrToString(int[] arr){
        if(arr==null){
            return "";
        }
        if(arr.length==0){
            return "[]";
        }
        String result="[";
        for (int i = 0; i < arr.length; i++) {
            if(i==arr.length-1){
                result+=arr[i];
            }else {
                result+=arr[i]+", ";
            }
        }
        result+="]";
        return result;
    }
}

字符串反转

public class 字符串的反转 {
    public static void main(String[] args) {
    String result=reverse("abcdef");
    System.out.println(result);
    }
    public static String reverse(String str){
        String result="";
        for (int i = str.length()-1; i >=0; i--) {
            char c=str.charAt(i);//按照索引获取字符
            result+=c;
        }
        return result;
    }
}

字符串-数字转化为银行账单金额

import java.util.Scanner;

public class 金额转换 {
    public static void main(String[] args) {
        //1键盘录入一个金额
        Scanner sc = new Scanner(System.in);
        int money;
        while (true) {
            System.out.println("输入金额");
            money = sc.nextInt();
            if (money >= 0 && money <= 9999999) {
                break;
            } else {
                System.out.println("金额无效");
            }
        }
        String moneystr = "";
        while (true) {
            int ge = money % 10;
            String capitalNumber = getCapitalNumber(ge);
            moneystr = capitalNumber + moneystr;
            money /= 10;
            if (money == 0) {
                break;
            }
        }
        //在前面补0,补齐七位。
        int count = 7 - moneystr.length();
        for (int i = 0; i < count; i++) {
            moneystr = "零" + moneystr;
        }
        //插入单位,定义一个数组表示单位
        String[] arr = {"佰", "拾", "万", "仟", "佰", "拾", "元"};
        //遍历moneystr,分别插入单位。
        String result="";
        for (int i = 0; i < moneystr.length(); i++) {
            char c = moneystr.charAt(i);
            result=result+c+arr[i];
        }
        System.out.println(result);
    }

    public static String getCapitalNumber(int number){
        String[] arr={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
        return arr[number];
    }
}

字符串敏感词屏蔽

.replace(目标,替换成何物); 

public class 敏感词替换 {
    public static void main(String[] args) {
        //获取对方说的话
        String talk = "你玩的真好,tmd不要再玩cnm了sb";
        //获取一个敏感词库
        String[] arr = {"tmd", "cnm", "nmlgb", "sb"};
        for (int i = 0; i < arr.length; i++) {
            talk = talk.replace(arr[i], "***");
        }
        System.out.println(talk);
    }
}

手机号中间四位屏蔽

.substring(开始位置m,结束位置n) ; 从m 到n-1

.substring(开始位置m);从m到结尾

注意:此截取行为并不会破坏字符串,只能将截取到的内容赋值使用。

截取的区间规则:包左不包右 

public class 手机号屏蔽 {
    public static void main(String[] args) {
        String phoneNUmber="13072349832";
        String begin=phoneNUmber.substring(0,3);
        String end=phoneNUmber.substring(7);
        String result=begin+"****"+end;
        System.out.println(result);
    }
}

4、StringBuilder

(1)概述

(1)StringBuilder可以看做一个可操作的容器,创建完成之后内部的内容是可以改变的,常用于字符串的反转和拼接操作。

(2)作用:提高字符串的操作效率

(3)StringBuilder是一个类,调用后想要使用String类,需要将StringBuilder转换成String再操作。

(2)StringBuilder的一些操作

(1)增加元素 

.append("");

(2)反转字符串

.reverse();

(3)转换成为String

.toString();

(4)替换某一段的字符串

.replace(start,end,String)

(3)字符串的拼接与反转

public class 字符串的拼接 {
    public static void main(String[] args) {
        int[] arr={1,2,3};
        String result=arrToString(arr);
        System.out.println(result);
    }

    public static String arrToString(int[] arr){
        StringBuilder sb=new StringBuilder();
        sb.append("[");
        for (int i = 0; i < arr.length; i++) {
            if (i== arr.length-1){
                sb.append(arr[i]);
            }else {
                sb.append(arr[i]).append(", ");
            }
        }
        sb.append("]");
        return sb.toString();
    }
}
public class 字符串的反转 {
    public static void main(String[] args) {
    StringBuilder sb=new StringBulider("abcd");
    String result=sb.reverse().toString();
    public System.out.println(result);
}

(4)判断字符串是否为对陈字符串

对陈字符串的特点是反转过后与原来的字符串相等。

import java.util.Scanner;

//String builder使用场景
//字符串的拼接 字符串的反转
public class 判断是否为对称字符串 {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入一个字符串");
        String str= sc.next();
       /* StringBuilder sb=new StringBuilder();
        sb.append(str);
        sb.reverse();
        String result=sb.toString();
        */
        String result=new StringBuilder().append(str).reverse().toString();
        if(str.equals(result)){
            System.out.println("该字符串为对陈字符串");
        }else{
            System.out.println("不是");
        }
    }
}

5、Stringjoiner

(1)概述

Stringjoiner 从jdk8出现,因此目前来说被应用的较少,但是作为新时代的我们应该学会这种偷懒的操作。主要用于应用于需要插入间隔符号的字符串拼接。

(2)构造方法

public Stringjoiner(间隔符号) 创建一个Stringjoiner对象,制定拼接时的间隔符号。

public Stringjoiner(间隔符号,开始符号,结束符号)与上面相同,多增加了开始和结束符号。

(3)关键字

.add("")增加元素

.tostring();转换为String类。

import java.util.StringJoiner;

public class joiner的使用 {
    public static void main(String[] args) {
        StringJoiner sj=new StringJoiner("@","=","。");
        sj.add("aaa").add("asa").add("fnoanf");
       String str= sj.toString();
        System.out.println(sj.length());//所有字符的总个数
        System.out.println(sj);
        System.out.println(str);
    }
}

6、String的底层原理和注意事项

(1)字符串存储内存原理

(1)直接赋值会复用字符串常量池中的字符串,如果没有找到会在串池中新增字符串。

(2)new出来的字符串不会复用,而是开辟一个新的空间

(2)==号比较的是什么

(1)基础数据类型(在栈内存中创建的)比较数据值。

(2)引用数据类型比较地址。

(3)字符串拼接的底层原理

(1)如果没有变量参与,都是字符串直接相加,会触发优化机制,编译过后相当于拼接的结果,会复用字符串常量池中的内容。

(2)如果有变量参与会创建新的字符串浪费空间。

在jdk8以前的版本会调用StringBuilder辅助拼接,至少需要两个空间(new和tostring)。

在jdk8及以后的版本会预估字符串长度并且按字节组成数组,再将数组转换成字符串,同样需要至少两个空间。

(4)StringBuilder提高效率原理

(1)所拼接的内容都放入在容器内不会浪费很多空间。

(5)StringBuilder源码分析

(1)默认是一个长度为16的字节数组。

(2)默认添加的内容小于16时,可以直接存储。

(3)内容大于16时,会扩容至34(*2+2)。

(4)如果扩容还不够,以实际长度为准。

九、集合

增 boolean add(E e)添加元素,返回布尔值表示是否添加成功。

删 boolean remove(E e)删除指定元素,返回值表示是否删除成功。 E remove(int index) 删除指定索引的元素,返回被删除的元素。

改 E set(int index,E e)根据指定索引修改元素,返回被修改的元素。 E get(int index)获取制定索引的元素。

查 int size()返回集合的长度,也就是集合中元素的个数

<>指泛型,集合内只能存储引用数据类型。


import java.util.ArrayList;

public class 创建集合并且遍历 {
    public static void main(String[] args) {
        ArrayList<String> list=new ArrayList<>();
        list.add("anc");
        list.add("vevw");
        list.add("aeecv");
        list.add("afqfa");
        System.out.print("[");
        for (int i = 0; i < list.size(); i++) {
            if(i==list.size()-1){
                //是最后一个
                System.out.print(list.get(i));
            }else {
                System.out.print(list.get(i)+",");
            }
        }
        System.out.println("]");
    }
}

​​​​​​​


总结

Java是一门超好用的语言,大家快来一起学习吧!
以上就是今天要讲的内容,本文仅仅简单介绍了Java的基础内容,更多的Java进阶知识博主会边学习边整理,欢迎大家指正错误!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值