Java笔记4(常用类)
只是一些自己认为重点和易错点的笔记
常用类相关笔记
1、内部类
- 一个类内部再定义一个完整的类
 - 内部类可访问外部类的私有成员,不破坏封装
 - 内部类也可编译生成字节码文件
 - 只有内部类可用static修饰,普通类不能用
 - 局部变量属性不加访问修饰符
 
2、成员内部类
- 
和实例变量(属性)、实例方法同级别的类。class 类名
 - 
在测试类中创建内部类的对象:设外类为Out,内部类为In
In in = new Out().new In(); - 
内外类中属性重名,优先访问内部类属性;
要想访问外部类的属性要使用:外部类名.this.属性名;
 - 
内部类中不能定义静态成员,可定义静态常量。
 
3、静态内部类
- 和外部类同级别,用static修饰的成员内部类;
 - 不依赖外部类,应该是说创建内部类对象时不必创建外部类对象;
 
In in = new Out.In();
- 
可包含静态成员;
 - 
内类访问外类成员,先创建外类对象再访问;
内类方法访问内类静态成员用:类名.属性名。
 
4、局部内部类
- 定义在外类方法中的类;
 - 不能加访问修饰符(public,private等);
 - 含内类方法为非静态,可直接访问外类私有属性;
 - 在测试类中使用内类方法:
- 在外类含有内类的方法中创建内类对象,并调用内类方法;
 - 在测试类中创建外类对象,并调用含内类的方法。
 
 - 内类不能包含静态成员,可有静态常量。
 
5、匿名内部类
- 
没有类名的局部内部类(特征和局部内部类同);
 - 
必须继承一个父类或实现一个接口时用;
 - 
在类中创建匿名内部类(和局部内部类类似),创建方法稍有不同:
设接口为Usb:(可以是接口、父类、或抽象类)
Usb usb = new Usb(){重写接口方法} 
6、Object类
- 
getClass()
- 对象.getClass();
 - 返回对象的类型;
 
 - 
hashCode()
- 对象.hashCode();
 - 返回对象的哈希码值(int类型)(根据对象地址值计算出来的);
 
 - 
toString()
- 对象.toString();
 - 返回对象的字符串形式,不过没有什么意义;
 - 通常会对其重写来返回类中的属性值。
 
 - 
equals()
- 对象.equals(对象),比较两个对象地址值是否相同;
 - 字符串的比较也是用的equals方法,比较的是值;
 - 可对其重写来比较值;
 - 对象.instanceof.类型,可以判断对象是否属于某种类型。
 
 - 
finalize();
- 垃圾回收,且是JVM调用的方法;
 
 
- 可对其进行重写;
- 手动回收:System.gc(),其实只是通知JVM执行垃圾回收。
 
 
7、包装类
- 
装箱:基本类型—>引用类型
- 
int num; //第一种 Integer in = new Integer(num); //第二种 Integer in = Integer.valueOf(num); //第三种,自动装箱 Integer in = num; //其实是程序自动使用了第二种方法 
 - 
 - 
拆箱:引用类型—>基本类型
- 
Integer in; //第一种 int num = in.intValue(); //第二种,自动拆箱 int num = in; 
 - 
 - 
parseXXX()静态方法
- 
基本类型转字符串
int n = 10; //第一种 n+""; //第二种 Integer.toString(n); - 
字符串转基本类型
String str = "150"; Integer.parseInt(str); - 
字符串转布尔值
只要字符串不是true,都转为false。
String str = "ddd"; Boolean b = parseBollean(str);//结果为false 
 - 
 - 
整数转Integer类型时,整数在-128到127时判断两数是否相等,为true,否则为false
原因是:在转换时会先在堆内创建一个数组,内部为-128到127,如果数字在其中,就直接转换;
 **如果不在就new一个新的空间。
 
8、String类
- 
字符串是常量,创建后不可改变
字符串字面值存在字符串池中,可共享,字符串池在方法区中
String str = "zhangsan"; str = "lisi"; //并不是把zhangsan这个字符串替换掉,而是在字符串池中重新开辟了一块空间存放lisi,str存放lisi的地址;String str1 = new String("wangwu"); //这样也是可以创建字符串,但是会创建两个对象,堆和字符串池中都有; //str1存储堆中对象的地址,堆不存储值,堆对象指向字符串池对象,数值存储在字符串池中。 - 
length()
- str.length();
 - 返回字符串的长度。
 
 - 
charAt()
- str.charAt(5);
 - 返回字符串第6个位置的字符。
 
 - 
contains()
- str.contains("ssss");
 - 判断字符串中是否包含ssss,返回Boolean。
 
 - 
toCharArray()
- str.toCharArrary();
 - 返回字符串对应的数组。
 
 - 
indexOf()
- str.indexOf("sss",5);
 - 返回从第6个字符开始查找sss第一次出现的位置。
 
 - 
lastIndexOf()
- str.lastIndexOf("ddd");
 - 返回最后一次ddd出现的位置。
 
 - 
trim()
- str.trim();
 - 去掉字符串前后的空格。
 
 - 
toUpperCase()
- str.toUpperCase();
 - 小写字母转大写。
 
 - 
toLowerCase()
- 大写字母转小写。
 
 - 
replace()
- str.replace("ss","dd");
 - 用dd替换掉ss。
 
 
9、StringBuffer类和StirngBuilder类
- 两个类就执行快慢和安全程度不同。
 - 单线程尽量用stringBuilder,速度快,但是不安全。
 - 常用类:(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类
- 
主要是为了提高算数时的精度;
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类
- 
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类
- 用于获取系统属性数据和其它操作
 - 构造方法私有,所以方法可以用类名.方法名的方式调用
 
		//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

                
            
        
浙公网安备 33010602011771号