1.jdk和jre的区别
JRE:Java Runtime Environment Java运行时的环境,包含jvm 和一些Java的基础类库
JDK:Java Development Kit:Java开发工具包, 包含jre,还有Java源码编译器javac,和其他的Java程序调试和分析的工具等等
2.==和equals的区别:
-
1.就==号而言:
1.如果是基本数据类型比较的是值是否相等
2.引用数据类型,比较的时候两个对象的地址值是否相等
2.equals方法:
Object类中equeal方法比较的是两个对象的地址值,如果想比较两个对象的内容
就必须重写equals方法:String类就重写了equals方法,所以比较的是两个对象的内容如何重写equals方法比较两个对象的内容 public class User { private String username;//用户名 private Integer age;//年龄 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } //重写equals方法 public boolean equals(Object obj){ //1.判断地址值 if(obj==this){ return true; } //2.判断obj是否为null if(obj==null){ return false; } //3.判断内容是否相同 if (obj instanceof User) { User user = (User) obj; //3.1判断年龄 if(this.age!=user.getAge()){ return false; } //3.2判断用户名 if(username==null){ if(user.getUsername()!=null){ return false; } }else if(!username.equals(user.getUsername())){ return false; } } //否则返回true return true; } }
3.两个对象的 hashCode()相同,则 equals()也一定为 true?为什么重写了equals方法一定要重写hashCode方法吗?
-
1.Java关于hashCode和equals有一个规范:
1.如果obj1.equals(obj2)返回结果是true,则hashCode一定相同
2.如果obj1.equals(obj2)返回结果为false,则hashCode一定不同,
所以:两个对象的 hashCode()相同,则 equals()也一定为 true?是错误的
hashCode是基于散列数据的快速存取,比如HashSet/HashMap/Hahstable,在存取数据的时候,都是
利用hashCode来判断元素是否相同 -
2.equals方法,在Object类中是比较两个对象的地址值是否相同,如果想比较两个对象的内容是否相同
即必须和String类一样重写equals方法,
2.1如果是单纯的想比较两个对象的内容是否相同,重写hashCode没有必要
2.2如果要把这个对象放入集合中HashSet/HashMap/Hashtable中,就必须要重写hashCode方法:
原因:因为在一个上面三个集合中存储数据的时候都是不允许重复的,如果添加一个对象到集合中
会进行对比,集合中是否有这个对象存在,如果单独只采用equals方法,会和集合中的每一个对象(中的每一个)
属性进行一一比对,如果集合中元素一旦过多,这样效率非常低下,所以,集合采用的是hashCode进行比对:
可以这样理解:HashCode是通过一个对象的地址(进过hash算法计算得来的)一个整数,放在每一个对象地址的头部
这样:在往集合中添加数据的时候,就不需要取比对每一个对象的内容了,会先直接对比hashCode是否相同,来判断
是否重复(因为Java有这样以下两点的规范):
1.如果obj1.equals(obj2)返回结果是true,则hashCode一定相同
2.如果obj1.equals(obj2)返回结果为false,则hashCode一定不同,
总结:如果单独比较两个对象的值,重写equals方法就好了,如果要放入集合就必须重写hashCode()方法
4.final 在 java 中有什么作用?
1.修饰类:该类不能被继承
2.修饰成员变量:该变量是一个常量,必须赋初始值
3.修饰方法:该方法不能被重写
5.java 中的 Math.round(-1.5) Math.floor(-1.4) Math.ceil(-1.7) 等于多少?
Math.round(-1.5): round四舍五入的意思:结果为 -1
Math.floor(-1.4):floor 地板的意思,取最小值 结果为 -2
Math.ceil(-1.7):ceil 天花板的意思,取最大值,结果为 -1
6.Java中操作字符串对象的有几种,有什么区别:
String类:是fianl修饰的类,是不可变内,长度和内容都不可变
StringBuffer:可变类,线程安全的,内部的所有方法都加上synchronized
StringBuilder:线程不安全的,可变类
效率:StringBuilder>StringBuffer>String
安全:StringBuffer>StringBuilder>String
如果需要频繁操作字符串,就用StringBuffer/StringBuilder 否则还是用String
7.String str="i"与 String str=new String(“i”)一样吗?
1.String str=“i”:会创建一个或者零个对象
当字符串常量池中没有"i",会创建一个对象,如果字符串常量池中有"i"字符串,会把地址值指向给str变量不会创建对象
2.String str=new String(“i”):会创建一个或者两个对象
当字符串常量池中没有"i"会创建两个对象,new 一个,"i"字符串一个;如果常量池中有"i"字符串只会创建一个new String()
8.如何将字符串进行反转?
调用StringBuffer中的reverse方法
new StringBuffer(s).reverse().toString();
9.抽象类必须要有抽象方法吗,能使用 final 修饰吗?
1.抽象(abstract)类可以有抽象方法,也可以有非抽象方法,所有不一定
反过来说,一个类中有抽象方法,该类一定是抽象类.
2.不能用final修饰,
因为抽象类本身就不是实列化,是通过多态的方式子类实列化父类,如果用final修饰
该抽象类就不能有子类,也就不能被实列化,所有不能用final修饰
10.接口和抽象类有什么区别?
1.修饰符区别:
接口:Interface
抽象类:abstract class
2.成员变量区别:
接口:必须是常量:默认修饰符 public static final
抽象类:可以是常量,也可以是变量
3.构造方法:
接口:没有构造方法:
抽象类:构造方法是用于子类实列化父类,进行参数传递的
4.成员方法:
接口:都是抽象方法:默认修饰符public abstract
抽象类:可以是抽象方法,也可以是非抽象方法
Java核心概念详解

本文深入解析Java中的关键概念,包括JDK与JRE的区别、==与equals的运用、hashCode与equals的关系、final的作用、数学运算函数、字符串操作、抽象类与final修饰、接口与抽象类的对比等,为Java开发者提供全面的技术指南。

被折叠的 条评论
为什么被折叠?



