java面试宝典
- 前言
- java基础
-
- 什么是面向对象/li>
- 值传递和引用传递
- ==和equals的区别是什么/li>
- 重载和重写的区别/li>
- 抽象类和接口的区别 *
- 构造器 Constructor 是否可被 override/li>
- java静态变量、代码块、和静态方法的执行顺序是什么/li>
- break ,continue ,return 的区别及作用/li>
- final和finally以及finalize区别/li>
- 谈谈你对多态的理解 *
- 对象的序列化和反序列化
- 简述java继承
- JDK和JRE的区别/li>
- 两个对象的 hashCode()相同,则 equals()也一定为 true,对吗/li>
- 什么是反射机制/li>
- 反射机制优缺点
- String 属于基础的数据类型吗/li>
- 是否可以继承String类/li>
- java 中操作字符串都有哪些类们之间有什么区别/li>
- **如何将字符串反转*
- String 类的常用方法都有那些/li>
- 抽象类和普通类的区别/li>
- **java 中 IO 流分为几种* *
- BIO、NIO、AIO 有什么区别/li>
- 14.Files的常用方法都有哪些/li>
- java集合哪些/li>
- 在使用foreach循环遍历集合元素时能否添加或删除元素/li>
- **Collection 和 Collections 有什么区别*
- List、Set、Map 之间的区别是什么/li>
- HashMap 和 Hashtable 有什么区别/li>
- 如何决定使用 HashMap 还是 TreeMap
- HashMap实现原理
- 说一下 HashSet 的实现原理/li>
- ArrayList 和 LinkedList 的区别是什么/li>
- 如何实现数组和 List 之间的转换/li>
- ArrayList 和 Vector 的区别是什么/li>
- Array 和 ArrayList 有何区别/li>
- **在 Queue 中 poll()和 remove()有什么区别*
- **迭代器 Iterator 是什么*
- Iterator 怎么使用什么特点/li>
- Iterator 和 ListIterator 有什么区别/li>
- final的作用/li>
- Java中的异常体系
- HashCode和equals
- ConcurrentHashMap原理
- 设计模式有哪些原则/li>
- 设计模式有哪些分类/li>
- JVM
-
- 什么是字节码,采用字节码的好处/li>
- 为什么要进行年龄分代/li>
- Minor GC、Major GC、Full GC区别及触发条件
- java类加载器有哪些/li>
- 双亲委派模型
- 说一下 JVM 运行时数据区 ***
- jvm主要参数
- 浅复制和深复制的区别/li>
- 简单描述一下垃圾回收机制 *
- java中的引用类型有哪些/li>
- 怎么判断对象是否可以被回收*
- 说一下 JVM 有哪些垃圾回收算法
- 描述一下JVM加载Class文件的原理机制
- 说一下类装载的执行过程
- 说一下 JVM 调优的工具/li>
- java多线程
-
- 说说你对线程优先级理解 *
- Java中的锁有什么作用哪些分类/li>
- 讲一讲线程中断
- 线程安全的集合有哪些程不安全的呢/li>
- 多线程运行原理
- 使用while(true)时如何防止cpu100%空转
- 如何合理的终止一个线程
- 如何设置一个守护进程 *
- 什么是临界区/li>
- 线程的变量安全分析
- 线程安全类的方法组合是否线程安全/li>
- 不可变类有什么特性/li>
- 什么是java对象头/li>
- 什么是Monitor/li>
- synchronized使用放锁的时机
- java虚拟机对synchronized如何进行优化/li>
- unpark和park原理
- Java锁优化的思路和方法
- 如何定位死锁/li>
- volatile 原理
- 说说你对CAS的理解
- 如何解决ABA问题/li>
- sleep() wait() join() yield()的区别
- 对线程安全的理解
- 线程和进程的区别/li>
- Thread和Runable的区别
- ThreadLocal如何解决内存泄漏/li>
- 为什么使用线程池,有什么好处/li>
- 简述线程池的处理流程
- 线程池中阻塞队列的作用什么不是普通队列/li>
- 线程池线程复用原理
- 守护线程的作用是什么/li>
- 创建线程有哪几种方式/li>
- 说一下 runnable 和 callable 有什么区别/li>
- 线程有哪些状态/li>
- sleep() 和 wait() 有什么区别/li>
- notify()和 notifyAll()有什么区别/li>
- 线程的 run()和 start()有什么区别/li>
- 并发三大特性
- JUC包下的常用线程池
- JUC下的线程同步辅助工具类
- 线程池都有哪些状态/li>
- **线程池中 submit()和 execute()方法有什么区别*
- 在 java 程序中怎么保证多线程的运行安全/li>
- **多线程锁的升级原理是什么*
- 什么是死锁/li>
- 怎么防止死锁/li>
- ThreadLocal的原理和便用场景
- 说一下 synchronized 底层实现原理/li>
- synchronized 和 volatile 的区别是什么/li>
- synchronized 和 Lock 有什么区别/li>
- synchronized 和 ReentrantLock 区别是什么/li>
- 说一下 atomic 的原理/li>
- Wbe阶段
-
- http请求分为哪几个部分
- HTTPS是什么/li>
- 简述HTTPS的加密流程
- 简述HTTP的传输流程
- TCP和UDP的区别
- http三次挥手过程
- http四次挥手过程
- tcp 为什么要三次握手,两次不行吗什么/li>
- 说一下 jsp 的 4 种作用域/li>
- session 和 cookie 有什么区别/li>
- 说一下 session 的工作原理/li>
- 如果客户端禁止 cookie 能实现 session 还能用吗/li>
- http 响应码 301 和 302 代表的是什么什么区别/li>
- forward 和 redirect 的区别/li>
- 简述 tcp 和 udp的区别/li>
- OSI 的七层模型都有哪些/li>
- get 和 post 请求有哪些区别
- 如何实现跨域/li>
- **如何避免 sql 注入*
- SSM和springBoot
-
- SpringBoot运行项目的几种方式/li>
- SpringBoot配置加载顺序
- 为什么要使用 spring/li>
- 说说你对Aop的理解
- 说说你对IOC的理解
- 如和实现一个IOC容器/li>
- BeanFactory和ApplicationContext区别
- spring 有哪些主要模块/li>
- spring 常用的注入方式有哪些/li>
- spring 中的 bean 是线程安全的吗/li>
- @Autowired和@Resource区别
- spring bean 支持的作用域有哪些/li>
- spring 自动装配 bean 有哪些方式/li>
- spring 事务实现方式有哪些/li>
- 说一下 spring mvc 运行流程/li>
- spring mvc 有哪些组件/li>
- @RequestMapping 的作用是什么/li>
- spring中的Bean是线程安全的么/li>
- spring-bean的生命周期
- spring框架中都用到了那些设计模式/li>
- Spring事务的实现方式和原理以及隔离级别/li>
- spring事务的传播机制
- spring事务失效
- spring bean自动装配方式
- spring mvc 和 struts 的区别是什么/li>
- spring boot ,springMVC,Spring有什么区别
- springBoot和SpringCloud的区别/li>
- springmvc常用注解
- springMVC主要组件
- springBoot自动配置原理
- 如何理解springBoot的starter/li>
- 什么是嵌入式服务器什么要使用嵌入式服务器/li>
- Mybatis-Plus条件构造器
- mybatis的优缺点
- mybatis执行流程
- mybatis和Hibernate的对比
- mybatis ${ }和#{ }区别
- Mybatis 动态sql有什么用哪些动态sql/li>
- mybatis插件运行原理
- springCloud有哪些技术*
- springCloud分布式事务流程 *
- 十杯水其中一杯有毒如何快速找出
- springBoot定时任务 *
- 微服务调用流程:
- MYSQL
-
- char和varchar区别
- 如何新增一个字段/li>
- 主键递增问题
- UNION和UNION ALL的区别
- MySQL一张表最多能存多少数据/li>
- SQL锁的优化策略
- MYSQL如何实现去重 *
- mysql 的内连接、左连接、右连接有什么区别/li>
- 说一下数据库的三大范式
- 非聚簇索引一定会回表查询吗/li>
- 索引基本原理
- MySQL聚簇索引和非聚簇索引
- MYSQL索引的数据结构各自优势
- 索引设计原则
- mysql索引失效场景
- MySQL锁的分类
- mysql执行计划怎么查看
- 事务的四大特性
- 事务的隔离级别 *
- 事务的五种状态
- 统计过慢查询么慢查询怎么优化/li>
- ACID通过什么保证的/li>
- 什么是 MVCC /li>
- mysql主从同步原理
- 简述MylSAM和InnoDB的区别
- 简述mysql中索引类型及对数据库的性能的影响
- Redis
-
- 简单讲讲Redis的含义
- redis key存储的最大长度
- Redis最适合的场景/li>
- RDB和AOF
- Redis键过期删除策略
- Redis线程模型、单线程快的原因
- Redis缓存异常
- 缓存穿透和缓存击穿的区别
- Redis的内存淘汰策略有哪些
- Redis的内存用完了会发生什么/li>
- Redis如何做内存优化/li>
- 为什么要用 Redis 而不用 map/guava 做缓存/li>
- Redis有哪些数据类型
- Redis事务
- Redis集群会有写操作丢失吗什么/li>
- Redis集群之间是如何复制的/li>
- Redis集群最大节点个数是多少/li>
- Redis集群如何选择数据库/li>
- Redis 哨兵模式
- Redis实现分布式锁
- 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来/li>
- 使用Redis做过异步队列吗,是如何实现的
- Redis回收进程如何工作的/li>
- git常用命令
- linux常用命令
前言
面试不但要有工作经验,还得会点八股文,不然别人问起来,答不上来也是异常的尴尬,特别是应届毕业生,也是需要背点八股文,注重基础知识,才能在面试中得心应手,以下是我收集的面试题,以及我个人遇到的一些问题,做一些总结希望能帮助到大家。打了 * 的都是我个人真实遇到过的。 答案只做参考,不喜勿喷,因为什么问题都没有标准的答案,只有你真正的明白了这个问题,你才能毫不费劲给别说出来。
java基础
什么是面向对象/h2>
面向对象是模型化的,你只需抽象出一个类,这是一个抽象模板,在这里你拥有数据也拥有解决问题的方法。我们只需要操作这个对象,就可以使用里面的数据和方法。
面向对象的三大特征:封装,继承,多态
封装:在于明确标识出允许外部使用的所有成员函数和数据项,内部细节对外部隐藏,外部无需修改或者关心内部实现。对内部数据进行保护。
继承:继承父类的方法,子类和父类公用一些方法和属性,可以达到功能的扩展和代码复用。
多态:基于对象所属类不同,外部对同一个方法的调用,实际执行逻辑不同。继承特点:方法重写,父类引用指向子类对象,编译看左边,运行看右边
值传递和引用传递
Java中都是值传递
参数类型
-
形参:方法被调用时需要传递进来的参数,如:func(int a)中的a,它只有在func被调用期间a才有意义,也就是会被分配内存空间,在方法fun执行完成后, a 就会被销毁释放空间,也就是不存在了
-
实参:方法被调用时是传入的实际值,它在方法被调用前就已经被初始化并旦在方法被调用时传入。
值传递与引用传递
-
值传递:在方法被调用时,实参通过形参把它的内容副本传入方法内部,此时形参接收到的内容是实参值的一个拷贝,因此在方法内对形参的任何操作,都仅仅是对这个副本的操作,不影响原始值的内容。值传递传递的是真实内容的一个副本,对副本的操作不影响原内容,也就是形参怎么变化,不会影响实参对应的内容。
-
引用传递:”引用”也就是指向真实内容的地址值,在方法调用时,实参的地址通过方法调用被传递给相应的形参,在方法体内,形参和实参指向同一块内存地址,对形参的操作会影响的真实内容。(java中只有值传递)
Java中都是值传递
Object类型,除了这种不可变的类以外,你传到另外一个方法中去修改其里面的属性时,原有的对象中的值也会发生,原因是形参拷贝了实参的地址作为副本,他们俩共用一个地址,所以会改掉堆中的那个对象中的属性值 (叫传递引用)
传递值
当我们用这种基本数据类型、不可变类型( String, Integer,Long)之类的做形参, 他们的实参值不会改变
==和equals的区别是什么/h2>
什么是==/strong>
== 等于比较运算符,如果进行比较的两个操作数都是数值类型,即使他们的数据类型不相同,只要他们的值相等,也都将返回true.如果两个操作数都是引用类型,那么只有当两个引用变量的类型具有父子关系时才可以比较,而且这两个引用必须指向同一个对象,才会返回true.(在这里我们可以理解成==比较的是两个变量的内存地址)
什么是equals()/strong>
equals()方法是Object类的方法,在Object类中的equals()方法体内实际上返回的就是使用==进行比较的结果.但是我们知道所有的类都继承Object,而且Object中的equals()方法没有使用final关键字修饰,那么当我们使用equals()方法进行比较的时候,我们需要关注的就是这个类有没有重写Object中的equals()方法. 如果重写了equals方法就按照自己的重写的规则进行比较,如果没有重写就继承自Object类的equals方法进行比较内存地址(只有引用类型的对象才可以调用equals方法)。
重载和重写的区别/h2>
1.重写(Override)
重写就是重新写一遍的意思。其实就是在子类中把父类本身有的方法重新写一遍。子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。 方法重写又叫方法覆盖。
重写总结:
1.发生在父类与子类之间
2.方法名,参数列表,返回类型(除过子类中方法的返回类型是父类中返回类型的子类)必须相同
3.访问修饰符的限制一定要大于被重写方法的访问修饰符(public>protected>default>private)
4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
5.父类的静态方法是不能被重写的。
2.重载(Overload)
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。
重载总结:
1.重载Overload是一个类中多态性的一种表现
2.重载要求同名方法的参数列表不同(参数类型,参数个数甚至是参数顺序)
3.重载的时候,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准
区别总结:
1、重写实现的是运行时的多态,而重载实现的是编译时的多态。
2、重写的方法参数列表必须相同;而重载的方法参数列表必须不同。
3、重写的方法的返回值类型只能是父类类型或者父类类型的子类,而重载的方法对返回值类型没有要求。
4、重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常,重载不做限制
5、重写对访问修饰符的限制一定要大于等于被重写方法的访问修饰符,重载不做限制
抽象类和接口的区别 *
类型 | abstract class | Interface |
---|---|---|
定义 | abstract class关键字 | Interface关键字 |
继承 | 抽象类只可以继承一个类 | 接口可以继承接口(一个或多个接口) |
访问修饰符 | 抽象方法可以有public、protected和default这些修饰符 | 接口方法默认修饰符是public。你不可以使用其它修饰符 |
方法实现 | 可定义构造方法,可以有抽象方法和具体方法,可以没有抽象方法,但是抽象方法只能再抽象类中 | 接口完全是抽象的,没构造方法,且方法都是抽象的,不存在方法的实现jdk8后有默认实现 |
作用 | 抽象类是对一种事物的抽象 | 接口是对行为的抽象 |
成员变量 | 抽象类中可以有成员变量 | public static final修饰的常量 |
抽象类是对一种事物的抽象,即对类抽象,而接口是对行为的抽象。抽象类是对整个类整体进行抽象,包括属性、行为,但是接口却是对类行为进行抽象。
构造器 Constructor 是否可被 override/h2>
构造器不能被@Override(重写),构造器只能被overload(重载)。
java静态变量、代码块、和静态方法的执行顺序是什么/h2>
基本上代码块分为三种:Static静态代码块、构造代码块、普通代码块
代码块执行顺序静态代码块——> 构造代码块 ——> 构造函数——> 普通代码块
继承中代码块执行顺序:父类静态块——>子类静态块——>父类代码块——>父类构造器——>子类代码块——>子类构造器
想要深入了解,可以参考这篇文章 :https://juejin.cn/post/6844903986475040781
break ,continue ,return 的区别及作用/h2>
- break 跳出当前包含break的循环,不再执行循环(结束当前的循环体)
- continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)
- return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)
final和finally以及finalize区别/h2>
final修饰符:可以修饰类、变量、方法,修饰类表示该类不能被继承、修饰方法表示该方法不能被重写、
修饰变量表示该变量是一个常量不能被重新赋值;
finally代码块中:一般作用在try-catch代码块中,在处理异常时通常将一定要执行的代码方法放在finally代码块中,表示不管是否出现异常,该代码块都会执行,一般用来存放一些关闭资源的代码。
注:有些情况不会执行finally
- 只有与finally对应的try语句块得到执行的情况下,finally语句块才会执行。如果在执行try语句块之前已经返回或抛出异常,那么try对应的finally语句并没有执行
- 我们在try语句块中执行了System.exit (0) 语句,终止了Java虚拟机的运行;
- 如果在try-catch-finally语句中执行return语句,finally语句在该代码中一定会执行,因为finally用法特殊会撤销之前的return语句,继续执行最后的finally块中的代码;
finalize一个方法:属于所有类的父类Object类的一个方法,也就是说每一个对象都有这么个方法;Java中允许使用finalize()方法在垃圾收集器将对象从内存中清除出去之前做必要的清理工作;调用super.finalize();
这个方法在GC启动该对象被回收的时候被调用。GC可以回收大部分的对象(凡是new出来的对象GC都能搞定,一般情况下我们又不会用new以外的方式去创建对象),所以一般是不需要程序员去实现finalize的。
特殊情况下,需要程序员实现finalize,当对象被回收的时候释放一些资源,比如:一个socket链接,在对象初始化时创建,整个生命周期内有效,那么就需要实现finalize,关闭这个链接。
谈谈你对多态的理解 *
同一个对象,在不同时刻体现出来的不同状态
-
多态的关键是每个子类都要重写方法,实现了继承了同样的方法名称但是又有每个的特点,就像龙生九子,每个不一样,有两个好处,一个是类关系清晰,另一个是方法调用方便,只要有传入实参就行。
多态的实现
Java实现多态有三个必要条件:继承、重写、向上转型。
- 继承:在多态中必须存在有继承关系的子类和父类(实现关系接口)。
- 重写:子类对父类中某些方法进行重新定义,在调用这些方法时就会调用子类的方法。
- 向上转型:在多态中需要将父类或者父接口引用指向子类Fu f= new Zi(),只有这样该引用才能够具备技能调用父类的方法和子类的方法。
只有满足了这三个条件,我们才能够在同一个继承结构中使用统一的逻辑实现代码处理不同的对象,从而达到执行不同的行为。
向上转型
父类对象通过子类对象去实例化,实际上就是对象的向上转型。向上转型是不需要进行强制类型转换的,但是向上转型会丢失精度。
向下转型
所谓向下转型,也就是说父类的对象可以转换为子类对象,但是需要注意的是,这时则必须要进行强制的类型转换。
多态的好处
- 可替换性:多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
- 可扩充性:多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
- 接口性:多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。超类Shape规定了两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如Circle和Sphere为了实现多态,完善或者覆盖这两个接口方法。
- 灵活性:它在应用中体现了灵活多样的操作,提高了使用效率。
- 简化性:多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
对象的序列化和反序列化
-
Serialization(序列化)是一种将对象以一连串的字节描述的过程;反序列化deserialization是一种将这些字节重建成一个对象的过程;
-
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,就使得数据能够被轻松地存储和传输。
-
Java序列化是指把Java对象转换为字节序列的过程;而Java反序列化是指把字节序列恢复为Java对象的过程;
1.序列化是干什么的/strong>
- 简单说就是为了保存在内存中的各种对象的状态,并且可以把保存的对象状态再读出来。虽然你可以用自己的各种方法来保存Object states, 但是Java给你提供一种应该比你自己好的保存对象状态的机制、那就是序列化。
2.什么情况下需要序列化/strong>
- 当你想把的内存中的对象保存到一个文件或者数据库中时候;
- 当你想用套接字在 络上传送对象的时候;
- 当你想通过RMI传输对象的时候(RMI->Remote Method Invocation 远程方法调用)
简述java继承
继承可以降低代码编写的冗余度,提高编程的效率。通过继承,子类获得了父类的成员变量和方法。
**继承的作用:**通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。
Java不支持多重继承,但一个类可以实现多个接口,从而克服单继承的缺点;
构造方法不会被子类继承,但可以从子类中调用父类的构造方法。
子类变量访问顺序:先找局部变量,局部变量就找当前类的成员变量,再找不到就找父类的成员变量
子类无法继承父类中私有的内容(可以继承但是没有访问权限)
可以在子类声明父类已有的方法和属性,从而隐藏父类的属性和方法
子类可以直接使用从父类继承过来的属性和方法,可以使用super关键字调用,也可以隐式调用
继承的优点
1.继承过来的字段和方法,可以像任何其他字段和方法一样被直接使用;
2.在子类中可以声明一个与父类中同名的新字段或静态方法,从而“隐藏”父类中的字段或方法;
3.可以在子类中声明一个在父类中没有的新字段和方法;
4.可以在子类中编写一个父类当中具有相同名的新实例方法,这称为“方法重写”或“方法覆盖”;
5.可以在子类中编写一个调用父类构造方法的子类构造方法,既可以隐式地实现,也可以通过使 用关键字super来实现。
重写父类方法
子类继承了父类中的所有成员及方法,但在某种情况下,子类中该方法所表示的行为与其父类中该方法所表示的行为不完全相同.
当一个子类中的一个实例方法具有与其父类中的一个实例方法相同的名称,相同的参数列表和返回值时,称子类中的方法“重写”了父类的方法。
隐藏父类中的方法
如果一个子类定义了一个静态类方法,而这个类方法与其父类的一个类方法具有相同的签名(指名称、参数格式和类型)和返回值,则称在子类中的这个类方法“隐藏”了父类中的该类方法。
使用super关键字
使用super调用父类中重写的方法、访问父类中被隐藏的字段
当使用无参数的super()时,父类的无参数构造方法就会被调用;
当使用带有参数的super()方法时,父类的有参数构造方法就会被调用。
super 可以调用父类的方法和成员变量
在子类创建对象时会默认调用父类的无参构造方法。
this访问本类的成员,super访问父类的成员
final关键字
final关键字可用于修饰类、变量和方法,它有“无法改变”或者“最终”的含义,因此被final修饰的类、变量和方法将具有以下特性:
final可以修饰类,方法,变量
final修饰的类不可以被继承
final修饰的方法不可以被覆盖
final修饰的变量是一个常量,只能被赋值一次
为什么要用final修饰变量,其实,在程序中如果一个数据是固定的。那么直接使用这个数据就可以了,但是这种阅读性差,所以应该给数据起个名称。而且这个变量名称的值不能变化,所以加上final固定写法规范:常量所有字母都大写,多个单词,中间用_连接。
JDK和JRE的区别/h2>
-
JDK 和 JRE 有什么区别/p>
JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
JDK 和 JRE 有什么区别/p>
JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,java 运行环境,为 java 的运行提供了所需环境。
具体来说 JDK 其实包含了 JRE,同时还包含了编译 java 源码的编译器 javac,还包含了很多 java 程序调试和分析的工具。简单来说:如果你需要运行 java 程序,只需安装 JRE 就可以了,如果你需要编写 java 程序,需要安装 JDK。
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗/h2>
不对,两个对象的 hashCode()相同,equals()不一定 true。
很显然“通话”和“重地”的 hashCode() 相同,然而 equals() 则为 false,因为在散列表中,hashCode()相等即两个键值对的哈希值相等,然而哈希值相等,并不一定能得出键值对相等。
什么是反射机制/h2>
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。
静态编译:在编译时确定类型,绑定对象
动态编译:运行时确定类型,绑定对象
反射机制优缺点
优点: 运行期类型的判断,动态加载类,提高代码灵活度;
缺点: 性能瓶颈:反射相当于一系列解释操作,通知JVM要做的事情,性能比直接的Java代码要慢很多;
String 属于基础的数据类型吗/h2>
不是,String是属于引用数据类型,也就是对象类型。
基本数据类型只有八种:byte、boolean、char、short、int、float、long、double
对应的包装类型:Byte、Short、Integer、Long、Float、Double、Boolean、Character
是否可以继承String类/h2>
String类是final类,不可以被继承。
java 中操作字符串都有哪些类们之间有什么区别/h2>
操作字符串的类有:String、StringBuffer、StringBuilder。
String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!