
面试题-java基础
面试题-java基础
啥也不懂的派大星
这个作者很懒,什么都没留下…
展开
-
自定义注解
1,注解是在编译期生效还是运行期生效?两者都存在2,有没有在编译期生效的注解?@Override3,编译期生效的注解和运行期生效的注解有什么区别?我们的分析如下:首先,第一个问题是给面试者挖坑,两者都存在,关键看注解的定义描述;其次,第二个问题是有,比如我们JDK默认提供注解@Override我们观察其注解的定义如下}@Target(ElementType.METHOD) :表示该注解可以放到方法的定义上。原创 2021-04-14 10:39:56 · 301 阅读 · 0 评论 -
原型模式,深克隆和浅克隆的区别是什么?
原型模式,深拷贝和浅拷贝的区别是什么?深拷贝:除了对象本身被复制外,对象所包含的所有成员变量都会被复制,包括引用类型的成员对象浅拷贝:只复制对象其中包含的基本数据类型的成员变量,而引用类型的成员对象没有被复制...原创 2021-04-14 10:41:10 · 377 阅读 · 0 评论 -
什么是序列化?什么时候用到java的序列化?
序列化是为了保持对象在内存中的状态,并且可以把保存的对象状态再读出来。什么时候需要用到java序列化?需要将内存的对象状态保存到文件中。需要通过socket通信进行对象传输时。我们将系统拆分成多个服务之后,服务之间传输对象,需要序列化。...原创 2021-04-11 18:57:11 · 228 阅读 · 0 评论 -
有集合A和集合B,现在需要将两个集合中重复的元素放入到集合C中,请问你会怎么编程实现?
有集合A和集合B,现在需要将两个集合中重复的元素放入到集合C中,请问你会怎么编程实现?时间复杂度为O(n) 使用set去重Set<String> set = new HashSet<>(); for (String a : list1) { set.add(a); } for (String b : list2) { if(set.contains(b)){原创 2021-04-14 10:39:41 · 642 阅读 · 1 评论 -
什么是反射?可以解决什么问题?
什么是反射?可以解决什么问题?什么是反射?反射是指程序在运行状态中,可以对任意一个类,都能够获取并调用到这个类的所有属性和方法。反射是一种能力,一种在程序运行时,动态获取当前类对象的所有属性和方法的能力,可以动态执行方法,给属性赋值等操作的能力。Class代表的就是所有的字节码对象的抽象,类反射,让我们的java程序具备动态性这种动态获取类信息及调用对象方法的功能称为反射可以破坏单例,除了枚举以外。在java中,Class类就是关键APIpublic class Reflection {原创 2021-04-13 09:42:58 · 658 阅读 · 1 评论 -
什么是字节码?采用字节码的好处是什么?
Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。原创 2023-01-02 15:59:44 · 672 阅读 · 0 评论 -
Iterator和ListIterator的区别?
Iterator可以遍历Set和List,而ListIterator只能遍历ListIterator只能单向遍历,而ListIterator可以双向遍历ListIterator继承与Iterator接口原创 2021-04-11 18:52:43 · 105 阅读 · 0 评论 -
try catch finally和return,在finally中return返回值的问题?finally语句块在两种情况下不会执行?
以下这道题,在实际开发中,并不会这么写。这个是面试官为了考察大家对finally的认识,而苦思冥想出来,我猜的。结果是多少? ----------2答案是:2,因为finally是无论如何都会执行,除非JVM关闭了退出当前java虚拟机system.exit(int status) 和 system.exit(int status)正常退出status为0时为正常退出程序,也就是结束当前正在运行中的java虚拟机。非正常退出status为非0的其他整数(包括负数,一般是1或者-1),表示原创 2021-04-09 22:33:10 · 192 阅读 · 0 评论 -
throw跟throws的区别
throw跟throws的区别throw,作用于方法内,用于主动抛出异常throws, 作用于方法声明上,声明该方法有可能会抛些某些异常针对项目中,异常的处理方式,我们一般采用层层往上抛,最终通过异常处理机制统一处理(展示异常页面,或返回统一的json信息)自定义异常一般继承RunntimeException,我们去看看Hibernate等框架,他们的异常体系都是最终继承自RunntimeException...原创 2021-04-09 22:18:04 · 89 阅读 · 0 评论 -
Java的异常体系;常见的运行时异常和非运行时异常
造成的问题,比如FileNotFoundException写了一个程序,自动阅卷,需要读取答案的路径(用户录入),用户可能录入是一个错误的路径,所以我们要提前预案,写好发生异常之后的处理方式,栈内存溢出错误:StackOverflowError(递归,递归层次太多或递归没有结束)IllegalStateException 无效状态异常 如往队列中放超过队列长度的参数。此类异常,编译时没有提示做异常处理,因此通常此类异常的正确理解应该是“逻辑错误”,比如空指针异常,这种问题是编 程逻辑不严谨造成的。原创 2021-04-09 22:16:19 · 307 阅读 · 0 评论 -
面向对象思想
面向过程会将任务拆解成一系列的步骤(函数),1、打开洗衣机----->2、放衣服----->3、放洗衣粉----->4、清洗----->5、烘干。操作数据库,我们不需要关心链接是如何建立的、sql是如何执行的,只需要引入mybatis,调方法即可。子类共性的方法或者属性直接使用父类的,而不需要自己再定义,只需扩展自己个性化的。多态:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。继承:继承基类的方法,并做出自己的改变或扩展。3、子类可以用自己的方式实现父类的方法。无法调用子类特有的功能。原创 2021-04-06 21:31:07 · 99 阅读 · 0 评论 -
String,StringBuffer,StringBuilder区别
String 跟其他两个类的区别是String是final类型,每次声明都是不可变的对象,所以每次操作都会产生新的String对象,然后将指针指向新的String对象。StringBuffer、StringBuilder都是在原有的对象上进行操作,所以经常改变的字符串内容,建议用这两个。Stringbuffer是线程安全的,StringBuilder线程不安全。性能则反之。StringBuilder>StringBuffer>StringStringBuffer里面的方法大多被sync原创 2021-04-06 22:29:53 · 95 阅读 · 1 评论 -
多线程环境下安全地使用Java集合?ConcurrentHashMap实现原理?
Hashtable是线程安全的,但效率低HashMap是线程不安全的,但效率高ConcurrentHashMap 线程安全 兼顾效率Collections.synchronizedMap(),工具类提供了同步包装器的方法,来返回具有线程安全的集合对象,性能依然有问题,只是普通的加锁进行同步包装ConcurrentHashMap兼顾了线程安全和效率的问题HashTable锁了整段数据(用户操作是不同的数据段,依然需要等待)解决方案:把数据分段,执行分段锁(分离锁),核心把锁的范围变小,这样.原创 2021-04-08 23:01:15 · 149 阅读 · 0 评论 -
接口和抽象类的区别
当不同的类具有某些相同的行为(记为行为集合A),且其中一部分行为的实现方式一致时(A的非真子集,记为B),可以让这些类都派生于一个抽象类。接口的核心是定义行为,即实现类可以做什么,至于实现类主体是谁、是如何实现的,接口并不关心。,比如针对dao层操作的封装,继承BaseDao的UserDao等,还有BaseController抽取公共的方法,用于记录日志,返回前台数据,打印日志等。分布式:面向服务的开发,抽取公共的service,产生生产者和消费者的角色,两者之间的纽带,如feign。而抽象类的设计目的,原创 2021-04-06 22:59:24 · 123 阅读 · 0 评论 -
ArrayList 和Vector区别
ArrayList:线程不安全,效率高,常用Vector:线程安全的,效率低 jdk1.0就出现了我们看Vector的源码:synchronized加锁处理 同步方法原创 2021-04-08 23:03:12 · 97 阅读 · 0 评论 -
int和Integer的区别
int和Integer的区别int是基本数据类型,Integer是包装类型,即引用类型。Integer i1 = new Integer(12);Integer i2 = new Integer(12);System.out.println(i1 == i2);Integer i3 = 126;Integer i4 = 126;int i5 = 126;System.out.println(i3 == i4);System.out.println(i3 == i5);//Integer和原创 2021-04-08 21:56:29 · 159 阅读 · 0 评论 -
Java 什么是向上转型?什么是向下转型?
什么是向上转型?什么是向下转型?向上转型是安全的,父类型的引用指向子类型的对象,直接转换。Animal animal = new Dog();向上转型则是不安全的,需要强转。Dog dog = (Dog)new Animal();一般出现选择题,举例说明即可。...原创 2021-04-08 21:40:36 · 323 阅读 · 0 评论 -
java中的栈底层数据结构?开发一个自己的栈,你会怎么写?
栈底层数据结构–数组存数据,push取数据,peek,先进先出,所以取栈顶元素,最大的下标的-1即可分析下JDK里面的Stack源码,会发现其实非常简单首先,栈的特点是FILO(First In Last Out)其次,底层的数据结构我们采用数组的方式...原创 2021-04-08 23:07:46 · 285 阅读 · 0 评论 -
Java的基本数据类型有哪些?int类型取值范围?
基本数据类型boolean,char,byte,short,int,long,float,double 和引用类型,如Stringint占4个字节因为java实现了多平台的运行,所以采用了32位字符为一个int类型;java中int是32位,数值范围长度是2的32次方。java中没有unsign数值的概念,因此正数和负数各占一半。...原创 2021-04-06 21:45:09 · 441 阅读 · 0 评论 -
双向链表要实现在A和B节点之间插入C,伪代码?
假设我们定位到了A节点,那么A.next就是B节点,这个是前提。C.pre = A;C.next = A.next;A.next.pre = C;A.next = C;原创 2021-04-08 22:40:25 · 576 阅读 · 0 评论 -
方法的重写和重载的区别
方法的重载和重写的区别重载:发生在类内部,两个方法:方法名相同,参数列表不同,跟返回值类型无关重写:发生在父类和子类之间,方法名相同,参数列表相同,返回值类型相同原创 2021-04-08 22:03:26 · 130 阅读 · 0 评论 -
serialVersionUID的作用是什么?
serialVersionUID版本号ID的作用是什么?当执行序列化时,我们写对象到磁盘中,会根据当前这个类的结构生成一个版本号ID;当反序列化时,程序会比较磁盘中的序列化版本号ID跟当前的类结构生成的版本号ID是否一致,如果一致则反序列化成功,否则,反序列化失败。加上版本号,有助于当我们的类结构发生了变化,依然可以之前已经序列化的对象反序列化成功。...原创 2021-04-09 22:02:00 · 107 阅读 · 0 评论 -
java中final关键字 局部内部类和匿名内部类只能访问局部final变量
java中final关键字 局部内部类和匿名内部类只能访问局部final变量原创 2021-04-06 22:13:57 · 277 阅读 · 0 评论 -
HashMap底层实现原理?HashMap和HashTable有什么区别?LinkedHashMap的实现?HashMap查询的时间复杂度为什么是O(1)
(1)HashMap方法没有synchronized修饰,线程非安全,HashTable线程安全;(2)HashMap允许key和value为null,而HashTable不允许。jdk8开始链表高度到8、数组长度超过64,链表转变为红黑树,元素以内部类。底层采用Linked双向链表来包证了节点的有序性。数据结构:链表+散列表。原创 2021-04-08 22:54:27 · 336 阅读 · 1 评论 -
递归算法-求阶乘-求斐波那契数列
递归算法什么是递归?递归,就是方法内部调用方法自身注意事项:找到规律,编写递归公式找到出口(边界值),让递归有结束边界注意:如果递归太多层,或者没有正确结束递归,则会出现“栈内存溢出Error”!在递归的方法中,先写出口,再写公式计算。问题:为什么会出现栈内存溢出,而不是堆内存溢出?每执行一个方法在栈中生成一个栈帧。栈空间有限,一般几M。求阶乘public static void main(String[] args) { System.out.println(getJc(4))原创 2021-04-07 11:20:42 · 354 阅读 · 2 评论 -
HashSet的存储原理
通过计算存储对象的hashcode,然后再跟数组长度-1做位运算,得到我们要存储在数组的哪个下标下,如果此时计算的位置没有其他元素,直接存储,不用比较。此处,我们只会用到hashCode但是随着元素的不断添加,就可能出现“哈希冲突”,不同的对象计算出来的hash值是相同的,这个时候,我们就需要比较,才需要用到equals方法,如果equals相同,则不插入,不相等,则形成链表。可以采用遍历的方式,逐个比较,但是这种效率低,尤其是数据很多的情况下所以,为了解决这个效率低的问题,我们采用新的方式采用。原创 2021-04-08 22:47:07 · 346 阅读 · 0 评论 -
==和equals的区别 以及String比较 hashCode和equals方法比较 new String(“abc“)到底创建了几个对象?
==和equals的区别== 比较的是值比较基本的数据类型,比较的是数值;比较引用类型:比较引用指向的值(地址)equals默认比较也是地址,因为这个方法的最初定义在Object上,默认的实现就是比较地址自定义的类,如果需要比较的是内容,那么就要学String,重写equals方法 String s1 = new String("zs"); String s2 = new String("zs"); System.out.println(s1 == s2); //f原创 2021-04-06 22:09:20 · 148 阅读 · 0 评论 -
List和Set的区别 ArrayList和LinkedList的区别
LinkedList的占用空间更大,因为每个节点要维护指向前后地址的两个节点,但也不是绝对,如果刚好数据量超过ArrayList默认的临时值时,ArrayList占用的空间也是不小的,因为扩容的原因会浪费将近原来数组一半的容量,不过,因为ArrayList的数组变量是用transient关键字修饰的,如果集合本身需要做序列化操作的话,ArrayList这部分多余的空间不会被序列化。:无序,不可重复,最多允许有一个Null元素对象,取元素时只能用Iterator接口取得所有元素,在逐一遍历各个元素。原创 2021-04-08 22:38:10 · 472 阅读 · 0 评论 -
Java中IO流的分类及选择
IO流的分类1,按方向分:输入流,输出流(注意,是站在程序的角度来看方向),输入流用于读文件,输出流用于写文件2、按读取的单位分:字节流,字符流3、按处理的方式分:节点流,处理流比如,FileInputStream和BufferedInputStream(后者带有缓存区功能-byte[])IO流的4大基类:InputStream,OutputStream,Reader,Writer选择字节流可以读取任何文件;读取文本文件的时候:选择字符流(假如有解析文件的内容的需求,比如逐行处理,则采用字符原创 2021-04-09 21:56:27 · 264 阅读 · 0 评论 -
JDK、JRE、JVM有什么区别
JDK、JRE、JVM有什么区别JDK:Java Development Kit,Java开发工具包,提供了Java的开发环境和运行环境。包含了编译Java源文件的编译器Javac,还有调试和分析的工具。JRE:Java Runtime Environment,Java运行环境,包含Java虚拟机及一些基础类库JVM:Java Virtual Machine,Java虚拟机,提供执行字节码文件的能力所以,如果只是运行Java程序,只需要安装JRE即可。另外注意,JVM是实现Java跨平台的核心,但JV原创 2021-04-06 21:35:35 · 123 阅读 · 0 评论