JAVA中Switch-case底层实现

Java语言中的Switch-case语句有两种实现方法,如果case值能够编码成一个索引表,则实现成tableswitch指令,否则实现为lookupswitch指令。

如何理解能编码成一个索引表?我的理解是case的值比较集中的话,就可以编码成一个索引表。

如下面的Switch-case语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
switch (N){
case 1:
System.out.println("");
case 2:
System.out.println("");
case 3:
System.out.println("");
case 5:
System.out.println("");
case 6:
System.out.println("");
case 7:
System.out.println("");
case 8:
System.out.println("");
case 11:
System.out.println("");
case 13:
System.out.println("");
case 14:
System.out.println("");
}

编译后,查看Class文件,编译器自动帮我们补全了1~14之间的其他没有写出来的case4,9,10,12

阅读更多
从JAVA虚拟机的角度看JAVA重载与重写

1. 重载

最近在看JAVA虚拟机相关的内容,从JAVA虚拟机的角度上了解到了重载OverLoad和重写Override在JAVA虚拟机的底层(指令集)层面是如何实现的,所以写下此文留作记录

首先还是了解一些重载和重写的概念,重载和重写并不只是JAVA的专属概念,在很多编程语言中都有重载和重写的体现。

  • 重载 Overload:一般是用于在同一个类内实现若干个方法名称完全相同,而方法的参数在类型上或者在个数上又或者是在参数顺序上有所不同。

tips:在Java语言中,要重载一个方法,除了要与原方法具有相同的简单名称之外,还必须拥有一个与原方法不同的特征签名,特征签名是指一个方法中各个参数在常量池中的字段符号引用的集合。注意,返回值是不会包含在特征签名之中的,所以Java语言里面是无法仅仅依靠返回值的不同来对一个已有的方法进行重载的,因为他们的特征签名还是相同的。但是在Class 文件格式当中,特征签名的范围就要更大一些了,因为Class文件区分方法靠的是方法的描述符(方法的参数和返回值都会影响到描述符),所以只要描述符不是完全一致的两个方法就可以共存。所以在JVM层面,仅仅返回值不同,仍然可以重载成功,因为方法的描述符不同了,两个方法可以共存

阅读更多
ComSec概念概述

ComSec总结

这学期选修了bintou老师的ComSec计算机安全课,上课期间觉得自己学的马马虎虎的,学习了一些计算机安全中的密码学算法和安全概念,但对这些概念都不是特别清晰,期末复习的过程中,对其中的一些算法和概念更理解了一些,趁着刚考完还没忘记,总结一波挂在博客,不当之处,欢迎指正。

公钥密码学概述

公钥密码学也称为非对称密码学,与传统的对称密码学区别在于,加密和解密使用不同的密钥,也就是所说的key,其中公开出来的密钥是公钥,另一个是私钥,由持有者严格保密。且公钥密码是基于数学函数而不是基于替换和置换。

公钥密码学提出的解决的基本问题包括有

  1. 密钥交换
  2. 数字签名

公钥密码的六个组成成分分别是明文密文公钥私钥加密算法解密算法

阅读更多
SpringMVC 前端数据传一个对象的值

这两天在写SpringMVC,从前端传入一个对象的各个属性的值时,后端对象没有接收到值,debug了很久。

首先写了一个实体类User

如下:

1
2
3
4
5
6
7
8
package com.luo.pojo;

public class User {
public String name;
public int age;
public int id;
}

然后是一个简单的控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package com.luo.controller;

import com.luo.pojo.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
public class HelloController {

@RequestMapping("/user")
public String hello(User user){
System.out.println(user.toString());
System.out.println(user.age);
System.out.println(user.id);
System.out.println(user.name);
return "hello";
}
}

利用Tomcat部署后,在本地请求http://localhost:8080/luo/user?age=15&name=luo&id=10

后端获取的结果为:

age=0
id=0
name=Null

debug了一晚上,结果发现是自己看教程的时候太粗心了居然没有写set方法,果然写了set方法后成功解决,获取到了对应的值。

因此猜想从前端传值的注入方式是set方法注入,又想起Spring Bean对象注入的方式有set方法注入构造器方式注入,好奇心所以想试一下能否通过构造函数注入,于是在User类中添加了全参构造函数

阅读更多
JAVA动态代理

代理

最近在看JAVA动态代理的东西,写了这篇文章记录一下自己的理解,不当之处,欢迎指正!

1 现实中的代理

代理,在我们平时的生活中就有很多的体现,在我们的平时生活中,经常会听到中介这个词,中介就是一种代理。

房屋中介代理房东的职责,负责向租户看房子,签合同,收房租等等,房东在有代理的情况下,所需要的任务就比较简单了:提供房子,收取利润。

再如留学中介也是一种代理,留学中介帮助国际学校,面向全世界招生,帮助学校招生,同时帮忙留学生了解学校。

我理解的代理特点是:

  1. 代理和代理目标要做的事情是一致的:如留学中介(代理)和学校(代理目标)要做的事情都是:招生
  2. 但代理和代理目标要做的事情又并非完全一样的,代理常常需要做一些额外的事情:譬如房屋中介和房东虽然要做的最主要的事情是出租房子,但是房屋中介还要做一些额外的事情:带租户看房子,聊价格,签合同,甚至有时候收房租也是由中介收取的。

代理模式:在开发中,在某种情况下,在一个对象(A)不适合或不能直接访问另一个对象©时,我们需要在这两个对象直接找到一个代理(B),这就是代理模式。

阅读更多
数据结构-符号表

1 前言

最近在学习《算法4》第三章查找,里面讲述了现代应用常用的一种抽象结构符号表以及符号表的几种实现,本文仅是自己学习的记录,如有不当,欢迎指正。

现代计算机和网络使得我们能够访问海量的信息。高效检索这些信息的能力是处理它们的重要前提。

我们使用符号表这个词来描述一张抽象的表格,我们会将信息(也称之为值)存储在其中,然后按照指定的来搜索并获取这些信息。键和值的具体意义取决于不同的应用。

符号表有时也被称为字典,例如在英语字典中,键就是单词,值就是单词所对应的定义和注解

符号表有时又叫做索引,在一本书中,键是术语,而值是对应的页面

本章说明了基本的API和两种重要实现后,会学习三种经典的数据类型实现高效的符号表:二叉查找树,红黑树和散列表。

阅读更多
ComSec作业11

ComSec作业十一:数字签名

13.2 数字签名应该具有哪些性质?

数字签名一般旨在解决两种情形的问题,一是接收方伪造消息并声称该消息是来自发送方的,二是发送方拒绝承认已发送过的消息,在收发双方不能完全信任的情况下,就需要数字签名来解决这个问题。

数字签名有下列特征:

  • 它必须能验证签名者,签名日期和时间。
  • 它必须能认证被签的消息内容。
  • 签名应由第三方仲裁,以解决争执。
  • 数字签名具有认证功能。
阅读更多
串行,并发与并行

串行,并发与并行

最近看到一个问题 串行,并发与并行的区别,查阅了一些网上的资料和视频,谈谈自己的理解,不当之处,欢迎指正!

首先看两句话:

  • Concurrency is not Parallelism. 并发不是并行
  • Concurrency enables parallelism & makes parallelism(and scaling and everything) easy. 并发允许去并行,并发让并行更容易
阅读更多
Spring Autowired的一个小问题

最近学习Spring框架:在我自己写代码的过程中,发现,如果@Autowired注解用在属性上的话,最好要将该属性setter的方法去掉,起初的原因是我想测试一下当有两个Bean的类型(Type)一致是,需要让@Autowired配合使用@Qualifier才能找到唯一的bean。首先看一下我的xml文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd">

<bean id="cat222" class="com.luo.pojo.Cat">
<property name="catName" value="hao"/>
</bean>

<bean id="dog111" class="com.luo.pojo.Dog">
<property name="dogName" value="yue1"/>
</bean>

<bean id="dog" class="com.luo.pojo.Dog"> <!-- 重点看这里,有两个Dog类型的bean -->
<property name="dogName" value="yue"/>
</bean>


<bean id="people" class="com.luo.pojo.People" autowire="byType">
<property name="name" value="luo"/>
</bean>

<context:annotation-config/>

</beans>

然后我利用@Autowired 配合 @Qualifier 对dog进行自动装配:

阅读更多
DNS基本工作原理

1 需要DNS 提供服务

我们知道,在计算机网络中,因为主机之间是需要通信的,所以很重要的一件事是找到一种方式去唯一性地识别一台主机,所以就有了主机MAC地址和IP地址,MAC地址又称为物理地址,计算机对于MAC地址和IP地址当然是乐于接受的,因为它们无非就是一串数字嘛,通过转换成01比特流能很好的在计算机之间传递这种MAC地址信息和IP地址信息。但计算机终究是给人用的,特别是对计算机不熟悉的普通大众来说,人们是记不住那么多的IP地址的,所以就出现了另一种主机名,如www.example1.com,就是大家平时所说的网址嘛,访问一个网站 www.example1.com,其实就是访问一台主机名为 www.example1.com 的服务器,这种识别主机的方式更容易被人们所接受。

尽管人们喜欢这种便于记忆的主机名标识方式,但是我们知道在计算机网络中,数据的传递还是要通过定长的,有着层次结构的IP地址,为了解决这两种不同的需求,我们就需要一种能进行主机名到IP地址转换的服务,这就需要**域名系统DNS(Domain Name System)**提供服务。

阅读更多