欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

2019-12-05

程序员文章站 2022-06-03 23:47:10
...

final关键字
final关键字修饰类

final关键字修饰的类不能被继承;

final关键字修饰方法

final关键字修饰的方法不能被重写;

final关键字修饰变量

final关键字修饰的变量是常量:只能赋值一次;

hashCode和equals方法的区别:
1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。

2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢?
因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠。

解决方式:
当需要对比的时候,首先用hashCode()去对比,如果hashCode()不一样,则表示这两个对象肯定不相等(也就是不必再用equal()去再对比了),如果hashCode()相同,此时再对比他们的equal(),如果equal()也相同,则表示这两个对象是真的相同了,这样既能大大提高了效率也保证了对比的绝对正确性。

设计一个榨汁机类,面向对象怎么设计

(多态)定义榨汁机JuiceMachine 有榨汁方法makeJuice,传入相应的水果。
   如果传入的是Apple 输出   "流出苹果汁"
       传入的是Orange 输出  "流出橙汁"
	   传入的是Banana 输出  "流出香蕉酱"
public class Test01 {
	
	public static void main(String[] args) {
		JuiceMachine jMachine = new JuiceMachine();
		Apple apple = new Apple();
		jMachine.makeJuice(apple);//流出苹果汁
		Orange orange = new Orange();
		jMachine.makeJuice(orange);
		Banana banana = new Banana();
		jMachine.makeJuice(banana);
	}
 
}
 
 
class JuiceMachine{
	public void makeJuice(Fruit f) {
		f.make();
	}
}
 
class Fruit{
	public void make() {
		System.out.println("制作水果汁");
	}
}
 
class Apple extends Fruit{
	public void make() {
		System.out.println("流出苹果汁");
	}
}
 
class Orange extends Fruit{
	public void make() {
		System.out.println("流出橙汁");
	}
}
 
class Banana extends Fruit{
	public void make() {
		System.out.println("流出香蕉酱");
	}

判断一个字符串是否是合法的ipv4地址

1、如果用 “.” 作为分隔的话,必须是如下写法:String.split("\."),这样才能正确的分隔开,不能用 String.split(".");

2、如果用 “|” 作为分隔的话,必须是如下写法:String.split("\|"),这样才能正确的分隔开,不能用 String.split("|");

“.” 和 “|” 都是转义字符,必须得加 “\”;

3、如果在一个字符串中有多个分隔符,可以用 “|” 作为连字符,比如:“a=1 and b =2 or c=3”,把三个都分隔出来,可以用String.split(“and|or”);

public class IsIPV4 {
 
    public static boolean isIPV4(String str){
        if(str == null || str.length() == 1){
            return false;
        }
        // 注意:用 . 进行分割的时候需要用 \\ 转义
        String[] parts = str.split("\\.");
        if(parts.length != 4){
            return false;
        }
        for(int i = 0; i < parts.length; i++){
            if(Integer.valueOf(parts[i]) < 0 || Integer.valueOf(parts[i]) > 255){
                return false;
            }
        }
        return true;
    }
 
    public static void main(String[] args) {
        System.out.println(isIPV4("111.111.111.111"));    // true
        System.out.println(isIPV4("-1.111.111.111"));     // false
        System.out.println(isIPV4("1111.111.111.111"));   // false
    }
}
————————————————
版权声明:本文为CSDN博主「pcwl1206」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pcwl1206/article/details/99618859

GET 和 POST 区别?
首先, GET 和 POST 方法都是基于 TCP/IP 协议,也就是说,两者的数据传输都是建立在 TCP 的连接,所以,如果从两者的本质来讲并没有多大的区别,你非要给 GET 方法加上 request body,给 POST 方法加上 URL 参数都是行得通的,HTTP 协议对于 GET 和 POST 其实并没有长度限制。

因而,两者的区别更多地体现在使用规范上,从使用规范上来说:

GET 浏览器回退是无害的,而 POST 会再次提交请求。
GET 产生的 URL 地址可以被书签收藏,并且被浏览器缓存,而POST不能书签收藏也不能缓存。
GET 只能进行 URL 编码,而POST 支持多种编码方式。
GET 参数通过 URL 传递,并且长度有限制,而 POST 放在 request body 并且长度没有限制。并且,正因为这个原因, GET 比 POST 更不安全,因为参数暴露在 URL 中。

最后一个小细节:

  1. GET 产生一个 TCP 数据包,而 POST 产生两个 TCP 数据包。 对于 GET 请求,浏览器会把 http header 和
    data 一起发送出去,服务器响应 200。

  2. 而 POST 请求,浏览器会先把 http header 发送出去,服务器响应 100,然后浏览器再发送 data,服务器响应200。(当然了,并不是所有浏览器,Firefox只发一次)

幂等性指的是一次请求和多次请求某一资源具有同样的副作用。比如,你采用 GET 请求银行账户的余额,虽然结果不一定相同,可是并无副作用,因此是幂等的。而如果采用 POST 请求提交扣款,多次提交产生不同的副作用,因此不满足幂等性。

GET 请求用于获取资源,无副作用,所以是幂等的。

POST 方法与 PUT 方法的区别主要在于幂等性,POST 不具备幂等性,因为 POST 请求每次都会创建一个文件,而 PUT 方法会在服务器验证是否有 ENTITY,若有则更新该 ENTITY 而不是重新创建。

DELETE 请求用于删除资源,有副作用,但是,DELETE 同一资源,无论调用一次还是调用多次,其副作用是相同的,因此也满足幂等性。

PUT 方法用于创建或更新操作,有副作用,与 DELETE 相同,对同一资源无论调用一次还是多次,其副作用是相同的,因此也满足幂等性。

http 和 https 的区别

简单来说,http 是基于 TCP 的无连接、无状态的 HTTP 协议,而 https 则是基于在 TCP 协议之上,加了一层 SSL/TSL 协议,该协议会结合证书对客户端和服务器之间的通信进行加密,确保安全和可信。

由此引发了区别如下:

http 明文传输无加密,而 https 对通信信息进行了加密。
https 需要申请 CA 证书,并且通信过程,由于加解密过程带来额外的时间和计算的消耗。
基于 TCP 协议的 HTTP 协议,默认端口为 80,而基于 SSL/TSL 协议的 HTTPS 协议端口为 443。

https 的优劣?

相较于 http 的明文传输,https 最大的优势在于安全优势:

确保通信数据发送给正确的客户端和服务器端。
通过数据加密,防止数据的正确性、完整性。
当然,并非绝对安全,但该协议大幅度增加了攻击成本。
正因如此,https 相对于 http 明显的劣势在于开销效率:

增加计算开销,因此较为费时和低效。
ssl 证书需要费用,且功能与费用挂钩。
HTTPS 协议加密范围有限,且该信用体系安全性并不高,特别对于某些国家可以控制 CA 根证书情况下,中间人攻击一样可行。

基于TCP的应用层协议、与基于UDP的应用层协议分别有哪些?
基于TCP的有FTP、Telnet、SMTP、HTTP、POP3与DNS
基于UDP的有TFTP、SNMP与DNS
其中DNS既可以基于TCP,也可以基于UDP。

wait-time,closed-time
2019-12-05

客户端TCP状态:
CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服务器TCP状态:
CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

TIME_WAIT
是主动关闭链接时形成的,等待2MSL时间,约4分钟。主要是防止最后一个ACK丢失。
由于TIME_WAIT 的时间会非常长,因此server端应尽量减少主动关闭连接
CLOSE_WAIT
是被动关闭连接是形成的。根据TCP状态机,服务器端收到客户端发送的FIN,则按照TCP实现发送ACK,因此进入CLOSE_WAIT状态。
但如果服务器端不执行close(),就不能由CLOSE_WAIT迁移到LAST_ACK,则系统中会存在很多CLOSE_WAIT状态的连接。
此时,可能是系统忙于处理读、写操作,而未将已收到FIN的连接,进行close。此时,recv/read已收到FIN的连接socket,会返回0。

TIME_WAIT:表示主动关闭,通过优化系统内核参数解决。
CLOSE_WAIT:表示被动关闭,需要从程序本身出发。

redis基本数据类型
redis一共分为5中基本数据类型:String,Hash,List,Set,ZSet

手写单例模式
懒汉式,双重检验锁,饿汉式,静态内部类,枚举

相关标签: java面经

推荐阅读