第一阶段
1、重载(overload)和重写(overwrite)区别
重写:子类继承父类,子类重写父类的方法。
重载:
2、StringBuffer、StringBuilder、String 区别
String:字符串常量,不可变,使用字符串拼接会开辟新空间。
StringBuffer:字符串变量,可变、线程安全,字符串拼接直接在原有字符串后面追加。
StringBuilder:字符串变量。可变,非线程安全字符串拼接直接在字符串后追加。
3、Throws和Throw的区别
throw和throws作为Java中两种异常抛出关键字,虽然两个长的很像,但是却有着很大的区别。
区别1:
throws:跟在方法声明后面,后面跟的是异常类名
throw:用在方法体内,后面跟的是异常类对象名
public static void method() throws ArithmeticException {// 跟在方法声明后面,后面跟的是异常类名 int a=10; int b=0; if(b==0) { throw new ArithmeticException(); //用在方法体内,后面跟的是异常类对象名 }else { System.out.println(a/b); } } }
区别2:
throws:可以跟多个异常类名,用逗号隔开
throw:只能抛出一个异常对象名
public static void method() throws ArithmeticException,Exception {//跟多个异常类名,用逗号隔开 int a=10; int b=0; if(b==0) { throw new ArithmeticException();// 只能抛出一个异常对象名 }else { System.out.println(a/b); } } }
区别3:
throws:表示抛出异常,由该方法的调用者来处理
throw:表示抛出异常,由该方法体内的语句来处理
public class throwandthrows { public static void main(String[] args) { try { method();//由该方法的调用者来处理 }catch (ArithmeticException e) { e.printStackTrace(); } } public static void method() throws ArithmeticException { int a=10; int b=0; if(b==0) { throw new ArithmeticException();//由该方法体内的语句来处理 }else { System.out.println(a/b); } } }
区别4:
throws:throws表示有出现异常的可能性,并不一定出现这些异常
throw:throw则是抛出了异常,执行throw一定出现了某种异常
4、HashTable和HashMap的区别
继承类不同
Hashtable继承自Dictionary类,而HashMap继承自AbstractMap类;但二者都实现了Map接口。
线程的安全性
Hashtable 线程安全,因为它每个方法中都加入了Synchronize,在多线程并发的环境下,可以直接使用Hashtable,不需自己在加同步。
HashMap线程不安全,因为HashMap底层是一个Entry数组。
是否有contains方法
HashTable有一个contains(Object value)方法。
HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey。
可否允许有null值
Hashtable中,key和value都不允许出现null值。
HashMap允许null值(key和value都可以),因为在HashMap中null可以作为健,而它对应的值可以有多个null。
数组初始化和扩容不同
HashTable中hash数组默认大小是11,增加的方式是 arr*2+1。
HashMap中hash数组的默认大小是16,而且一定是2的指数。
5、ArrayList和LinkedList的区别
1)ArrayList底层时Array数组、LinkedList底层时Link列表
2)由于ArrayList是数组数据结构,LinkedList是链表数据结构,当查询时ArrayList比LinkedList效率要高;当对数据进行插入和删除时,LinkedList比ArrayList的效率更高,因为ArrayList需要将插入和删除的后面的数据往前移动。
3)他们都实现了List接口,但是LinkedList也实现了Deque接口,所以LinkedList他又是一个双向链表。因为他有个头插的方法,也有个尾插的方法。
6、线程池的五种状态
1)RUNNING
说明:线程池的初始化状态就是RUNNING,此时能够接收新任务,以及对已添加的任务进行处理。
2)SHUTDOWN
说明:调用线程池的shutdown()接口时,线程池有RUNNING-->SHUTDOWN,此时不接收新任务,但能处理已添加的任务。
3)STOP
说明:调用线程池的shutdownNow()接口时,线程池由(RUNNING)或者(SHUTDOWN)->STOP,此时不接收新任务,不处理已添加的任务,会立即中断正在处理的任务。
4)TIDYING
当线程池状态为SHUTDOWN时,阻塞队列为空并且线程池中执行的任务也为空时,就会由SHUTDOWN->TIDYING
当线程池为STOP时,线程池中执行的任务为空时,就会又STOP->TIDYING
5)TERMINATED
说明:线程池处于TIDYING状态时,调用terminated()就会由TIDYING->TERMINATED,线程池彻底终止,就会变成TERMINATED状态。
7、java中compareTo和compare区别。
8、java中set是如何保证不重复的,如何用List来实现set
我们向Set集合加入数据时,要加入的数据会和集合里的数据比较
会先比较hashCode()的值,如果不同那么jvm就会认为这是两个不同的数据 就会直接加入,
而如果hashCode()的值相同,jvm会调用equals()来比较,如果相同就认为是一个数据,否则 就是两个数据。(当hashCode()的值不同是就不会继续调用equals()了)
9、Collection 和 Collections 有什么区别?
1)Collection 是最基本的集合接口,Collection派生了两个子接口list和set,分别定义了两种不同的存储方式
2)Collections 是一个包装类,包含了对处理集合的一系列方法。
10、HashMap的实现原理
1、简介
HashMap基于map接口,元素一键值对方式存储,key允许有null,但是HashMap是线程不安全的
2、基本属性
初始化大小:默认是16,每次扩容后容量为之前得2倍。
初始负载因子为0.75,当存储元素个数超过当前容量*0.75时,就会扩容。
3、存储结构
JDK1.7中采用的是数组+链表的方式存储
HashMap采用Entry数组来存储key-value,并且Entry也是一个单向链表结构,它具有next指针指向下一个Entry实体,来解决Hash冲突问题。
JDK1.8中采取数组+链表+红黑树的方式存储
此时HashMap是采用node节点来存储数据,当发生hash冲突时,判断该节点下是否是红黑树,如果不是则遍历链表,判断链表长度是否超过8,如果超过则变为红黑树,当红黑树节点小于等于6时,又会变成链表结构。
11、怎么确保一个集合不被修改?
如果一个成员变量是基本数据类型的话,我们可以用final关键字来修饰,此时该成员变量的值是不能被更改的。如果成员变量是引用类型被final修饰,则这个引用的地址值不能被改变,但是引用所指向的对象内容还是可以改变的。
我们可以采用Collections包下的unmodifiableMap方法,通过这个方法返回的mao不可以修改。Collections.unmodifiableList(list)\Collections.unmodifiableSet(set)
感谢您的阅读,如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮。本文欢迎各位转载,但是转载文章之后必须在文章页面中给出作者和原文连接。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~