今天开始对Java进行总复习,主要针对热点面试题,我们再根据试题内容延申相关知识;
1.、Java中equals与“==”的区别详解
讲二者区别之前,先大概讲解一下基本数据类型和引用类型的概念,当然,有一定基础的朋友可直接略过!
基本数据类型和引用类型
八大基本数据类型:
Byte,short,int,long,double,folat,boolean,char
其中byte占一个字节,short和char占两个字节,int,float占四个字节,double和long占8个字节,boolean只有true和false,这八种数据变量中直接存储值
注意:八大基本数据类型对应着各自的封装类型的包装类,提供了更多的方法,且不进行初始化时值默认为空(基本数据类型必须初始化),并且属于引用类型
引用类型:
引用类型主要是一些类、接口、数组
引用类型变量中存储的是地址,对应的地址存储数据
首先看一组代码
Integer aaa=new Integer(5); //引用类型
Integer bbb=new Integer(5);
int a=10; //基本类型
int b=10;
String str1=new String("justice"); //引用类型
String str2=new String("justice");
String str3;
str3=str1;
System.out.println(aaa==bbb); false
System.out.println(aaa.equals(bbb)); true
System.out.println(a==b); true
System.out.println(str1==str2); false
System.out.println(str1.equals(str2)); true
System.out.println(str1==str3); true
System.out.println(str1.equals(str3)); true
aaa和bbb都是Integer封装类型,是不同的对象,变量存储地址, 所以==结果为false,equals为true
a和b都是基本数据类型,变量存储值,所以==为true,基本数据类型无equals方法
str1和str2都是String类型,属于引用类型,变量存储地址,所以==为false,equals为true
创建str3的时候,str3指向了str1,所以str1和str3的指向同一个地址,存储的数据自然相同,所以均为true
延申:涉及内存中的常量池问题例子
String s1 = "abc";
String s2 = "abc";
System.out.println(s1.equals(s2));
System.out.println(s1 == s2);
答案是:true true
为什么第二个会是true呢?这就涉及到了内存中的常量池,常量池属于方法区的一部分,当运行到s1创建对象时,如果常量池中没有,就在常量池中创建一个对象"abc",第二次创建的时候,就直接使用,所以两次创建的对象其实是同一个对象,它们的地址值相等。
String str1="abc";
String str2="abc";
String str3="abc";
String str4=new String("abc");
String str5=new String("abc");
String str6=new String("abc");
常量池详细内容可看:Java字符串常量池_java字符串常量在哪里获取-CSDN博客
二者区别
"=="比较基本数据类型时比较的是表面值内容,而比较两个对象时比较的是两个对象的内存地址值
对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容
总结
" == "在基本数据类型:值内容,
引用类型时:地址
equals 重写:值内容不重写:地址
2、接口和抽象类的区别
Java 提供和支持创建抽象类和接口。它们的实现有共同点,不同点在于:接口中所有的方法隐含的都是抽象的。而抽象类则可以同时包含抽象和非抽象的方法。类可以实现很多个接口,但是只能继承一个抽象类类可以不实现抽象类和接口声明的所有方法,当然,在这种情况下,类也必须得声明成是抽象的。抽象类可以在不提供接口方法实现的情况下实现接口。Java 接口中声明的变量默认都是 final 的。抽象类可以包含非 final 的变量。Java 接口中的成员函数默认是 public 的。抽象类的成员函数可以是 private , protected 或者是 public 。接口是绝对抽象的,不可以被实例化。抽象类也不可以被实例化,如果它包含 main 方法的话是可以被 调用的。
3、cookie 和 session 的区别?
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2 、 cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session。3 、 session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能, 考虑到减轻服务器性能方面,应当使用COOKIE 。4 、单个 cookie 保存的数据不能超过 4K ,很多浏览器都限制一个站点最多保存 20 个 cookie
4、get和post请求,它们之间的区别?
① get 请求用来从服务器上获得资源,而 post 是用来向服务器提交数据;② get 将表单中数据按照 name=value 的形式,添加到 action 所指向的 URL 后面,并且两者使用 "?" 连 接,而各个变量之间使用"&" 连接; post 是将表单中的数据放在 HTTP 协议的请求头或消息体中,传递到 action所指向 URL ;③ get 传输的数据要受到 URL 长度限制( 1024 字节); post 可以传输大量的数据,上传文件通常要使用 post 方式;④使用 get 时参数会显示在地址栏上,如果这些数据不是敏感数据可以使用 get ;对于敏感数据还是应用使用post ;
5、请说明ArrayList和LinkedList的区别?
ArrayList和LinkedList都实现了List 接口,他们有以下的不同点:ArrayList 是基于索引的数据接口,它的底层是数组。它可以以 O(1) 时间复杂度对元素进行随机访问。与 此对应,LinkedList 是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接 在一起,在这种情况下,查找某个元素的时间复杂度是 O(n) 。相对于 ArrayList , LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的 时候,不需要像数组那样重新计算大小或者是更新索引。LinkedList 比 ArrayList 更占内存,因为 LinkedList 为每一个节点存储了两个引用,一个指向前一个元 素,一个指向下一个元素。
6、数组(Array)和列表(ArrayList)的区别?什么时候应该使用Array而不是ArrayList?
Array 可以包含基本类型和对象类型, ArrayList只能包含对象类型。Array 大小是固定的, ArrayList 的大小是动态变化的。ArrayList 提供了更多的方法和特性,比如: addAll() , removeAll() , iterator() 等等。对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。