Java笔记4(常用类)

只是一些自己认为重点和易错点的笔记

常用类相关笔记

1、内部类

  • 一个类内部再定义一个完整的类
  • 内部类可访问外部类的私有成员,不破坏封装
  • 内部类也可编译生成字节码文件
  • 只有内部类可用static修饰,普通类不能用
  • 局部变量属性不加访问修饰符

2、成员内部类

  1. 实例变量(属性)、实例方法同级别的类。class 类名

  2. 在测试类中创建内部类的对象:设外类为Out,内部类为In

    In in = new Out().new In();
    
  3. 内外类中属性重名,优先访问内部类属性;

    要想访问外部类的属性要使用:外部类名.this.属性名

  4. 内部类中不能定义静态成员,可定义静态常量。

3、静态内部类

  1. 外部类同级别,用static修饰的成员内部类;
  2. 不依赖外部类,应该是说创建内部类对象时不必创建外部类对象;
In in = new Out.In();
  1. 可包含静态成员;

  2. 内类访问外类成员,先创建外类对象再访问;

    内类方法访问内类静态成员用:类名.属性名

4、局部内部类

  1. 定义在外类方法中的类;
  2. 不能加访问修饰符(public,private等);
  3. 含内类方法为非静态,可直接访问外类私有属性;
  4. 在测试类中使用内类方法:
    • 在外类含有内类的方法中创建内类对象,并调用内类方法;
    • 在测试类中创建外类对象,并调用含内类的方法。
  5. 内类不能包含静态成员,可有静态常量。

5、匿名内部类

  1. 没有类名的局部内部类(特征和局部内部类同);

  2. 必须继承一个父类或实现一个接口时用;

  3. 在类中创建匿名内部类(和局部内部类类似),创建方法稍有不同:

    设接口为Usb:(可以是接口、父类、或抽象类

    Usb usb = new Usb(){重写接口方法}
    

6、Object类

  1. getClass()

    • 对象.getClass();
    • 返回对象的类型;
  2. hashCode()

    • 对象.hashCode();
    • 返回对象的哈希码值(int类型)(根据对象地址值计算出来的);
  3. toString()

    • 对象.toString();
    • 返回对象的字符串形式,不过没有什么意义;
    • 通常会对其重写来返回类中的属性值。
  4. equals()

    • 对象.equals(对象),比较两个对象地址值是否相同;
    • 字符串的比较也是用的equals方法,比较的是值
    • 可对其重写来比较值;
    • 对象.instanceof.类型,可以判断对象是否属于某种类型。
  5. finalize();

    • 垃圾回收,且是JVM调用的方法;
  • 可对其进行重写;
    • 手动回收:System.gc(),其实只是通知JVM执行垃圾回收。

7、包装类

  1. 装箱:基本类型—>引用类型

    • int num;
      //第一种
      Integer in = new Integer(num);
      //第二种
      Integer in = Integer.valueOf(num);
      //第三种,自动装箱
      Integer in = num; //其实是程序自动使用了第二种方法
      
  2. 拆箱:引用类型—>基本类型

    • Integer in;
      //第一种
      int num = in.intValue();
      //第二种,自动拆箱
      int num = in;
      
  3. parseXXX()静态方法

    • 基本类型转字符串

      int n = 10;
      //第一种
      n+"";
      //第二种
      Integer.toString(n);
      
    • 字符串转基本类型

      String str = "150";
      Integer.parseInt(str);
      
    • 字符串转布尔值

      只要字符串不是true,都转为false。

      String str = "ddd";
      Boolean b = parseBollean(str);//结果为false
      
  4. 整数转Integer类型时,整数在-128到127时判断两数是否相等,为true,否则为false

    原因是:在转换时会先在堆内创建一个数组,内部为-128到127,如果数字在其中,就直接转换;

    ​ **如果不在就new一个新的空间。

8、String类

  1. 字符串是常量,创建后不可改变

    字符串字面值存在字符串池中,可共享,字符串池在方法区中

    String str = "zhangsan";
    str = "lisi";     //并不是把zhangsan这个字符串替换掉,而是在字符串池中重新开辟了一块空间存放lisi,str存放lisi的地址;
    
    String str1 = new String("wangwu"); 
    //这样也是可以创建字符串,但是会创建两个对象,堆和字符串池中都有;
    //str1存储堆中对象的地址,堆不存储值,堆对象指向字符串池对象,数值存储在字符串池中。
    
  2. length()

    • str.length();
    • 返回字符串的长度。
  3. charAt()

    • str.charAt(5);
    • 返回字符串第6个位置的字符。
  4. contains()

    • str.contains("ssss");
    • 判断字符串中是否包含ssss,返回Boolean。
  5. toCharArray()

    • str.toCharArrary();
    • 返回字符串对应的数组。
  6. indexOf()

    • str.indexOf("sss",5);
    • 返回从第6个字符开始查找sss第一次出现的位置。
  7. lastIndexOf()

    • str.lastIndexOf("ddd");
    • 返回最后一次ddd出现的位置。
  8. trim()

    • str.trim();
    • 去掉字符串前后的空格。
  9. toUpperCase()

    • str.toUpperCase();
    • 小写字母转大写。
  10. toLowerCase()

    • 大写字母转小写。
  11. replace()

    • str.replace("ss","dd");
    • 用dd替换掉ss。

9、StringBuffer类和StirngBuilder类

  1. 两个类就执行快慢和安全程度不同。
  2. 单线程尽量用stringBuilder,速度快,但是不安全。
  3. 常用类:(StringBuffer sb = new StringBuffer())
    • sb.append("dffdd"):在sb中追加dffdd;
    • sb.insert(2,"zhang"):在第三个位置插入zhang;
    • sb.replace(0,5,"hell"):用hell替换掉前五个字符;
    • sb.delete(0,5):删除前五个数据。

10、BigDecimal类

  1. 主要是为了提高算数时的精度;

    BigDecimal()括号中放字符串类型的数据。

    		BigDecimal bd1 = new BigDecimal("1.0");
            BigDecimal bd2 = new BigDecimal("0.9");
            //减
            BigDecimal sd3 = bd1.subtract(bd2);
            //加
            BigDecimal sd4 = bd1.add(bd2);
            //乘
            BigDecimal sd5 = bd1.multiply(bd2);
            //除
            BigDecimal sd = bd1.divide(bd2,2,BigDecimal.ROUND_HALF_UP);
    

11、Date类

  1. 		Date d1 = new Date();
            Date d2 = new Date(d1.getTime()-60*60*24*1000);
            //获取今天的时间(toLocaleString()方法已过时)
            System.out.println(d2.toLocaleString());
            System.out.println(d1.toLocaleString());
            //比较时间
            boolean aa = d1.after(d2);
            boolean bb = d1.before(d2);
            System.out.println(aa);
            System.out.println(bb);
            //比较时间,返回0,1,-1
            int i = d1.compareTo(d2);
            //比较是否相等
            boolean equals = d1.equals(d2);
    

12、Calendar类

//因为Calendar构造方法是protected修饰,所以不能直接创建对象
        Calendar c1 = Calendar.getInstance();
        //获取当前时间
        Date time1 = c1.getTime();
        System.out.println(time1.toLocaleString());
        //年
        int year = c1.get(1);
        //月
        int month = c1.get(Calendar.MONTH);
        System.out.println(year);
        System.out.println(month+1);//月的计数是从0开始的

        //修改时间
        Calendar c2 = Calendar.getInstance();
        c2.add(Calendar.YEAR,4);
        System.out.println(c2.getTime().toLocaleString());

		//获取最大最小数值
        System.out.println(c2.getMaximum(Calendar.DAY_OF_MONTH));//这个计算月份是从1开始的
        System.out.println(c2.getMinimum(Calendar.DAY_OF_MONTH));
结果为:
    2021年2月20日 下午5:46:48
	2021
	2
	2025年2月20日 下午5:46:48
    31
	1

13、SimpleDateFormat类

  • 日期转字符串和字符串转日期

    		//y:年,M:月,d:日;h:时,m:分,s:秒。
            //日期转字符串
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd hh:mm:ss") ;
            Date date = new Date();
            System.out.println(sdf.format(date));
            //字符串转日期
            Date date2 = sdf.parse("2020/05/09 21:49:20");
            System.out.println(date2);
    
    2021/02/20 10:27:37
    Sat May 09 21:49:20 CST 2020
    

14、System类

  1. 用于获取系统属性数据和其它操作
  2. 构造方法私有,所以方法可以用类名.方法名的方式调用
		//arraycopy() 复制数组
        int[] arr1 = {2,3,6,7,4,9};
        int[] arr2 = new int[6];
        System.arraycopy(arr1,1,arr2,0,5);
        for (int i = 0; i < arr2.length; i++) {
            System.out.print(arr2[i]+" ");
        }
        System.out.println();
        System.out.println("---------------------");

        //currentTimeMillis()获取从1970年1月1日到现在的毫秒数
        System.out.println(System.currentTimeMillis());
        long start = System.currentTimeMillis();
        for (int i = 0; i <1000 ; i++) {
            for (int j = 0; j <1000 ; j++) {
                int sum = i+j;
            }
        }
        long end = System.currentTimeMillis();
        System.out.println("用时:"+(end - start));

        //exit(0),0表示正常退出JVM
        System.exit(0);
        System.out.println("JVM程序退出");
		

		//gc(),提醒JVM回收垃圾
3 6 7 4 9 0 
---------------------
1613830941685
用时:6
posted @ 2021-02-20 22:36  一个菜菜的boy  阅读(84)  评论(0)    收藏  举报