java面试索引

TCP与UDP的区别。@TOC

(1)TCP:面向连接,可靠的,速度慢,效率低。

(2)UDP:无连接、不可靠、速度快、效率高。

TCP/IP:四层模型

①网络接口层:对应物理层和数据链路层。

②网络层

③传输层

④应用层:包括会话层、表示层、应用层。

HTTP与HTTPS有什么区别?

HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全。
1、https协议需要到ca申请证书 需要一定费用
2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全

解释一下tcp三次握手四次挥手

TCP三次握手

所谓三次握手,是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

三次握手的目的是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号并交换 TCP 窗口大小信息.在socket编程中,客户端执行connect()时。将触发三次握手。
  (1) 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。
  (2) 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。

(3) 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。

完成三次握手,客户端与服务器开始传送数据。

TCP 四次挥手
  TCP的连接的拆除需要发送四个包,因此称为四次挥手。客户端或服务器均可主动发起挥手动作,在socket编程中,任何一方执行close()操作即可产生挥手操作。
  TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
(1) TCP客户端发送一个FIN,用来关闭客户到服务器的数据传送。
(2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
(3) 服务器关闭客户端的连接,发送一个FIN给客户端。
(4) 客户端发回ACK报文确认,并将确认序号设置为收到序号加1

GET方法与POST方法的区别

get重点在从服务器上获取资源,post重点在向服务器发送数据
get传输数据是通过URL请求 post传输数据通过Http的post机制
Get传输的数据量小, Post可以传输大量数据
get是不安全的,因为URL是可见的 post较get安全性较高;
get方式只能支持ASCII字符 post支持标准字符集

值传递引用传递

值传递是对基本型变量而言的,传递的是该变量的一个副本,改变副本不影响原变量. 引用传递一般是对于对象型变量而言的,传递的是该对象地址的一个副本, 并不是原对象本身 。 所以对引用对象进行操作会同时改变原对象. 一般认为,java内的传递都是值传递.
值传递发生在基本数据类型,引用传递发生在引用数据类型

在java中,基本数据类型作为参数传递的时候叫做值传递,传的是值本身,值传递:值在该方法中改变属于局部变量改变当出了该方法就没有作用了(方法中的传递的基本数据类型就属于局部变量)
在java中,方法的传参,引用数据类型,传的是物理内存地址值,当方法中对数组内部的数值进行改变时,并未改变该数组的物理内存地址,所以当返回到主方法中,数组还是指向原来的地址。
当传入arr数组在内存中的地址值后,堆内存中的连续地址发生改变,可以影响数组整体
特例:String /基本数据类型包装类,虽然都是引用数据类型,但是在发生传参的时候,它们传的是值

集合

Collection接口是集合类的跟接口,Java中没有提供这个接口的直接实现类。但是却让其被继承产生了两个接口,就是Set和List。
Set:不能包含重复的元素,无序。
List:可以包含重复的元素,有序。
Map是Java.util包中的另一个接口,和Collection无关。Map包含了k-v对。Map不能包含重复的key,但可以有重复的value

Iterator,所有的集合类,都实现了Iterator接口,这是一个用于遍历集合中元素的接口,主要包含以下三种方法:
hasNext()是否还有下一个元素
next()返回下一个元素
remove()删除当前元素

Array和ArrayList有何区别,什么时候适合用Array。

Array可以容纳基本类型和对象,而ArrayList只能容纳对象。
Array是指定大小的,而ArrayList大小是固定的。
Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。尽管ArrayList明显是更好的选择,但也有些时候Array比较好用。
(1)如果列表的大小已经指定,大部分情况下是存储和遍历它们。
(2)对于遍历基本数据类型,尽管Collections使用自动装箱来减轻编码任务,在指定大小的基本类型的列表上工作也会变得很慢。
(3)如果你要使用多维数组,使用[][]比List<List<>>更容易。

ArrayList和LinkedList有何区别?

ArrayList和LinkedList两者都实现了List接口,但是它们之间有些不同。
(1)ArrayList是由Array所支持的基于一个索引的数据结构,所以它提供对元素的随机访问,复杂度为O(1),但LinkedList存储一系列的节点数据,每个节点都与前一个和下一个节点相连接。所以,尽管有使用索引获取元素的方法,内部实现是从起始点开始遍历,遍历到索引的节点然后返回元素,时间复杂度为O(n),比ArrayList要慢。
(2)与ArrayList相比,在LinkedList中插入、添加和删除一个元素会更快,因为在一个元素被插入到中间的时候,不会涉及改变数组的大小,或更新索引。
(3)LinkedList比ArrayList消耗更多的内存,因为LinkedList中的每个节点存储了前后节点的引用。

string,stringbuilder,stringbuffer的区别

运行速度 StringBulder>StringBuffer>String
String一旦创建了是不能更改的,后两者是可以更改的
StringBulder是线程不安全的 StringBuffer是线程安全的
一般情况下使用Stringbuffer因为String是每次都生成新对象 太慢 StringBulder是线程不安全

string方法常使用的方法

1 length()字符串的长度

String a = "Hello Word!";
System.out.println(a.length);
输出的结果是字符串长度10

2 charAt()截取一个字符

String a = "Hello Word";
System.out.println(a.charAt(1));
输出的结果是字符串a的下标为1的字符e。

3 getchars()截取多个字符并由其他字符串接收

String a = "Hello Word";
char[] b = new char[10];
a.getChars(0, 5, b, 0);
System.out.println(b);

输出的结果为Hello,其中第一个参数0是要截取的字符串的初始下标(int sourceStart),第二个参数5是要截取的字符串的结束后的下一个下标(int sourceEnd)也就是实际截取到的下标是int sourceEnd-1,第三个参数是接收的字符串(char target[]),最后一个参数是接收的字符串开始接收的位置。

4 getBytes()将字符串变成一个byte数组

String a = "Hello Word";
byte b[] = a.getBytes();
System.out.println(new String(b));
输出的结果为Hello Wordbyte数组。

5 toCharArray()将字符串变成一个字符数组

String a = "Hello Word";
char[]b = a.toCharArray();
System.out.println(b);  
输出的结果为Hello Word字符数组。

6 equals()和equalsIgnoreCase()比较两个字符串是否相等,前者区分大小写,后者不区分

String a = "Hello Word";
String b = "hello word";
System.out.println(a.equals(b));
System.out.println(a.equalsIgnoreCase(b));  
输出的结果为第一条为false,第二条为true

7 startsWith()和endsWith()判断字符串是不是以特定的字符开头或结束

String a = "Hello Word";
System.out.println(a.startsWith("ee"));  
System.out.println(a.endsWith("rd"));
输出的结果第一条为false,第二条为true

8 toUpperCase()和toLowerCase()将字符串转换为大写或小写

String a = "Hello Word";
System.out.println(a.toUpperCase());
System.out.println(a.toLowerCase());
输出的结果第一条为“HELLO WORD”,第二条为“hello word”。

9 concat() 连接两个字符串

String a = "Hello Word";
String b = "你好";
System.out.println(b.concat(a));
输出的结果为“你好Hello Word”。

10 trim()去掉起始和结束的空格

String a = "    Hello Word   ";
System.out.println(a.trim());
输出的结果为“Hello Word”。

11 substring()截取字符串

String a = "Hello Word";
System.out.println(a.substring(0, 5));
System.out.println(a.substring(6));
输出的结果第一条为“Hello,第一个参数0(beginIndex)是开始截取的位置,第二个参数5(endIndex)是截取结束的位置,输出的结果第二条是“Word”,参数6(beginIndex)是开始截取的位置。

12 indexOf()和lastIndexOf()前者是查找字符或字符串第一次出现的地方,后者是查找字符或字符串最后一次出现的地方

String a = "Hello Word";
System.out.println(a.indexOf("o"));
System.out.println(a.lastIndexOf("o"));
输出的结果第一条是4,是o第一次出现的下标,第二条是7,是o最后一次出现的下标。

13 compareTo()和compareToIgnoreCase()按字典顺序比较两个字符串的大小,前者区分大小写,后者不区分

String a = "Hello Word";
String b = "hello word";
System.out.println(a.compareTo(b));
System.out.println(a.compareToIgnoreCase(b)); 
输出的结果第一条为-32,第二条为0,两个字符串在字典顺序中大小相同,返回0

14 replace() 替换

String a = "Hello Word";
String b = "你好";
System.out.println(a.replace(a, b));
System.out.println(a.replace(a, "HELLO WORD"));
System.out.println(b.replace("你", "大家"));
输出的结果第一条为“你好”,第二条为“HELLO WORD”,第三条为“大家好”。

重写和重载的区别

https://blog.csdn.net/dietime1943/article/details/53161364/
重写的规则:

  1. 访问修饰符的限制一定不能小于被重写方法的访问修饰符
  2. 参数列表必须与被重写方法相同
    [ 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。]
  3. 返回值类型必须与重写方法的返回值相同
  4. 重写方法不可以抛出新的异常或者比被重写方法声明的的检查异常更广的检查异常,但是可以抛出更少更有限或者不抛出
  5. 如果一个方法不能被继承则不能重写
  6. 静态方法不能被重写(1.父类的静态方法不能被子类覆盖为非静态方法。2.父类的非静态方法不能被子类覆盖为静态方法。3.父类的抽象方法可以被子类通过两种途径覆盖(即实现和覆盖)。4.父类的非抽象方法可以被覆盖为抽象方法[2]。
    [2]子类必须为抽象类。)
  7. 不能重写标识fianl的方法( final方法可以被继承, 但是不能被重写,)

抽象abstract和static

1. abstract方法不能被static修饰. 反之亦然
2. 静态方法不能被重写 重写依赖的是类的实例,而静态方法和类实例并没有什么关系。而且静态方法在编译时就已经确定,而方法覆盖是在运行时确定的(动态绑定)(也可以说是java多态体现在运行时、而static在编译时、与之相悖)。
3.构造方法不能别重写,因为构造方法默认是隐式static
4.静态方法不能访问非静态变量或者方法

后端返回给前端的数据存在哪

,一个是model对象(放在request域中),还有就是json格式的字符串放到响应体中(方法上加个responsebody注解)

Session和Cookie的区别

https://www.cnblogs.com/zlw-xf/p/8001383.html

查看完成内容更新

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值