实用类

枚举

switch:switch中的表达式只支持,int(byte,short,char)、String(JDK1.7)、枚举

引用数据类型:

  • 数组
  • 接口
  • 枚举(Enum)

在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列表的所有成员的程序。

枚举(enumerate,Enum)在日常生活中很常见,例如表示星期的Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday就是一个枚举。

JDK1.5出现的。

// 定义枚举类型
public enum 枚举类型名 {
    枚举值1, 枚举值2, ...[;]
    [构造]
    [属性]
    [方法]
}
// 使用枚举
Gender.枚举值

 未来在解决业务问题,如果业务值(例如:学员状态、课程状态...)是一个有穷序列,都可以考虑将这些值定义为一个枚举类型。

使用时,就不用担心出现不在枚举范围内的值得情况。

 枚举的本质

public enum Gender {
	公, 母
}

 对上述代码的字节码文件,反编译后:

// final修饰的类,代表不能被继承
// 继承自 Enum(枚举类型的*父类)
public final class Gender extends Enum {

    // 私有的构造
    // p1:枚举值
    // p2:序号
    private Gender(String s, int i){
        super(s, i);
    }

    // 静态常量:两个Gender类型的对象
    // Gender.公
    // Gender.母
    public static final Gender 公;
    public static final Gender 母;
    // Gender类型的数组
    private static final Gender[] ENUM$VALUES;

    // 静态代码块
    static {
        // 对两个Gender对象进行了实例化
        公 = new Gender("公", 0);
        母 = new Gender("母", 1);
        // 将两个Gender对象存储到Gender数组中
        ENUM$VALUES = (new Gender[] {
            _fld516C, _fld6BCD
        });
    }
    
    // 略....
    public static Gender[] values()
    {
        Gender agender[];
        int i;
        Gender agender1[];
        System.arraycopy(agender = ENUM$VALUES, 0, agender1 = new Gender[i = agender.length], 0, i);
        return agender1;
    }

    public static Gender valueOf(String s)
    {
        return (Gender)Enum.valueOf(demo02/Gender, s);
    }
}

看完了本质:

  • 枚举类型本质上就是一个类,所以它当然是一个引用数据类型
  • 枚举类型无法再继承其他类,因为继承了 Enum 类
  • 枚举类型的枚举值,实际上就是枚举类型的对象

包装类

泛型<引用数据类型>

集合存储整数,List<Integer>。


 基本类型 -> 包装类型

  • byte -> Byte
  • short -> Short
  • int -> Integer
  • long -> Long
  • float -> Float
  • double -> Double
  • boolean -> Boolean
  • char -> Character

包装类型的出现是为了解决基本类型无法使用方法的问题。

  • 基本类型无法使用方法的问题
  • 基本类型作为成员变量时,有默认值的问题
  • 基本类型无法赋值为null的问题

注意:包装类型的出现不是为了替代基本类型,而是完善基本类型的。

 Java是一个完全面向对象的编程语言吗?[面试题]

答: 不是因为它有基本数据类型。但是,java定义了包装类型可以完善基本类型。


 常用方法:

  • static valueOf(基本类型):对应的包装类型 将基本类型转换为对应的包装类型
  • static valueOf(String s):对应的包装类型 将字符串转换为对应的包装类型
Integer valueOf = Integer.valueOf("10");
  •  static toString(基本类型):String将基本类型转换为包装类型
  • toString():String 将包装类型转换为字符串

在 JDK 1.5 以前,Java 中的包装类型和基本类型,转换需要使用相应的 API,例如:构造方法或是 valueOf、xxxValue。

在 JDK 1.5 以后,Java 提供了自动装箱和拆箱。直接转换,赋值过程就实现了转换。

int num1 = 10;
// 自动装箱:基本类型转换为包装类型
Integer num2 = num1;
// 自动拆箱:包装类型转换为基本类型
int num3 = num2;

Math类

随机范围整数的公式:[min , min)

  • (int) (Math.random() * (max - min)) + min

Math:数学,java.lang包下的一个数组工具类。提供了大量的静态方法,用于数学计算。

 常用方法:

  • random() : double 随机 [0.0, 1.0) 范围的浮点数
  • sqrt(double) : double 求平方根
  • pow(double, double) : double 幂运算
  • abs(int) : int 求绝对值
  • floor(double) : double 向下取整
  • ceil(double) : double 向上取整
  • round(double) : long 四舍五入
  • max(double, double) : double 求最大值
  • min(double, double) : double 求最小值
  • ....

Random类

生成随机数。

构造方法:

  • Random() 默认以时间为种子数生成随机数对象
  • Random(long seed) 传入种子数生成随机数对象

常用方法:

  • nextInt(int):int生成[0, max)的随机整数
  • nextDouble():double生成[0.0, 1.0)的随机小数

不建议使用。

推荐采用: Random 的子类 ThreadLocalRandom

ThreadLocalRandom current = ThreadLocalRandom.current();
// [1, 4)
int nextInt = current.nextInt(1, 4);
System.out.println(nextInt);

String类

java.lang 包。

public final class String {
    /** The value is used for character storage. */
    private final char[] value;
}
String str = "字符串";
String str = new String("字符串");
String str1 = "abc";
String str2 = "abc";
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str2)); // true

String string1 = new String("abc");
String string2 = new String("abc");
System.out.println(string1 == string2); // false
System.out.println(string1.equals(string2)); // true

常用方法:

  • equals(Object) : boolean 比较两个字符串的内容是否一致
  • equalsIgnoreCase(String anotherString) : boolean 比较两个字符串的内容是否一致(不区分大小写)
  • toUpperCase() : String 将字符串转换为大写
  • toLowerCase() : String 将字符串转换为小写
  • length() : int 获取字符串的长度
  • isEmpty() : boolean 判断字符串是否为空字符串
  • charAt(int index) : char 在字符串根据下标获取字符
  • startsWith(String prefix) : boolean 判断字符串是否以指定前缀开头
  • endsWith(String suffix) : boolean 判断字符串是否以指定后缀结尾
  • indexOf(String str) : int 获取子字符串在字符串中的位置(从前往后找第1个),如果找不到返回 -1
  • lastIndexOf(String str) : int 获取子字符串在字符串中的位置(从后往前找第1个),如果找不到返回 -1
  • substring(int beginIndex) : String 从指定下标截取子串(包含 beginIndex,截取到最后)
  • substring(int beginIndex, int endIndex) : String 从指定下标截取子串到指定下标结束(包含beginIndex,不包含endIndex)
  • concat(String) : String 拼接字符串
  • replace(CharSequence target, CharSequence replacement) : String 替换字符串
  • contains(CharSequence s) : boolean 判断字符串中是否包含指定字符
  • split(String regex) : String[] 将字符串按照指定正则切割为字符串数组
  • static join(CharSequence delimiter, CharSequence... elements) : String 根据指定分隔符拼接字符串
  • join(CharSequence delimiter, Iterable<? extends CharSequence> elements) : String 根据指定分隔符拼接集合中的元素
  • trim() : String 去除字符串左右两侧的空格
  • toCharArray() : char[] 将字符串转换为字符数组
  • format(String format, Object... args) : String 格式化字符串
String name = "张三";
int age = 20;
String format = String.format("我的名字:%s,我的年龄:%d", name, age);
System.out.println(format);

final、finally、finalize区别(面试题)

final:可以用来修饰类、变量、方法。

  • 修饰类之后,该类无法被继承
  • 修饰变量之后,变量变为常量
    • 基本类型,不允许被再次赋值
    • 引用类型,不允许更改地址值,但允许更改内容
  • 修饰方法之后,该方法无法被重写

finally:是用于异常处理中,用于编写无论是否出现异常的情况下,都会执行的代码段。一般在其中编写的都是释放资源之类的代码。

finalize:它是 Object 类中的方法,当 GC 对象后,就会调用该方法,是为了给对应的对象进行一些收尾工作。

Integer(面试题)

Integer num1 = 128; 和 Integer num2 = 128;

num1 == num2; // false

// 引用数据类型 == 比较的是地址值
// Integer num1 = 127;
// Integer num2 = 127;
Integer num1 = Integer.valueOf(127);
Integer num2 = Integer.valueOf(127);
System.out.println(num1 == num2); // true

//		Integer num3 = 128;
//		Integer num4 = 128;
Integer num3 = Integer.valueOf(128);
Integer num4 = Integer.valueOf(128);
System.out.println(num3 == num4); // false
System.out.println(num3.equals(num4)); // true
// 摘抄自 Integer 类源码
public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

注意:从此点可知,做包装类判断内容相等应该使用equals方法。

上一篇:面向对象编程


下一篇:Java Stream 流式编程实战演练