JavaSE知识点整理

JavaSE知识点整理

JavaSE

1. new一个对象和clone一个对象的区别?

程序执行到new时,先去看new后面的类型,分配内存之后调用构造函数,填充对象的各个域,完成对象的初始化。clone分配的内存和原对象相同,然后再使用原对象中对应的各个域,填充新对象的域

2. equals和hashcode的关系,重写hashcode有什么好处

1.使用hashcode方法提前校验,可以避免每一次比对都调用equals方法,提高效率
2.保证是同一个对象,如果重写了equals方法,而没有重写hashcode方法,会出现equals相等的对象,hashcode不相等的情况,重写hashcode方法就是为了避免这种情况的出现。

3. final修饰的类,方法和成员变量有什么特点

final修饰的类不可以继承,修饰的方法不可以重写,修饰的成员变量不可以修改。

4. 重载和重写的区别

重载:
1.方法名一致,参数列表不同
2.返回值可以不同
3.可以抛出异常,可以有不同修饰符
重写:
1.参数列表和返回类型必须一致
2.构造方法和声明为 final,static 的方法不可以重写
3.访问权限不能比父类低
4.重写的方法不能抛出新的强制性异常,或者比重写方法声明更广泛的强制性异常

5. 为什么函数不能根据返回类型来区分重载?

因为调用时不能指定类型信息,编译器不知道你要调用哪个函数,比如 float max(int a,int b)和 int max(int a,int b)

6. char 型变量中能不能存储一个中文汉字?

能,Java中的编码是 Unicode,一个char类型占2个字节,可以放一个中文,在 UTF-8 中,一个中文,三个字节

7. 抽象类和接口有什么异同?

不同:
抽象类可以定义构造器
可以有抽象方法和具体方法
接口中成员都是 public (抽象类中的方法必须要让别人去实现,所以要用public)
抽象类中可以定义成员变量
有抽象方法的类必须声明为抽象类,抽象类未必有抽象方法
抽象类中可以包含静态方法
一个类只能继承一个抽象类(因为多继承容易带来安全隐患,当多个父类中实现了相同功能但内容功能不同时,子类对象不确定要运行哪一个。)
;
接口中不能定义构造器(因为不会有自己的实例)
方法都是抽象方法
抽象类中的成员可以是 private,默认,protected和public
接口中定义的成员变量实际上都是常量(既然是约束和规范,那么大家就不能改)
接口中不能有静态方法(因为java中不能定义抽象静态方法static,接口中所有成员方法都是 abstract 的,因为static修饰的方法会有具体的实现,而abstract没有,所以冲突)
一个类可以实现多个接口
相同:
不能实例化
可以将抽象类和接口类型作为引用类型
一个类如果继承了某个抽象类或者实现了某个接口,都需要对其中的抽象方法全部实现,否则该类仍然需要被声明为抽象类

8. abstract方法是否可以同时是静态的,是否可以同时是本地方法(native) ,是否可以同时被 synchronized?

都不能。抽象方法需要子类重写,而静态的方法是无法被重写的,因此二者是矛盾的。本地方法是由 本地代码(如 C 代码)实现的方法,而抽象方法是没有实现的,也是矛盾的。synchronized 和方法的实现细节有关,抽象方法不涉及实现细节,因此也是相互矛盾的。

9. 类变量和实例变量的区别

类变量,它属于类,不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;
实例变量: 必须依存于某一实例,需要先创建对象然后通过对象才能访问到它。静态变量可以实现让多个对象共享内存

10. ==和 equals 的区别

==如果比较的是基本数据类型,比较的就是值,比较的如果是引用数据类型,比较的就是地址值,equals不能比较基本数据类型,如果没有重写,比较的是引用数据类型的变量所指向的对象的地址。

11. String s = “Hello”;s = s + " world!";这两行代码执行后,原始的String对象 中的内容到底变了没有?

没有。因为String被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。这时,s不指向原来那个对象了,而指向了另一个 String对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是s这个引用变量不再指向它了。

12. 由上面的问题,问为什么推荐用 StringBuffer?

上面的方法会引起很大的内存开销,因为 String 对象建立后不能再改变,对于每一个不同的字符串,都需要一个String对象来表示。

13. String,StringBuffer和 StringBuilder 的区别

https://blog.csdn.net/csxypr/article/details/92378336

14. Java中实现多态的机制?

父类或接口定义的引用变量可以指向子类或具体实现类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法

15. error和exception的区别?

Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等
Exception 类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用 try。。。catch 捕获,要么用 throws 字句声明抛出,交给它的父类处理,否则编译不会通过

16. java异常处理机制是什么?

异常分为 error 和 exception,其中exception 又分为系统异常和普通异常

17. 写五个RuntimeException

  • ArithmeticException, 算术异常

  • ClassNotFoundException 类没找到时,抛出该异常

  • FileNotFoundException, 文件未找到异常

  • SQLException, 操作数据库异常

  • NullPointerException, 空指针异常

18. throw 和 throws 的区别

Throw:
作用在方法内,表示抛出具体异常,由方法体内的语句处理。
具体向外抛出的动作,所以它抛出的是一个异常实体类。若执行了Throw一定是抛出了某种异常。
Throws:
作用在方法的声明上,表示如果抛出异常,则由该方法的调用者来进行异常处理。
主要的声明这个方法会抛出某种类型的异常,让它的使用者知道捕获异常的类型。
出现异常是一种可能性,但不一定会发生异常。
实例:
void testException(int a) throws IOException,{
try{

}catch(Exception1 e){
throw e;
}catch(Exception2 e){
System.out.println(“出错了!”);
}
if(a!=b)
throw new Exception3(“自定义异常”);
}

19. final,finally,finalize 的区别

final是一个修饰符,被 final 修饰的变量不可以更改,修饰的方法不能被重写,修饰的类不能被继承。
finally 是在异常处理时,提供 finally 块来执行具体操作,一般在 catch 后执行
finalize 是方法名,这个方法在gc启动,该对象被回收的时候被调用。

20. 什么情况下用“+”运算符进行字符串连接比调用 StringBuffer/StringBuilder 对象的append方法连接字符串性能更好?

String s = “abc” + “ddd”; 这种方法效率最高。
虽然在源程序中使用了"+",但在编译时仍然将"+“转换成StringBuilder。因此,我们可以得出结论,在 Java 中无论使用何种方式进行字符串连接,实际上都使用的是 StringBuilder。大家可以看到,虽然编译器将”+"转换成了StringBuilder,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环,就会创建一个StringBuilder对象

21. 如何格式化日期

Date d = new Date();
SimpleDateFormat sdf = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
System.out.println(“当前时间:” + sdf.format(d));

22. 对时间相关的进行操作

Calendar ca = Calendar.getInstance

23. short s1 = 1; s1 = s1 + 1; 有错吗?short s1 = 1; s1 += 1 有错吗?

因为 1 是int型,赋值给 s1 的时候需要强制类型转换,+=含有隐含的强制类型转换

24. Integer f1=100,f2=100,f3=150,f4=150,比较 f1= =f2,f3= =f4,结果为什么?

如果整型字面量的值在-128 到 127 之间,那么不会 new 新的 Integer 对象,而是直接引用常量池中的 Integer 对象, f1= =f2 的结果是 true,而 f3= =f4 的结果是 false。

25. 什么是java序列化,如何实现java序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。 序列化的实现:将需要被序列化的类实现 Serializable 接口,该接口没有需要实现的方法, implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流

26. LinkedHashMap编程

已知一个HashMap<Integer,User>集合, User有name(String)和 age(int)属性。请写一个方法实现对HashMap 的排序功能,该方法接收 HashMap<Integer,User>为形参,返回类 HashMap<Integer,User>,要求对HashMap中的User的age倒序进行排序。排序时key=value键值对不得拆散.

27. 请问ArrayList、HashSet、HashMap是线程安全的吗?如果不是我想要线程安全的集合怎么办?

我们都看过上面那些集合的源码(如果没有那就看看吧),每个方法都没有加锁,显然都是线程不安全的
Collections工具类提供了相关的API,可以让上面那3个不安全的集合变为安全的。 1. // Collections.synchronizedCollection© 2. // Collections.synchronizedList(list) 3.Collections.synchronizedMap(m) 4. // Collections.synchronizedSet(s)

28. ArrayList内部用什么实现的?

ArrayList 内部是用 Object[]实现的

29. 并发集合和普通集合如何区别?

并发集合常见的有ConcurrentHashMap、ConcurrentLinkedQueue ConcurrentLinkedDeque等。并发集合位于 java.util.concurrent 包 下 , 是 jdk1.5 之 后 才 有 的 。在java中有普通集合、同步(线程安全)的集合、并发集合。普通集合通常性能最高,但是不保证多线程的安全性和并发的可靠性。线程安全集合仅仅是给集合添加了synchronized同步锁,严重牺牲了性能,而且对并发的效率就更低了,并发集合则通过复杂的策略不仅保证了多线程的安全又提高的并发时效率

30. List的三个子类的特点?

Arraylist:底层结构是数组,查询快,增删慢,线程不安全,效率高
LinkedList:底层是链表,查询慢,增删快,线程不安全,效率高
Vector:底层是数组,查询快,增删慢,线程安全,效率低

31. List和Map、Set的区别?

List和 Set 是存储单列数据,map存储键值对。List 中存储的数据是有序的,允许重复,map无序,不允许键重复,允许值重复,set中顺序是由hashcode决定,不允许有重复

32. HashMap 和HashTable有什么区别?

HashMap是线程不安全的,HashMap是一个接口,是Map的一个子接口,是将键映射到值得对象,不允许键值重复,允许空键和空值;由于非线程安全,HashMap的效率要较HashTable的效率高一些.。
HashTable 是线程安全的一个集合,不允许null值作为一个key值或者Value值;
HashTable 是 sychronize,多个线程访问时不需要自己为它的方法实现同步,而 HashMap 在被多个线程访问的时候需要自己为它的方法实现同步;

33. 数组和链表分别比较适合用于什么场景,为什么?

数组是将元素在内存中连续存储的;它的优点:因为数据是连续存储的,内存地址连续,所以在查找数据的时候效率比较高;它的缺点:在存储之前,我们需要申请一块连续的内存空间,并且在编译的时候就必须确定好它的空间的大小。在运行的时候空间的大小是无法随着你的需要进行增加和减少而改变的,当数据两比较大的时候,有可能会出现越界的情况,数据比较小的时候,又有可能会浪费掉内存空间。在改变数据个数时,增加、插入、删除数据效率比较低 。
链表是动态申请内存空间,不需要像数组需要提前申请好内存的大小,链表只需在用的时候申请就可以,根据需要来动态申请或者删除内存空间,对于数据增加和删除以及插入比数组灵活。还有就是链表中数据在内存中可以在任意的位置,通过应用来关联数据。
数组应用场景:数据比较少;经常做的运算是按序号访问数据元素;数组更容易实现,任何高级语言都支持;构建的线性表较稳定。
链表应用场景:对线性表的长度或者规模难以估计;频繁做插入删除操作;构建动态性比较强的线性表。

34. Java中ArrayList和Linkedlist区别?

  1. ArrayList的实现是基于数组来实现的,LinkedList的基于双向链表来实现。这两个数据结构的逻辑关系是不一样,当然物理存储的方式也会是不一样。
  2. 对于随机访问,ArrayList优于LinkedList。
  3. 对于插入和删除操作,LinkedList优于ArrayList
  4. LinkedList比ArrayList更占内存,因为LinkedList的节点除了存储数据,还存储了两个引用,一个指向前一个元素,一个指向后一个元素。

35. List a=new ArrayList()和ArrayList a =new ArrayList()的区别?

List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList 有但是 List 没有的属性和方法,它就不能再用了。而 ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。 所以需要用到ArrayList独有的方法的时候不能用前者

36. 要对集合更新操作时,ArrayList和LinkedList哪个更适合?

  1. ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
  2. 如果集合数据是对于集合随机访问get和set,ArrayList绝对优于LinkedList,因为LinkedList要移动指针。
  3. 如果集合数据是对于集合新增和删除操作 add 和 remove,LinedList 比较占优势,因为 ArrayList 要移动数据。

37. java是值传递还是地址传递?

把栈中存储的值进行传递,而栈的值可能是具体的值,也可能是对象在堆中的地址!
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

38. String 测试

输出以下结果
在这里插入图片描述
Java会确保一个字符串常量只有一个拷贝,字符串常量在编译期就确定了,”Program”和”ming”也都是字符 串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s5也同样在编译期就被解析为一个字符串常量

40. 字节流如何转为字符流

在这里插入图片描述

41. java中父类引用指向子类对象

在这里插入图片描述

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值