标签(空格分隔): 开课吧-03核心类库
- 参数化类型。将类型有原来的具体类型参数化,类似于方法中的变量参数。
- 作用:声明属性时,类型可以参数化
- 作用:声明抽象方法时可以参数化
- 实现该接口时有两种方法
- 指定泛型类型
- 不指定泛型类型
    //指定泛型类型
    public interface IntercaceName<T>{ 
        T getData(); 
    }
    
    public class Interface1 implements IntercaceName<String> {
        private String text; 
        
        @Override public String getData() { 
        return text; 
        } 
    }
    //不指定类型: 
    public class Interface1<T> implements IntercaceName<T> { 
        private T data; 
        
        @Override public T getData() { 
        return data; 
        } 
    }
- 作用:提高了非继承的两个类对同一方法的复用性,常和抽象方法结合使用
- 分析:以往若想通过一个方法传两种类型的形参,需方法重载或父子类继承,现在通过泛型化参数,使得两个没有关联的两个类也能使用同一个
- 要点:
- 形参泛型化和与类是否泛型化无关,与方法是否泛型化有关
- 方法泛型具体化后,形参/返回值也必须具体化
- 方法泛型化,若无泛型化形参,则此泛型不起作用,若返回值也为泛型,则起作用
- 方法返回值为泛型前提该方法必须为泛型方法
- 返回值为泛型,多与抽象类使用,否则需形参为泛型,不然无返回值
    <? extends Parent>//指定了泛型类型的上届,?是子类
    <? super Child>//指定了泛型类型的下届,?是父类
- 通过构造方法,实例化对象时
    public class Demo4 {
         public static void main(String[] args) {
            Test1<? extends Demo4> t=new Test1<>();
            Test1<? super Son0fDemo4> t2=new Test1<>();
         }
    }
class Son0fDemo4 extends Demo4 { }
class Test1<T> { }
- 在编译之后程序会采取去泛型化的措施。
- 即Java中的泛型,只在编译阶段有效。不会进入到运行时阶段
- 在编译过程中,正确检验泛型结果后,会将泛型的相关信息擦除,并且在对象进入和离开方法的边界处添加 类型检查和类型转换的方法。
    //取绝对值
        System.out.println(Math.abs(-100));
        //取最小值
        System.out.println(Math.min(200, 300));
        //四舍五入
        System.out.println(Math.round(30.5));//31
        System.out.println(Math.round(-30.5));//-30
        //返回小于等于参数的最大整数
        System.out.println(Math.floor(30.5));//30
        System.out.println(Math.floor(-30.5));//-31
        //返回大于等于参数的最大整数
        System.out.println(Math.ceil(30.5));//31
        System.out.println(Math.ceil(-30.5));//-30
         int[] arr = {1, 4, 3, 5, 2};
        //输出数组元素
        System.out.println(Arrays.toString(arr));
        //数组正向排序
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
        //查找某个元素的下标
        System.out.println(Arrays.binarySearch(arr,5));
        //数组扩容
        int[] ints = Arrays.copyOf(arr, 10);
- 通过控制台运行0.1+0.2会发现float和double的运算误差
- 运算结果不会参与运算本身的数据,而是会被封装为一个新的BigDecimal对象
    BigDecimal b1 = new BigDecimal(0.1);
        BigDecimal b2 = new BigDecimal(0.2);
        BigDecimal b3 = b2.add(b1);//加法
        BigDecimal b4 = b2.subtract(b1);//减法 
        BigDecimal b5 = b2.multiply(b1);//乘法 结果:
        BigDecimal b6 = b2.divide(b1);//除法
        
        System.out.println(b5); //0.0200000000000000022204460492503131424770215
        System.out.println(0.1*0.2); //0.020000000000000004
- Date():不传参,传入当前日期
- getTime:获取当前毫秒数
- setTime:设置当前毫秒数
- 格式化日期字符串
        //将日期对象转换成字符串
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String time = s.format(new Date());
        System.out.println(time);
        
        //将字符串转换成日期对象
        Date date = s.parse("2021-10-1 20:11:33");
        System.out.println(date);
面试题:求一个人年龄或给定年龄求哪一年出生的
            //求一个人的年龄
        System.out.println((new Date().
            getTime()-date.getTime())/1000/60/60/24);//date为变量
            
        //求哪一年出生的
        int age=18;
        System.out.println(new Date().getTime()/1000/60/60/24-age);
- 传入年月日等时间对象,比Date类更具国际化
        //实例化
        Calendar c=Calendar.getInstance();
        //获取值
        //原理:通过int类型field[]数组存储全局常量,YEAR=1,MONTH=2,WEEK=3
        //这些数字就是数组的下标,通过全局常量对应的下标对数据进行操作
        //年份
        System.out.println(c.get(Calendar.YEAR));
        //月份 1-12月对应0-11 获取正确的月份需+1
        System.out.println(c.get(Calendar.MONTH)+1);
        //第几周
        System.out.println(c.get(Calendar.WEEK_OF_YEAR));
        //几号
        System.out.println(c.get(Calendar.DAY_OF_MONTH));
        //周几 周日对应1
        System.out.println(c.get(Calendar.DAY_OF_WEEK)-1);
        //一年第几天
        System.out.println(c.get(Calendar.DAY_OF_YEAR));
        //增减值
        c.add(Calendar.YEAR,-1);
        //获取日期对象
        Date time = c.getTime();
        //获取最大值
        c.set(Calendar.MONTH, 1);
        System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH));//2月最大天数
- 字符串是不变的,值在创建后无法更改。
- 通过char[]数组存储,长度确定
- 用加号(+)
- 分析:在方法区中生成新的字符串,GC不能回收,生成较多内存垃圾
- 用实现类(可变字符序列)
- StringBuilder:线程不安全,效率高
- StringBuffer:线程安全,效率低
- 原理:通过构造方法构造一个字符串缓冲区,其中无字符,初始容量为16个字符,存满自动扩容,通过append方法进行拼接
    /**
     * 1. 练习 1:StringBuffer 中的 reverse()
     */
    public static void reverse() {
        String str = "I love China";
        System.out.println(new StringBuffer(str).reverse().toString());
    }
    
     /**
     * 2. 练习 2:使用 String 的方法按照空格间隔每部分数据,然后再根据等号切割
     */
    public static void spilt() {
        //实例化学生类对象
        Student s=new Student();
        //要分割的数据
        String info = "name=王五 age=18 classNum=1101";
        //分割后的数据
        String str[] = info.split(" |=");
原文:https://www.cnblogs.com/ly411/p/14623355.html