java运算符与字符串操作(含帮助文档链接)

帮助文档链接:https://docs.oracle.com/en/java/
javaSE:https://docs.oracle.com/en/java/javase/index.html

1.运算符

1.1 算术运算符

public class Main{
    public static void main(String[] args){
        int a=3,b=2; //int a,b=1是有歧义的,a未初始化
        double c=1;
        System.out.println("a/b="+a/b); //整数相除
        System.out.println("a/c="+a/c); //整数除以浮点数
        System.out.println("a%b="+a%b); //取余
        System.out.println("a*c="+a*c); //相乘
    }
}

在这里插入图片描述

1.2 数学函数

java中的数学函数使用Math类。常见Math函数如下表所示:

函数含义
Math.sqrt(x) x \sqrt{x} x
Math.pow(x,a) x a x^{a} xa
Math.floorMod(x,a)x%a,无论x正负,大小总为0~a-1
Math.sin(x) sin ⁡ ( x ) \sin(x) sin(x)
Math.cos(x) cos ⁡ ( x ) \cos(x) cos(x)
Math.tan(x) tan ⁡ ( x ) \tan(x) tan(x)
Math.atan(x) a t a n ( x ) atan(x) atan(x),输出范围[-π/2, π/2]
Math.atan2(x) a t a n 2 ( x ) atan2(x) atan2(x),输出范围[-π, π]
Math.exp(x) e x e^{x} ex
Math.log(x) l n ( x ) ln(x) ln(x)
Math.log10(x) l o g 10 ( x ) log_{10}(x) log10(x)
Math.PI π \pi π
Math.E e e e
public class Main{
    public static void main(String[] args){
        System.out.println("sqrt(4)="+Math.sqrt(4));
        System.out.println("pow(2,2)="+Math.pow(2,2));
        System.out.println("floorMod(23,12)="+Math.floorMod(23,12));
        System.out.println("sin(PI)="+Math.sin(Math.PI));
        System.out.println("cos(PI)="+Math.cos(Math.PI));
        System.out.println("tan(PI)="+Math.tan(Math.PI));
        System.out.println("atan(0)="+Math.toDegrees(Math.atan(0))); //Math.toDegrees函数用于将弧度转化为角度
        System.out.println("atan2(1,1)="+Math.toDegrees(Math.atan2(1,1)));
        System.out.println("exp(2)="+Math.exp(2));
        System.out.println("ln(e)="+Math.log(Math.E));
        System.out.println("log10(10)="+Math.log10(10));
        System.out.println("PI="+Math.PI);
        System.out.println("e="+Math.E);
    }
}

在这里插入图片描述
值得注意的是:虽然Math类的方法输入输出参数都是double类型,但是也可以直接传入int类型。

public class Main{
    public static void main(String[] args){
        int x=4;
        System.out.println("sqrt(4)="+Math.sqrt(x));  //虽然Math类的方法输入输出参数都是double类型,但是也可以直接传入int类型
    }
}

在这里插入图片描述

1.3 数值类型之间转换

下图所示是数值类型的合法转换,实线表示无精度损失,虚线表示有精度损失。
在这里插入图片描述

1.4 强制类型转换

public class Main{
    public static void main(String[] args){
        char a='a';
        System.out.println("a="+a);
        System.out.println("a="+(int)a);
        System.out.println("a="+(long)a); //实际上是先转化为int,再转化为long
        double b=9.5;
        System.out.println("(int)b="+(int)b);  //直接截断小数变int
        System.out.println("round(b)="+(int)Math.round(b)); //Math.round返回对b四舍五入的结果,类型为long,所以还需要强制转int
        int c=128;
        System.out.println("(byte)c="+(byte)c); //byte的范围为[-128,127]
    }
}

在这里插入图片描述
值得注意的是,boolean类型不可以与任何数据类型进行强制转换,如果要将boolean类型转化为int,采用条件运算:

public class Main{
    public static void main(String[] args){
        boolean a=true;
        int b=a?0:1;
        System.out.println("b="+b);
    }
}

1.5 赋值与表达式的值

java支持+=这样的符号。表达式也可以进行赋值,但不建议。

1.6 自增与自减

++前缀形式会先完成加 1; 而后缀形式会使用变量原来的值。实际中一般不会使用下面这种容易引起混淆的代码:

public class Main{
    public static void main(String[] args){
        int a=1;
        int b=1;
        int c=1;
        int d=a*(++b); //注意常量是不可以使用++ --的
        int e=a*(c++);
        System.out.println("d="+d);
        System.out.println("e="+e);
    }
}

在这里插入图片描述

1.7 关系与boolean运算符

符号含义
==等于
!=不等于
>大于
<小于
>=大于等于
<=小于等于
&&
||

其中,对于与或的用法,有一定的应用价值,如&&可以用来避免错误:
x!=0 && 1/x>2,这个表达式中,首先判断x是不是0,如果不是0那么后面的1/x就不会出错,如果x是0,那1/x>2就不会被执行。

1.8 条件运算符

条件?表达式1:表达式2

1.9 switch表达式

switch表达式也是一个表达式,其返回一个值。

public class Main{
    public static void main(String[] args){
        //String类型的switch表达式,必须要有default,因为表达式必须要有返回值
        int a=1;
        String season=switch (a){
            case 0 -> "Spring";
            case 1 -> "Summer";
            case 2 -> "Fall";
            case 3 -> "Winter";
            default -> "???";
        };
        System.out.println("season="+season);
        //int类型的switch表达式,必须要有default,因为表达式必须要有返回值
        String s="Spring";
        int seasonCode=switch(s){
            case "Spring"->0;
            case "Summer"->1;
            case "Fall"->2;
            case "Winter"->3;
            default -> 4;
        };
        System.out.println("seasonCode="+seasonCode);
        //使用枚举常量作为操作值时,不必有default,因为表达式肯定有返回值
        enum Size {S,M,L,XL};
        Size size=Size.S;
        int b=switch(size){
            case S->0;
            case M->1;
            case L->2;
            case XL->3;
        };
        System.out.println("b="+b);

    }
}

在这里插入图片描述

1.10 位运算符

位运算符有4种:与&、或|、异或^、非~。另外还有>>、<<、>>>(没有<<<)。其中,>>和>>>是有区别的—— >>运算符会用0 填充高位,>>>会用符号位填充高位。

public class Main{
    public static void main(String[] args){
        int a=0b101;
        //判断从右往做第三位是0还是1
        //方法一
        int b=(a&0b100)/0b100;
        System.out.println("b="+b);
        //方法二
        int c=(a&(1<<2))>>2;
        System.out.println("c="+c);
        // >>> 与 >> 的区别
        int d=-10;
        System.out.println("d>>>2="+(d>>>2));
        System.out.println("d>>2="+(d>>2));
    }
}

在这里插入图片描述

2.字符串

java中没有内置的字符串类型,而是用String类来表示字符串。用""括起来的就是一个String对象。

2.1 子串、拼接、重复

public class Main{
    public static void main(String[] args){
        String s="Hello World";
        String ss="don't use ";
        //取子串
        String s1=s.substring(0,2);
        //拼接
        String s2=s+ss;
        int a=666;
        String s3=s+a; //与String进行拼接,不是String类型的对象会转化为String类型
        String s4=String.join(",","a","b","c","d");
        //重复
        String s5="I love java!".repeat(3);

        System.out.println("s1="+s1);
        System.out.println("s2="+s2);
        System.out.println("s3="+s3);
        System.out.println("s4="+s4);
        System.out.println("s5="+s5);
    }
}

在这里插入图片描述

2.2 字符串的不可更改性

在 Java 中,不可变字符串(即 String 类的实例)具有一个很大的优点,即编译器可以让字符串共享。这种共享机制称为字符串常量池(String Pool)。不可变字符串意味着一旦 String 对象被创建,它的内容就不能被改变。任何对字符串的修改操作都会生成一个新的字符串对象,而不会改变原来的字符串。这样做的目的是:相同内容的字符串字面量(指直接写为"Hello"这样的对象)会被编译器优化,让它们在内存中共享同一个对象。这大大减少了内存使用,提高了性能。

public class Main{
    public static void main(String[] args){
        String s1="Hello World";
        String s2="Hello World";
        String s3="don't use";
        // 打印s1和s2的identityHashCode,比较s1和s2是否是同一个对象
        System.out.println("s1 identityHashCode: " + System.identityHashCode(s1)); //System.identityHashCode()是与内存地址相关的值
        System.out.println("s2 identityHashCode: " + System.identityHashCode(s2));
        System.out.println("s3 identityHashCode: " + System.identityHashCode(s3));
        // 更改字符串的方法,将Hello World改为Hello Young woman
        String s4=s1.substring(0,6)+"Young woman";
        System.out.println("s4="+s4);
    }
}

在这里插入图片描述
字符串池是 JVM 为了优化字符串的存储而设计的一个内存区域。它用于存储字面量字符串和字符串常量。对于同样的字符串字面量,JVM 会在字符串池中存储并重用这些字符串。但是,字符串池仅用于存储字符串字面量(例如 “hello”)和编译时常量表达式(如 “he” + “llo”)。对于运行时生成的新字符串(如通过 substring() 或 + 操作生成的字符串),这些字符串不会自动加入字符串池,而是直接在堆内存中创建。

public class Main{
    public static void main(String[] args){
        String s1="Hello";
        if(s1=="Hello"){
            System.out.println("s1==\"Hello\"");
        }
        else{
            System.out.println("s1!=\"Hello\"");
        }
        if(s1.substring(0,2)=="He"){   //通过substring、+等操作得到的字符串是没有共享的
            System.out.println("s1.substring(0,2)==\"He\"");
        }
        else{
            System.out.println("s1.substring(0,2)!=\"He\"");
        }

    }
}

在这里插入图片描述

2.3 字符串比较

从2.2节可以知道,比较字符串用==的话,其实比较的是地址,想要比较字符串内容的话,千万不能用==,而是要用String.equals()

public class Main{
    public static void main(String[] args){
        String s1="Hello";
        if(s1.substring(0,2).equals("He")){   //通过substring、+等操作得到的字符串是没有共享的
            System.out.println("s1.substring(0,2)==\"He\"");
        }
        else{
            System.out.println("s1.substring(0,2)!=\"He\"");
        }

    }
}

在这里插入图片描述

2.4 空串与null串

空串:长度为0,内容为空的String对象。
null串:表示没有对象与改变量关联。

public class Main{
    public static void main(String[] args){
        String s1="";
        //检查空串的第一种方法
        if(s1.equals("")){
            System.out.println("s1 is \"\"");
        }
        else{
            System.out.println("s1 isn't \"\"");
        }
        //检查空串的第二种方法
        if(s1.length()==0){
            System.out.println("s1 is \"\"");
        }
        else{
            System.out.println("s1 isn't \"\"");
        }
        //检查null的方法
        String s2=null;
        if(s2==null){
            System.out.println("s2 is null");
        }
        else{
            System.out.println("s2 isn't null");
        }
        String s3="I love you";
        //判断不是null和空串的方法
        if(s3!=null && s3.length()!=0){   //对于null的String变量,该变量不能调用任何的String方法,所以必须s3!=null在前,s3.length()!=0在后
            System.out.println("s3 isn't null or \"\"");
        }
    }
}

在这里插入图片描述

2.5 码点与代码单元

在这里插入图片描述

public class Main{
    public static void main(String[] args){
        String s="🍺好喝";
        //获取代码单元个数
        int codeUnitNum=s.length();
        System.out.println("codeUnitNum="+codeUnitNum);
        //获取码点个数
        int codePointNum=s.codePointCount(0,codeUnitNum);
        System.out.println("codePointNum="+codePointNum);
        //获取指定位置处的字符,1字节的char类型数据不足以表示辅助代码单元
        char c1=s.charAt(0);
        char c2=s.charAt(1);
        char c3=s.charAt(2);
        char c4=s.charAt(3);
        System.out.println("c1="+c1);
        System.out.println("c2="+c2);
        System.out.println("c3="+c3);
        System.out.println("c4="+c4);
        for (int i = 0; i < codePointNum; i++) {
            int a = s.codePointAt(s.offsetByCodePoints(0, i));
            String str = String.valueOf(Character.toChars(a));
            System.out.print(str);
        }
    }
}

在这里插入图片描述
所以还是不要使用char类型了,直接使用String类。更多关于String的API查看https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/String.html

2.6 文本块

文本块特别适合包含用其他语言编写的代码,如 SQL 或 HTML 可以直接将那些代码粘贴到一对三重引号之间。如果一个文本块中包含非 Java 代码,实际上最好沿 左边界放置。这样可以与Java 代码区分开,而且可以为长代码行留出更多空间。

public class Main{
    public static void main(String[] args){
        //内容为"""之间的内容,但是第一个"""后面的换行符不包括
        String block= """
I
love
young
woman
                """;
        String s="I\nlove\nyoung\nwoman\n";
        System.out.println("block="+block);
        System.out.println("s="+s);
        System.out.println(block.equals(s));
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

F l e

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值