CoreJava学习第十课-Object类,包装类和String类

一:Object类、常见方法

1.Object类

Object 是Java中所有类的父类。所以:
    Object o = 任何对象
    Object类中的方法[共有11种方法,详情见API文档],是所有Java对象都具有的方法

2.getClass() 

获得对象的实际类型---底层是用反射实现的!

3.finalize() 

内存泄漏:在C/C++中,创建对象后,忘记销毁对象以释放空间,导致可分配空间越来越少,称此为内存泄漏
在对象被垃圾回收的时候, 由垃圾收集器自动调用
什么样的对象称之为垃圾对象 ?  零引用算法
垃圾对象何时被回收?   延时回收策略:当内存资源即将耗尽,不得不回收垃圾时,才会启动垃圾回收
不应该在finalize里执行资源释放,因为等到finalize释放资源会等不知道多久,而有些资源需要用完后就释放,如数据库的连接等。

4.toString()  

public String toString() :   返回对象的字符串形式
打印一个对象,就是打印对象的toString方法的返回值

5.equals()  【自己学会覆盖equals()方法-重要】

public boolean equals(Object o): 判断 this 和 o 内容是否相同
            ==               :判断两个引用是否指向同一对象
        String s1 = new String("abc");
        String s2 = new String("abc");
        System.out.println(s1 == s2);  // false
        System.out.println(s1.equals(s2)); // true
        //String字符串类中已经覆盖了equals方法,所以比较的是内容,而不是引用地址。
public class TestObject {
    public static void main(String[] args) {
        Student s1 = new Student("Xusy",30);
        Student s2 = new Student("Xusy",30);
        System.out.println(s1.equals(s2)); 
    }
}
class Student{
    private String name;
    private int age;
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    //比较 this 和 o 内容是否相同
    public boolean equals(Object o){
        if (this == o) return true;
        if (o == null) return false;
        if (this.getClass() != o.getClass()) return false;
        Student s = (Student)o; 
        //逐个比较属性  基本类型属性用==比较,  对象类型属性用equals比较
        if (this.name .equals( s.name )  &&  this.age == s.age) return true;
        else return false;
    }
}

6.hashCode()

public int hashCode(): 返回对象的哈希码
内容相同的对象,哈希码是相同的。

二:日期处理

import java.util.Calendar;
​
public class TestDate {
    public static void main(String[] args) {
        long time = System.currentTimeMillis();
        System.out.println(time);//返回一个long类型的数,数值是从1970年1月1日0点0时0分到现在的毫秒数
        
        Calendar c = Calendar.getInstance();//获取一个Calendar对象
        c.setTimeInMillis(time);
        
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);//获得月 从0-11月
        int day = c.get(Calendar.DAY_OF_MONTH);
        int weekday = c.get(Calendar.DAY_OF_WEEK);//获得周几 0-6是周日到周六
        int hour = c.get(Calendar.HOUR_OF_DAY);
        int minute = c.get(Calendar.MINUTE);
        int second = c.get(Calendar.SECOND);
        
        System.out.println(year + " 年   "+(month+1) +" 月   "+day+" 日  星期"
                           +((weekday>1)?(weekday-1):"日")+"     "+hour+":"+minute+":"+second);
    }
}
/*打印结果
1533554663753
2018 年   8 月   6 日  星期1     19:24:23
*/

三:BigDecimal 高精度运算,专门做浮点数的加减乘除

import java.math.BigDecimal;
​
public class TestBigDecimal {
    public static void main(String[] args) {
        System.out.println(2.0-1.1);//0.8999999999999999
        
    //一定要写成字符串类型,这样才会做高精度处理,如果传进去浮点数,依然会按照double处理,做不到高精度处理
        BigDecimal b1 = new BigDecimal("2.0");
        BigDecimal b2 = new BigDecimal("1.1");
        BigDecimal b3 = b1.subtract(b2);//0.9
        
        System.out.println(b3); 
    }
}

下面是包装类和String

一:包装类

包装类是为了把基本类型包装成对象类型,从而能被 Object 类型统一管理
    ① 包装类使得Object对Java中所有类型一统天下
    ② 可以区分0和null
    【以学生考试统计分数为例:如果学生没有考试,则成绩应该为 null ,考试了就会有 0 - 100 的成绩。
    如果用包装类 Integer 存成绩,就满足要求; int 默认值为 0 ,没有 null 。
    所以开发中推荐属性定义成包装类。】

二:基本类型与包装类型

基本类型            包装类型
byte                Byte
short               Short
int                 Integer
long                Long
float               Float
double              Double
char                Character
boolean             Boolean

1.基本类型-->包装类

① 构造方法
② 静态的valueOf(8种基本类型)

//以int ---> Integer 为例
int value = 10;
Integer ii1 = new Integer(10);
Integer ii2 = Integer.valueOf(10);//优先使用

2.包装类-->基本类型

xxxValue()

Integer ii2 = Integer.valueOf(10);
//Integer --> int
int v = ii2.intValue();

3.JDK5.0后提供了自动的装箱和拆箱

编译器自动转换类型
Object o = 10;   //Object o = Integer.valueOf(10);
Integer ii = 10; //Integer ii = Integer.valueOf(10);
int i = ii;     //int i = ii.intValue();

4.String <--> 基本类型[重点]

基本类型 --> String
    ① +" "
    ② 静态的valueOf()方法
    
    int i1 =10;
    String s1 = i1 + " ";// +" "
    String s2 = String.valueOf(i1);//静态的valueOf()方法
    System.out.println(s1.getClass());//打印结果:class java.lang.String
​
String --> 基本类型
    包装类中静态 parseXXX(String s) xxx为基本类型
    例如 Integer.parseInt(String s)
    
    int i2 = Integer.parseInt(s2);
    System.out.println(i2-2);//打印 8 (10-2=8)

三:String

1.常见方法

[重点] char charAt(int index)                 返回指定索引处的 char 值。 
[重点] int length()                           返回此字符串的长度。 
[重点] int compareTo(String anotherString)     按字典顺序比较两个字符串。 
[重点] boolean equals(Object anObject)         将此字符串与指定的对象比较。 
[重点] String[] split(String regex) 根据给定正则表达式的匹配拆分此字符串。 
[重点] String substring(int beginIndex, int endIndex) 返回一个新字符串,它是此字符串的一个子字符串。 
​
int indexOf(int ch)                          返回指定字符在此字符串中第一次出现处的索引。 
int indexOf(int ch, int fromIndex)   返回在此字符串中第一次出现指定字符处的索引,从指定的索引开始搜索。 
String toLowerCase()               使用默认语言环境的规则将此 String 中的所有字符都转换为小写。 
String toUpperCase()               使用默认语言环境的规则将此 String 中的所有字符都转换为大写。 
int lastIndexOf(String str)         返回指定子字符串在此字符串中最右边出现处的索引。 
String replace(CharSequence target, CharSequence replacement) 
                                使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。 
int compareToIgnoreCase(String str)           按字典顺序比较两个字符串,不考虑大小写。 
String concat(String str)                    将指定字符串连接到此字符串的结尾。 
boolean contains(CharSequence s)              当且仅当此字符串包含指定的 char 值序列时,返回 true 
boolean endsWith(String suffix)               测试此字符串是否以指定的后缀结束。 
boolean startsWith(String prefix)             测试此字符串是否以指定的前缀开始。 
boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写。 
String trim()                     返回字符串的副本,忽略前导空白和尾部空白。 

2.CharSequence:字符序列接口

-String 不可变的字符序列
        ① 字符串长度不可变
            String s1 = new String("abc");
            String s2 = s1;
            s2 += "def";
            System.out.println(s1);//abc
            System.out.println(s2);//abcdef 实际上是又创建一个字符串abcdef存在s2引用中
        ② 字符串所有的方法都不会修改原字符串对象的内容
串池技术:串池是逻辑上的空间,不一样真的存在物理空间。
        a 所有字面值形式的字符串默认进串池
        b 调用intern()方法
            String s1 = "abc";
            String s2 = "abc";//s2发现串池中有abc字符串时,就把s2引用指向abc
        
            String s3 = new String("abc");
            String s4 = new String("abc");
        
            System.out.println(s1 == s2);//true  s1,s2指向串池中的同一个对象 
            System.out.println(s3 == s4);//false s3,s4是两个对象,两块内存空间
​
            s3 = s3.intern();//intern()是尝试把s3放进串池中,意思是当串池中没有abc时,就把abc放进串池。
            System.out.println(s1 == s3);//true
-StringBuilder 可变的字符序列
    String s = "abc";
    StringBuilder sb = new StringBuilder(s);
    String str = sb.toString();//把StringBuilder转成String
-StringBuffer 线程安全的可变字符序列。
            
 

 


你可能感兴趣的:(CoreJava学习)