Bootstrap

Java知识及热点面试题总结(一)

今天开始对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 的区别?

1cookie数据存放在客户的浏览器session数据放在服务器上。

2 cookie 不是很安全,别人可以分析存放在本地的 COOKIE 并进行 COOKIE 欺骗,考虑到安全应当使用 session。
3 session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能, 考虑到减轻服务器性能方面,应当使用COOKIE
4 单个 cookie 保存的数据不能超过 4K ,很多浏览器都限制一个站点最多保存 20 cookie

4、getpost请求,它们之间的区别? 

get 请求用来从服务器上获得资源, post 是用来向服务器提交数据;
get 将表单中数据按照 name=value 的形式,添加到 action 所指向的 URL 后面,并且两者使用 "?" 连 接,而各个变量之间使用"&" 连接 post 是将表单中的数据放在 HTTP 协议的请求头或消息体中,传递到 action所指向 URL
get 传输的数据要受到 URL 长度限制( 1024 字节); post 可以传输大量的数据,上传文件通常要使用 post 方式;
使用 get 时参数会显示在地址栏上,如果这些数据不是敏感数据可以使用 get 对于敏感数据还是应用使用post

5、请说明ArrayListLinkedList的区别?

ArrayListLinkedList都实现了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() 等等。
对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。
;