1. ==和equals()的区别?

== : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型比较的是值,引用数据类型比较的是内存地址)。

equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

情况1:类没有覆盖写 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。

情况2:类override了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。


2.throw和throws的区别

throw 表示抛出一个异常类的对象,生成异常对象的过程。声明在方法体内。

throws 属于异常处理的一种方式,声明在方法的声明处。


3.collection 和collections

clloections是java.util下面的类,它的里面有各种相关集合操作的方法

collection是接口,是各种集合结构的父接口。


4.String类能被继承吗为什么?

不能被继承,因为String类是由fianl修饰的,final修饰的类不能被继承


5.为什么用fianl修饰String?

1.为了实现常量池,节约内存

String有专门的字符串常量池,只有用fianl修饰才能实现常量池。

常量池的存在,没有使用new关键字而产生的String对象,会存储到字符串常量池,当然如果有同样的内容的字符串产生时,将不会再新建对象,直接从常量池中取出来节省了堆内存空间。因为jvm里面,堆是用来存放对象实例的地方。

2.多线程安全

String被fianl修饰后是多线程安全的。同一字符串可以被多个线程共享,多个线程无法改变字符串内容。这就避免了当多个对象指向同一String时如果有一个对象改变了String会对其他的对象产生影响。所以安全。

3.实现String可以创建hashcode不可变性

因为字符串是不可变的,因为他在创建的时候hashcode就被缓存了,不需要重新计算,这就使得字符串很适合做map中的key,字符串的处理速度要快过其他键对象,所有hashmap中往往使用string作为键


6.new()和clone()的区别

A a=new A();

new对象的过程:程序执行到new操作符的时候会看new操作符后面的类型,因为知道了类型才知道分配多大的内存空间。分配完内存空间再调用构造函数填充对象的各个域进行对象的初始化。构造方法返回后,一个对象创建完毕,可以把她的引用地址发送到外部,外部使用这个引用操作对象。

A a1=(A)a.clone()

克隆的第一步与new相似都是分配内存空间。调用克隆方法时分配内存空间与原对象相同,然后使用原对象的各个域填充克隆对象的各个域。clone()返回,一个新的对象就被创建了,内容相同,地址值不同。


7.对象类中如何比较对象中某个值的大小进行排序?

重写Comparable接口和Comparator中的方法


8.Integer值超过127之后发生了什么?

Integer.class在装载(Java虚拟机启动)时,其内部类型IntegerCache的static块即开始执行,

实例化并暂存数值在-128到127之间的Integer类型对象。

当自动装箱int型值在-128到127之间时,即直接返回IntegerCache中暂存的Integer类型对象。

-128-127在缓存里取。否则就返回一个新对象。对象的地址值就不相同了,一个在静态区,一个在对象区


9.什么是浅拷贝和深拷贝?

浅拷贝(Shallow Copy):指向被复制的内存地址,如果地址发生改变,浅拷贝出来的对象也会相应改变。

深拷贝:为对象都开辟了新的内存空间地址,使这个增加的指针指向新的内存

总结:实则浅拷贝和深拷贝只是相对的,如果一个对象内部只有基本数据类型,那用 clone() 方法获取到的就是这个对象的深拷贝,而如果其内部还有引用数据类型,那用 clone() 方法就是一次浅拷贝的操作。


10…什么是序列化与反序列化?

作用:在网络上传输对象字节序列,把对象字节保存到硬盘上。减少内存消耗。或者在远程rpc调用对象的时候需要。

序列化就是把对象存储到硬盘上,反序列化就是获取对象文件中的数据,转成后台对象类的数据。


11.说一下JDBC链接数据库的过程

加载驱动

获取连接

获取传输器

执行sql

获取结果集,处理结果集

关闭资源

12.java 中操作字符串都有哪些类?它们之间有什么区别?

操作字符串的类有:String、StringBuffer、StringBuilder。

String 和 StringBuffer、StringBuilder 的区别在于 String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后将指针指向新的 String 对象,而 StringBuffer、StringBuilder 可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用 String。

StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。


13.String str="i"与 String str=new String(“i”)一样吗?

不一样,因为内存的分配方式不一样。String str="i"的方式,java 虚拟机会将其分配到常量池中;而 String str=new String(“i”) 则会被分到堆内存中。