Java基础面试题(1-10)

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

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
抽象类:可以是抽象方法,也可以是非抽象方法

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值