Java简易教程——一篇搞定Java面向对象编程核心类

 

img

一、字符串

Java中,String是一个引用类型,就是改变string不会改变string 本身,而是另外创建了一个string。所以比较字符串的时候,必须使用equals()方法而不能用==;要忽略大小写比较,使用equalsIgnoreCase()方法。

因为string是引用类型,所以其实string也是一个类,是类就会有string的方法,String类还提供了多种方法来搜索子串、提取子串。另外还有去除首位空白的trim()方法;替换字符串字母的方法replace();分隔字符串方法split();拼接字符串方法join()。同样的,也可以把Java的基本类型转换为字符串类型,用,可以使用静态方法valueOf()。这是一个重载方法,编译器会根据参数自动选择合适的方法。

比如:

class Hello{
public static void main(String[] args) {
var c="Hello".contains("ll");
"Hello".indexOf("l"); // 2
"Hello".lastIndexOf("l"); // 3
"Hello".startsWith("He"); // true
"Hello".endsWith("lo"); // true
"Hello".substring(2); // "llo"
"Hello".substring(2, 4);// "ll"

System.out.println(c); // true
}
}

// 转换方法
String.valueOf(123); // "123"
String.valueOf(45.67); // "45.67"
String.valueOf(true); // "true"

二、字符编码

ASCII编码,英文字母、数字和常用符号的编码,它占用一个字节,编码范围从0到127,最高位始终为0。如果汉字也用这套编码是不够的,所以标准使用两个字节表示一个汉字,所以每个语言不同的国家都会有自己的一套标准,这样标准不统一,同时使用,就会产生冲突。为了解决这个问题,全球统一码联盟发布了Unicode编码。UTF-8编码的另一个好处是容错能力强。如果传输过程中某些字符出错,不会影响后续字符,因为UTF-8编码依靠高字节位来确定一个字符究竟是几个字节,它经常用来作为传输编码。

但是要注意的是,Java的String和char在内存中总是以Unicode编码表示。

所以在转换字符串的时候,可以使用getBytes() 方法装码。例如:

getBytes("UTF-8"); 按UTF-8编码转换。

三、StringBuilder

因为string是引用类型,所以当在进行循环一个string的时候其实就是在不断的创建string,这样不但费内存还影响效率。

所以Java标准库提供了StringBuilder,它是一个可变对象,可以预分配缓冲区,这样,往StringBuilder中新增字符时,不会创建新的临时对象。另外StringBuilder还可以进行链式操作。例如:

sb.append("Mr ").append("Bob")

.append("!").insert(0, "Hello, ");因为append()方法总是返回this,是它不断调用自身的其他方法。

class Hello{
public static void main(String[] args) {
StringBuilder sb = new StringBuilder(1024);
for (int i = 0; i < 10; i++) {
    sb.append(i);
    sb.append(',');
}
String s = sb.toString();
System.out.println(s);
}
}

四、StringJoiner

以上这样拼接数组字符串的方式有点麻烦,所以java标准库还提供了一个StringJoiner。其实,StringJoiner的内部也使用了StringBuilder,所以他们的拼接其实是一样的。另外如果你不需要设置开头何结尾,可以使用string.join()方法,这个方法在内部使用了StringJoiner来拼接字符串。

也就是StringBuilder–>StringJoiner–>String.join()。

import java.util.StringJoiner;

class Hello{
public static void main(String[] args) {
String[] names = {"Bob", "Alice", "Grace"};
//         var sj = new StringJoiner(", ");
        var sj = new StringJoiner(", ", "Hello ", "!");
// 结果: Hello Bob, Alice, Grace!
//         设置开头和结尾
        for (String name : names) {
            sj.add(name);
        }
        System.out.println(sj.toString());
}
}

例子2:

class Hello{
public static void main(String[] args) {
String[] names = {"Bob", "Alice", "Grace"};
        var sj=String.join(",", names);
        System.out.println(sj.toString());
//Bob,Alice,Grace

}
}

五、包装类型

因为我们知道java有两种类型,基本类型和引用类型。那么如何把基本类型具有引用类型类型的特性?比如可以赋值为null?这需要把基本类型包装起来,变成包装类。Java核心库为每种基本类型都提供了对应的包装类型。所以我们不需要自己去定义,直接使用就可以了。

基本类型 对应的引用类型
boolean java.lang.Boolean
byte java.lang.Byte
short java.lang.Short
int java.lang.Integer
long java.lang.Long
float java.lang.Float
double java.lang.Double
char java.lang.Character

用法,通过静态方法valueOf()创建Integer实例。

例如:

class Hello{
public static void main(String[] args) {
int i=100;
Integer n1=Integer.valueOf(i);
n1=null;
System.out.println(n1); // null
}
}

直接把int变为Integer的赋值写法,称为自动装箱(Auto Boxing),反过来,把Integer变为int的赋值写法,称为自动拆箱(Auto Unboxing)。

六、JavaBean

之前我们学习java的时候,经常使用getName()和setName()的方法和读写字段。其实这是JAVA封装的JavaBean属性只需要定义getter和setter方法。JavaBean主要用来传递数据,即把一组数据组合成一个JavaBean便于传输。在编程中,我们不需要书写这对方法,只要定义好变量,通过IDE,可以快速生成getter和setter。

方法:

点击右键,在弹出的菜单中选择“Source”,“Generate Getters and Setters”

七、枚举类

以其说是枚举,不如说是检查枚举。因为JAVA编译器无法检查每个值的合理性。

比如现在有一个类,定义了常量,当然也可以把字符串型的常量定义为int类型。如下的例子枚举不会检查枚举的值或者类型,都会放回true,而enum定义的枚举类会检查。定义enum的枚举类只需要列出常量名就可以了,编译器会自动检查出类型错误。

例如:

package abc;

public class color {
public static void main(String[] args) {
ColorString cc = new ColorString();
// 不会检查cc的类型和数值
if (cc.RED== "red" || cc.GREEN == "black") {
System.out.println("true"); // true
   
}
// 不同写法结果都一样
if (cc.RED.equals("red") || cc.RED.equals("black")) {
System.out.println("true"); // true
}
}
}

class ColorString {
    public static final String RED = "red";
    public static final String GREEN = "green";
    public static final String BLUE = "blue";
}

enum定义的枚举类事例:
package abc;

public class color {
public static void main(String[] args) { 
ColorString cc=ColorString.RED;
// 会检查ColorString
if (cc== ColorString.RED || cc== ColorString.GREEN) {
System.out.println("true"); // true
   
}
}
}

// enum来定义枚举类
enum ColorString {
    RED,GREEN,BLUE
}

enum定义的枚举类是一种引用类型,我们知道引用类型要用equals()方法比较,而不是用【==】,但是enum类型的每个常量在JVM中只有一个唯一实例,所以可以直接用【==】比较。

也许你已经注意到上面两个例子定义了class的不同方式,那enum枚举类和普通类有什么不同呢?

1、定义的enum类型总是继承自java.lang.Enum,且无法被继承;

2、只能定义出enum的实例,而无法通过new操作符创建enum的实例;

3、定义的每个实例都是引用类型的唯一实例;

4、可以将enum类型用于switch语句

八、BigInteger和BigDecimal

简单的说,BigInteger用于表示任意大小的整数,继承自Number,将BigInteger转换成基本类型时可使用longValueExact()等方法保证结果准确。

BigDecimal用于表示精确的小数,比较BigDecimal的值是否相等,必须使用compareTo()而不能使用equals(),不但要求两个BigDecimal的值相等,还要求它们的scale()相等,BigDecimal也是从Number继承。

BigInteger内部用一个int[]数组来模拟一个非常大的整数,对BigInteger做运算的时候,只能使用实例方法。

例如:

import java.math.BigInteger;

public class color {
public static void main(String[] args) { 
BigInteger b1 = new BigInteger("123456789");
BigInteger b2 = new BigInteger("123456789");
BigInteger sum=b1.add(b2);
System.err.println(sum); //246913578
}
}

BigDecimal可以表示一个任意大小且精度完全准确的浮点数。scale()表示小数位数。

例如:

BigDecimal d1 = new BigDecimal("1212.1212");
System.out.println(d1.scale()); //4


BigDecimalstripTrailingZeros()方法,可以格式化掉数值后面的0

BigDecimal d1 = new BigDecimal("1212.1212000");
System.out.println(d1.scale()); //7
System.out.println(d1.stripTrailingZeros());//1212.1212

另外还可以对BigDecimal进行四舍五入。

BigDecimal d1 = new BigDecimal("1212.1212789");
System.out.println(d1.scale()); //7
System.out.println(d1.stripTrailingZeros());//1212.1212789
System.out.println(d1.setScale(4, RoundingMode.HALF_UP)); // 四舍五入1212.1213
System.out.println(d1.setScale(4, RoundingMode.DOWN));// 直接截断 1212.1212

在比较两个BigDecimal的值是否相等时,要特别注意,使用equals()方法不但要求两个BigDecimal的值相等,还要求它们的scale()相等,所以要使用compareTo()来比较,compareTo()比较的结果:两个值的大小分别返回负数、正数和0,分别表示小于、大于和等于。

例如:

BigDecimal d1 = new BigDecimal("123.456");
BigDecimal d2 = new BigDecimal("123.45600");
System.out.println(d1.equals(d2)); // false,因为scale不同
System.out.println(d1.equals(d2.stripTrailingZeros())); // true,因为d2去除尾部0scale变为2
System.out.println(d1.compareTo(d2)); // 0

九、常用工具类

Java的核心库提供了大量的现成的类供我们使用,有Math数学类,Random伪随机类和SecureRandom安全随机类。

本文为博主原创文章,知识共享,开源精神,转载注明出处。