java基础(7)- 字符串(String)对象和数学(Math)对象

注 : 参考自https://mp.weixin.qq.com/s/MrrN7BDcKMu8SCKs6zij_g

7.1String字符串

7.2StringBuffer和StringBuilder

7.3Math类

7.1String字符串

String字符串

一、定义String字符串

String字符串和char字符不同,char使用单引号,只能表示一个字符,字符串就是一段文本。String是个类。这个类使用final修饰,所以这个类是不可以继承扩充和修改它的方法的。String类又特别常用,所以在对String对象进行初始化时,它可以不像其它对象一样,必须使用new关键字构造对象。Java提供了一种简化的特殊语法。

使用String对象存储字符串:

String s = "有志者事竟成";

当然我们也还是可以像以前使用new关键字的。

String s = new String("有志者事竟成");

二、String字符串的常用方法。

String类位于java.lang包中,java会默认的导入java.lang包,所以我们使用java.lang包的类时,不需要显示的import类,String类具有丰富的方法,其中比较常用的有:

  1. 计算字符串的长度

  2. 连接字符串

  3. 比较字符串

  4. 提取字符串

  5. 替换字符串

1、计算字符串的长度比较简单。代码如下:

String email = "[email protected]  ";
System.out.println(email.length());
System.out.println(email.trim().length());
String abc="你好";
System.out.println(abc.length());

第一个输出是:13。

第二个输出是:11。

第三个输出是:2。

因为空格也算是字符串的长度,如果你不想计算前后的空格,也也可以使用trim()方法把前后的空格去了。在计算长度。第三个输出为2,可见java对中文的处理和英文也是一样计算的。并不存在一个中文等于两个英文符号的长度。

2、连接字符串。

连接字符串有两种方法:方法1:使用“+”。方法2:使用String类的concat()方法。代码如下:

System.out.println(email+"abc");
System.out.println(email.concat("abc"));

上面两个代码的输出都是一样的:

[email protected] abc

[email protected] abc

3、比较字符串

字符串的比较方法有很多,如比较两个字符串是否相等,比较后返回值是个布尔值。

String email2="[email protected]";
if(email.equals(email2)){
System.out.println("相等");
}else{
System.out.println("不相等");
}

结果是不相等。

字符串的比较是提取每一个字符逐个比较的,如下图所示

java基础(7)- 字符串(String)对象和数学(Math)对象java基础(7)- 字符串(String)对象和数学(Math)对象

而且这种比较是区分大小写的。所以

String str1 = "java";
String str2 = "Java";
System.out.println(str1.equals(str2));

返回为false,如果你想不区分大小写的比较,那么你可以使用不区分大小写的比较方法或者把字符转为为大写(也就可以小写)后再比较。

System.out.println(str1.equalsIgnoreCase(str2));
System.out.println(str1.toLowerCase().equals(str2.toLowerCase()));
System.out.println(str1.toUpperCase().equals(str2.toUpperCase()));

我们还可以判断字符串是否已某个字符串结尾或者开头

System.out.println(email.startsWith("abc"));
System.out.println(email.endsWith("com"));

4、提取字符串

要提取字符串,我们首先得学会如何查询字符串。

java基础(7)- 字符串(String)对象和数学(Math)对象

查找是要注意一下几点:

System.out.println(email.indexOf("a"));//从零开始,所以这里是0
System.out.println(email.indexOf("c"));//这个是2,从左到右找,返回第一个找到的。
System.out.println(email.indexOf("zz"));//找不到返回是-1
System.out.println(email.lastIndexOf("c"));//这个是8,从右到左找,返回第一个找到的。
下面是截取字符串

java基础(7)- 字符串(String)对象和数学(Math)对象

注意下标也是从0开始的。

System.out.println(email.substring(3));//从第4个(包括第四个)开始截取到最后
System.out.println(email.substring(3, 5));

indexOf方法和substring方法经常一起使用,比如我们要截取@之后的所有字符串,我们可以结合这个两个。

System.out.println(email.substring(email.indexOf("@")+1));

5、替换字符串

例如我们可以把所有的字符串c换成字符串z

System.out.println(email.replace("c", "z"));


7.2StringBuffer和StringBuilder

StringBuffer和StringBuilder

一、StringBuffer的基本方法

StringBuffer 用于表示可以修改的字符串

1、构造方法。

java基础(7)- 字符串(String)对象和数学(Math)对象

StringBuffer sb1=new StringBuffer();//分配了长16字节的字符缓冲区
StringBuffer sb2=new StringBuffer(512);//分配了512字节的字符缓冲区
StringBuffer sb3=new StringBuffer("大家好");

在字符缓冲区中存放字符串"大家好",另外,后面再留了16字节的空缓冲区。

2、常用方法。

java基础(7)- 字符串(String)对象和数学(Math)对象

// 字符设置和替换
// setCharAt(int index,char ch),将指定的字符ch放到index指出的位置。
// charAt(int index) 获得指定位置的字符
StringBuffer s1 = new StringBuffer("java");
s1.setCharAt(1, 'u');// 则s为"juva"

// 字符的插入
// insert(int offset,char ch),在offset位置插入字符ch。
StringBuffer s2 = new StringBuffer("wecome");
s2.insert(2, 'l');// 则s为"welcome"

// 在字符串末尾添加内容(Append方法)
StringBuffer s3 = new StringBuffer("中国");
s3.append("好");// 则s为"中国好"
// 转换为不变字符串:toString()。
System.out.println(s3.toString());

// 获取字符串的长度: length()
StringBuffer s4 = new StringBuffer("abc");
System.out.println(s4.length());

// 获取字符串的容量
System.out.println(s4.capacity());

// 字符串反转
s4.reverse();
System.out.println(s4.toString());

// 删除指定字符串着中的字符
// delete(int start,int end)
StringBuffer s5 = new StringBuffer("Hello");
s5.delete(0, s5.length()); // 删除字符串s的全部字符
System.out.println(s5.toString());

// deleteCharAt(int index)
StringBuffer s6 = new StringBuffer("Hello");
s6.deleteCharAt(4); // 删除字符串s索引为4的字符
System.out.println(s6.toString());

// 替换字符串
// replace(int start,int end,String str)
StringBuffer s7 = new StringBuffer("Hello");
s7.replace(0, 1, "qqq");
System.out.println(s7.toString());

// substring(int start) //返回从start下标开始以后的字符串
StringBuffer s8 = new StringBuffer("Hello");
s8.substring(2);
System.out.println(s8.toString());

// substring(int start,int end) //返回从start到 end-1字符串
StringBuffer s9 = new StringBuffer("Hello");
s9.substring(2,3);
System.out.println(s9.toString());

二、StringBuilder,StringBuffer和StringBuilder的区别

StringBuilder和StringBuffer的方法是一样,区别是StringBuffer是线程安全,一个StringBuilder不是,你可以查看一下两个类的源码,StringBuffer的方法前面有synchronized关键字修饰。这个以后我们在讲解线程的时候会讲到。这里我们知道一下两者的区别即可:

StringBuffer线程同步,所以使用起来比较安全,但是效率较低主要是多线程和操作比较频繁是有有所体现。

StringBuilder正好相反不同步,效率高,但是多线程使用时可能会有问题。

三、String和StringBuffer的区别

1、String的不变性

当字符串string在内存中创建后,就不会再改变,所以对该字符串进行的所有改变操作,实际上都没有改变原来的字符串,你可以参考一下我们第一节,不过我们调用了原始的String的多少个方法,其实对原来的字符都不会有任何改变,都是重新生成一个新的字符串作为返回值,这就是所谓的Java String的不变性。

每一次的修改操作都会生成一个新的字符串,有一个不好的点——慢慢地消耗了内存,对GC来说也是非常费时的一件事,效率非常低,所以如果我们需要多次改变创建的字符串的话,那么使用String将会是个很不好的选择。

2、String与StringBuffer的区别

真是因为String是的不变性,StringBuffer或者StringBuilder就有他们的用武之地了,当然String有它的优点,就是使用方便,我们如何做出选择呢?一般如果字符串经常要做出修改,比如经常要拼接,删除等等,那么使用StringBuffer或者StringBuilder比较好,你可以在完成操作后使用toString方法转换为String类。

7.3Math类


Math类

Math类是一个很有用的数学帮助类,使用也非常简单,这个类比较特殊,首先他和String类一样都是用final修饰,所以不能有子类,还有就是它的构造方法是私有的,也就是我们不能通过new的方法在其它类中构造Math对象,那么我们怎样调用它的方法,原来它的所有的方法都是静态方法,也就是可以直接使用类名就可以访问方法了。

一、方法简介

static double abs(double a)

返回 double 值的绝对值。

static float abs(float a)

返回 float 值的绝对值。

static int abs(int a)

返回 int 值的绝对值。

static long abs(long a)

返回 long 值的绝对值。

static double acos(double a)

返回角的反余弦,范围在 0.0 到 pi 之间。

static double asin(double a)

返回角的反正弦,范围在 -pi/2 到 pi/2 之间。

static double atan(double a)

返回角的反正切,范围在 -pi/2 到 pi/2 之间。

static double atan2(double y, double x)

将矩形坐标 (x, y) 转换成极坐标 (r, theta)。

static double cbrt(double a)

返回 double 值的立方根。

static double ceil(double a)

返回最小的(最接近负无穷大)double 值,该值大于或等于参数,并且等于某个整数。

static double cos(double a)

返回角的三角余弦。

static double cosh(double x)

返回 double 值的双曲线余弦。

static double exp(double a)

返回欧拉数 e 的 double 次幂的值。

static double expm1(double x)

返回 ex -1。

static double floor(double a)

返回最大的(最接近正无穷大)double 值,该值小于或等于参数,并且等于某个整数。

static double hypot(double x, double y)

返回 sqrt(x2 +y2),没有中间溢出或下溢。

static double IEEEremainder(double f1, double f2)

按照 IEEE 754 标准的规定,对两个参数进行余数运算。

static double log(double a)

返回(底数是 e)double 值的自然对数。

static double log10(double a)

返回 double 值的底数为 10 的对数。

static double log1p(double x)

返回参数与 1 的和的自然对数。

static double max(double a, double b)

返回两个 double 值中较大的一个。

static float max(float a, float b)

返回两个 float 值中较大的一个。

static int max(int a, int b)

返回两个 int 值中较大的一个。

static long max(long a, long b)

返回两个 long 值中较大的一个。

static double min(double a, double b)

返回两个 double 值中较小的一个。

static float min(float a, float b)

返回两个 float 值中较小的一个。

static int min(int a, int b)

返回两个 int 值中较小的一个。

static long min(long a, long b)

返回两个 long 值中较小的一个。

static double pow(double a, double b)

返回第一个参数的第二个参数次幂的值。

static double random()

返回带正号的 double 值,大于或等于 0.0,小于 1.0。

static double rint(double a)

返回其值最接近参数并且是整数的 double 值。

static long round(double a)

返回最接近参数的 long。

static int round(float a)

返回最接近参数的 int。

static double signum(double d)

返回参数的符号函数;如果参数是零,则返回零;如果参数大于零,则返回 1.0;如果参数小于零,则返回 -1.0。

static float signum(float f)

返回参数的符号函数;如果参数是零,则返回零;如果参数大于零,则返回 1.0;如果参数小于零,则返回 -1.0。

static double sin(double a)

返回角的三角正弦。

static double sinh(double x)

返回 double 值的双曲线正弦。

static double sqrt(double a)

返回正确舍入的 double 值的正平方根。

static double tan(double a)

返回角的三角正切。

static double tanh(double x)

返回 double 值的双曲线余弦。

static double toDegrees(double angrad)

将用弧度测量的角转换为近似相等的用度数测量的角。

static double toRadians(double angdeg)

将用度数测量的角转换为近似相等的用弧度测量的角。

static double ulp(double d)

返回参数的 ulp 大小。

static float ulp(float f)

返回参数的 ulp 大小。

二、方法使用

       System.out.println(Math.PI);

System.out.println(Math.abs(-1));

System.out.println(Math.floor(100.99));

System.out.println(Math.ceil(100.00001));

System.out.println(Math.round(20.4));

System.out.println(Math.max(99, 98));

System.out.println(Math.pow(2, 10));

System.out.println((int)(Math.random()*10));//随机的 1-10

System.out.println(Math.sqrt(9));

System.out.println((-5-Math.sqrt(Math.pow(5, 2)-4*2*2))/2);
System.out.println("x=");