挂面05
1.正则判断ip
IP地址的长度为32位(共有2^32个IP地址),分为4段,每段8位
用十进制数字表示,每段数字范围为0~255,段与段之间用句点隔开
0.0.0.0代表本机上任何IP地址,所以他返回false.且第一个不能为0
根据规则:每段相同,范围都在 0 ~ 255
0~255 对应的正则表达式为 ([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])
或1-9或10-99或100-199或200-249或250-255分5段
\\.
匹配一个句点
第一个不能为0 后面三个可以为0
(\\.([0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}
圆括号()是组
1、(abc|bcd|cde),表示这一段是abc、bcd、cde三者之一均可,顺序也必须一致
2、(abc)?,表示这一组要么一起出现,要么不出现,出现则按此组内的顺序出现
3、(?:abc)表示找到这样abc这样一组,但不记录,不保存到$
变量中,否则可以通过$x
取第几个括号所匹配到的项,比如:(aaa)(bbb)(ccc)(?:ddd)(eee)
,可以用3则获取到了(ccc)匹配到的内容,而$4则获取的是由(eee)匹配到的内容,因为前一对括号没有保存变量
4、a(?=bbb) 顺序环视 表示a后面必须紧跟3个连续的b
5、(?i:xxxx) 不区分大小写 (?s:.*) 跨行匹配.可以匹配回车符
public class IsIp {
public static void main(String[] args) {
System.out.println(isboolIp(""));
System.out.println(isboolIp("192.168.1.1"));
System.out.println(isboolIp("256.2.3.4"));
System.out.println(isboolIp("1.2.3.4"));
System.out.println(isboolIp("1.2.3.4.5"));
System.out.println(isboolIp("1.2.3.4."));
}
/** * 判断是否为合法IP * @return the ip */
public static boolean isboolIp(String ipAddress) {
String ip = "([1-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])(\\.([0-9]|[1-9]\\d|1\\d{2}|2[0-4]\\d|25[0-5])){3}";
Pattern pattern = Pattern.compile(ip);
Matcher matcher = pattern.matcher(ipAddress);
return matcher.matches();
}
}
2.Linux常用命令(面试题)
查看CPU使用率查看内存使用率:top
命令类似于Windows的任务管理器
查看磁盘使用率df
命令
3.linux 777的含义
chmod 777 -R *
给这个项目的所有文件夹和文件夹下的文件都授予读写和可执行权限
4.HashMap的插入过程
无参构造函数会调用另外一个具有两个参数的构造函数
public HashMap(int initialCapacity, float loadFactor)
前一个参数是数组table的初始化大小默认为16,后一个参数是装载因子,默认值为0.75.如果当前数组中实际存储的元素个数与数组长度的比值达到0.75时,数组长度会翻一倍,长度最大1<<32
2的32次方
HashMap底层是通过链表来解决hash冲突的取值时间复杂度O(1)
插入过程
(1)判断key是否为空,如果为空,则调用putForNullKey函数,putForNullKey的功能为是,查找原来HashMap中key为null的项,如果存在,则用当前的value,替换原来的value,并返回原来的value。如果不存在,则插入。之所以要单独处理,是因为如果不为null,我们需要对key进行hash映射,计算key的hash值,找到当前key在HashMap中的位置,而key为null的时候,直接默认key的hash值为0。
(2):根据某种hash算法,计算key的hash值。
(3):根据key的hash值与hash表的长度,计算当前这个key在hash表中的索引。hash(key)%len
一般是这样
(4):这个for循环的功能是:在原来的HashMap中,查找是否存在我现在正要插入的这个key,如果存在,则把此key对应的原来的value用当前这个value替换,并返回旧的value。值得注意的是,从for循环中可以发现,HashMap虽然是基于数组的,但同时也是基于链表的,因为我们知道,Hash表有可能会起冲突,即key的hash值一样,如果我们仅采用数组,那么当hash值一样时,在一个数组元素中,我们不可能存储两个值,因此,HashMap不仅基于数组,也基于链表,即先通过key的hash值,找到key在数组中的位置,然后每个hash相同的key又采用链表存储,因此,我们在用key的hash值定位到数组的位置时,仍然还要使用for循环来查找链表里是否真的存在当前这个key,从for中可以看到,e=e.next,就是找下一个节点。
5.定义一个空的hashmap默认大小为16,当计算hashcode为17时,他会扩容吗?
分情况:
存储的当前索引一般是hash(key)%len
其实是hash(key)&(length-1)
代替了取模,记住length是2的次方数。所以结果肯定是小于16,17%16=1,就在1这个桶中插入,如果原本没有,这时候有值的数组个数+1,结果与数组长度比值:大于等于0.75时,就会扩容。
6.解决hash冲突的方法
1.采用链表,链地址法,比如hashmap,jdk8还有红黑树
2.开放定址法
从发生冲突的那个单元起,按照一定的次序,从哈希表中找到一个空闲的单元。然后把发生冲突的元素存入到该单元的一种方法。线行和平方探测,双散列函数探查法
对于平方探查法,探查序列的步长值是探查次数i的两倍减l;对于双散列函数探查法,其探查序列的步长值是同一关键字的另一散列函数的值。
3.再哈希法
同时构造多个不同的哈希函数,当H1 = RH1(key) 发生冲突时,再用H2 = RH2(key) 进行计算,直到冲突不再产生
4.建立公共溢出区
将哈希表分为公共表和溢出表,当溢出发生时,将所有溢出数据统一放到溢出区。