Java基础知识(2)(hashcode/final/round/String)

1 hashCode()和equals()

euqals()和hashCode()是Obiect类的两个方法,Object类是所有类的父类,所有的对象都实现了Object()类中的方法。

1.1 equals()

Object的原生equals()方法定义是:

public boolean equals(Object obj){
	return (this == obj)
}

就是对对象的地址值进行比较,即比较引用是否相同。而String ,Integer等自行封装了equals()方法,这些方法比较的是内容。
hashCode()与equals():当重写equals()方法的时候,hashCode()也要被重写。相同的对象,他们的hashCode()一定相同。

1.2 hashCode()

该方法是给对象返回一个hashcode值。
Object类中的,hashCode()的定义是:

public native int hashCode();

说明hashCode()方法是一个本地方法,实现与本地机器相关,

String 封装的hashCode()方法:
public int hashCode() {  
int h = hash;  
if (h == 0) {  
    int off = offset;  
    char val[] = value;  
    int len = count;  

    for (int i = 0; i < len; i++) {  
        h = 31 * h + val[off++];  
    }  
    hash = h;  
}  
return h;  
}

对于hashCode:在一个Java应用的执行期间,如果一个对象提供给equals做比较的信息没有被修改的话,该对象多次调用hashCode()方法,该方法必须始终如一返回同一个integer,如果两个对象的equals()相等,hashCode也相同
关于hashCode()与equals()方法有如下规定:
1.两个对象相同,这两个对象的hashCode一定也相同。
2.如果两个对象的hashCode相同,这两个对象并不一定相同。

**为什么重写equals()方法:这在实际开发的过程中在hashmap或者hashset里如果不重写的hashcode和equals方法的话会导致我们存对象的时候,把对象存进去了,取的时候却取不到想要的对象。
1.重写equals()方法是为了保证在发生冲突的shi’hou 取得entry对象。
2.重写ha’shCode是为了保证相同的对象有相同的hashCode

2 final

final修饰的不能被继承,没有子类,final类中的方法默认是final的。
final修饰的方法不能被子类的方法覆盖,但可以被继承。
final修饰的成员变量表示常量,只能被赋值一次,赋值后值不再改变。
final关键字不能用于修饰构造方法
所有基本类型(包括void)的包装类都使用了final修饰,因此我们无法继承它们扩展新的类,也无法重写它们的任何方法。

父类的private成员方法是不能被子类方法覆盖的,因此private类型的方法默认是final类型的。

3 Math.round(-1.5)

Java中math的round()方法就是四舍五入,最简单来说round的值+0.5以后向下取整。

    public static void  main(String[] args){
    System.out.println(Math.round(-1.5));//-1
    System.out.println(Math.round(-1.51));//-2
    System.out.println(Math.round(1.51));//2
    System.out.println(Math.round(1.5));//2
    System.out.println(Math.round(1.49));//1
}

4 java 中操作字符串都有哪些类?它们之间有什么区别?

String、StringBuffer、StringBuilder

String : final修饰,String类的方法都是返回new String。即对String对象的任何改变都不影响到原对象,对字符串的修改操作都会生成新的对象。
StringBuffer : 对字符串的操作的方法都加了synchronized,保证线程安全。
StringBuilder : 不保证线程安全,在方法体内需要进行字符串的修改操作,可以new StringBuilder对象,调用StringBuilder对象的append、replace、delete等方法修改字符串。
String 是不可变的,每次改变都是生成心得String 对象,生成过多无用的对象会造成jvm GC,降低系统性能。
String buffer是可变自字符串,每次结果都会对 StringBuffer 对象本身进行操作,特别是字符串对象经常改变的情况下,使用String buffer
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。

5 String直接赋值和new String的区别

public static void  main(String[] args){
    String str1 = "11";
    String str2 = "11";
    String str3 = new String("11");
    System.out.println("testOne.equals(testOne):  "+ Boolean.valueOf(str1==str2));//true
    System.out.println("testOne.equals(testOne):  "+ Boolean.valueOf(str1==str3));//false
}

简单来说: String str1 = “11”; 直接放入常量池
String str3 = new String(“11”); 创建新的对象,有新的地址

6 Files的常用方法

方法声明 描述
File(String pathname) 通过指定的一个字符串类型的文件路径来创建一个新的File对象
File(String parent , String child) 根据指定的一个字符串类型的父路径和一个字符串类型的子路径(包括文件名称)创建一个File对象
File(File parent , String child) 根据指定的 File 类的父路径和字符串类型的子路径(包括文件名称)创建一个File对象
boolean exists() 判断File对象对应的文件或者目录是否存在若存在则返回true,否则返回false
boolean delete() 删除File对象对应的文件或者目录若成功则返回true,否则返回false
boolean createNewFile() 当File对象对应的文件不存在时,该方法将新建一个此File象所指定的新文件若创建成功则返回true,否则返回false
String getName() 返回File对象表示的文件或文件夹的名称
String getPath() 返回File对象对应的路径
String getAbsolutePath() 返回File对象对应的绝对路径(在UNIX/Linux等系统上,如果路径是以正斜线 / 开始的,则这个路径是绝对路径;在Windows等系统上,如果路径是从盘符开始的,则这个路径是绝对路径)
String getParent() 返回File对象对应目录的父目录,(即返回的目录不包含最后一级子目录)
boolean canRead() 判断File对象对应的文件或者目录是否可读若可读则返回true,反之返回false
boolean canWrite() 判断File对象对应的文件或者目录是否可写。若可写则返回true,反之返回false
boolean isFile() 判断File对象对应的是否是文件(不是目录)若是文件则返回true,反之返回false
boolean isDirectory() 判断File对象对应的是否是目录(不是文件)若是目录则返回true,反之返回false
boolean isAbsolute() 判断File对象对应的文件或者目录是否是绝对路径
long lastModified() 返回1970 年1 月1 日 0 时0 分 0 秒到文件最好修改时间的毫秒值
long length() 返回文件内容长度
String [ ]list() 返回指定目录的全部内容,只列出名称
File[ ] listFiles() 返回一个包含了File对象所有子文件和子目录的File数组
发布了54 篇原创文章 · 获赞 13 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/liutaiyi8/article/details/101224381
今日推荐