zoukankan      html  css  js  c++  java
  • JAVA面试题

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1.说说SpringMVC的流程?
    ①SpringMvc会请所有的请求提交给DispathService,它会委托给用户程序的其他模块进行行真正的处理工作。
    ②DispathService查询一个后多个HandelMapper,找到目标给Controller。
    ③DispathService提交给目标Controller
    ④Controllere进行业务处理后,返回一个ModelAndView。
    ⑤DispathService查询一个或多个ViewResolve视图解析器,找到ModelAndView对象指定的视图对象。

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    2.Struts2是单列还是多列
    struts2中action是多例的,即一个session产生一个action。struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。
    原因是:struts 2的Action中包含数据,
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    3.说说SpringMvc设计模式?
    ①:M是模式:封装的数据提交视图显示。
    ②:V是视图:只展示数据,跟业务逻辑分离。
    ③:C控制器:用户提交的数据给业务逻辑处理,返回的数据和模型显示在视图上。
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    4.HTTP的请求方式?
    HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    5.Spring和Struts2的区别?
    ①:Spring 入口是service即前端开发,Struts2是入口是filer过滤器。
    ②:Spring基于方法开发,传递的参数是方法的形参,可以设为单例模式。
    ③:Struts2是基于类的开发,传递的参数是类的属性,可以设为多列模式。
    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    6.如何进行权限管理?
    用户认证和用户权限
    用户认证是登录的时候用户名是否存在,用户密码是否正确,登录进去之后是什么样的,就要看授权,首先要看给用户什么样的角色,
    然后给角色授权什么样的资源,不同的资源就有什么样的角色,就可以使用或看到的资源。
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    7:写一个单例模式。
    private static ConfigManager configManager;
    //简单单例
    public static synchronized ConfigManager getInstance(){

    if(configManager==null){
    configManager=new ConfigManager();
    }
    return configManager;
    }

    ---------------------------------------------------------------------------------------------------------------------------------------------------




    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1请用JAVA代码实现深搜算法,对给定的一个根节点,通过根节点查询节点的name属性为“目标”的子节点。(入参为一个Node类型的对象,Node有name属性和获取子节点的getChild方法,getChild返回值类型为List<Node>)

    广度
    深度
    TreeSet<Integer> ts = new TreeSet<Integer>();

    for(int i = 0; i < 10; i++){
    ts.add(new Random().nextInt(999));
    }
    for(Iterator<Integer> it = ts.iterator(); it.hasNext();){
    System.out.println(it.next());
    }

    2:若存在一个JS资源用于进行数据检查,要求每次加载必须使用最新的JS,请提供解决方案

    --------------------------------------------------------------------------------------------------------------------------------------------------
    3:谈谈json的加密解码

    Escape加密 unEscape解密

    escape() 函数可对字符串进行编码;

    unescape() 函数可对字符串进行解码;

    ---------------------------------------------------------------------------------------------------------------------------------------------------------
    4谈谈mybatis的缓存机制
    ①:一级缓存是session级别的缓存,作用域是在同一个session中执行两次sql语句,第一次执行完,会写到缓存内存中, 第二次会从内存中获取数据不用从数据库查询,从而提高效率, 当session结束后一级缓存也不存在,Mybatis默认开启一个一级缓存。
    ②:二级缓存是mapping级别的缓存,作用域是多个session操作sql语句,多个session去操作数据库得到的数据操作二级缓存区域,多个session可以共用二级缓存,二级缓存是跨session的。

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    5:线程的生命周期

    新建 new thread 就绪 runnable 运行 running 堵塞 blocked 死亡 dead 睡眠 sleep

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    6:多线程解决这个问题,rj,lw有同一个账户和密码,里面有2W元,每次取款只能取5K,一个人在取款,另一个人等待。用Java模拟

    @Override
    public void run() {
    synchronized (account) {
    Withdraw withdraw = new Withdraw();
    boolean flag =withdraw.withdraw(account, money);
    if(flag){
    System.out.println(name+"取款成功。余额:"+account.getMoney());
    }else{
    System.out.println("取款失败");
    }
    }
    }
    ----------------------------------------------------------------------


    public class Withdraw {
    public synchronized boolean withdraw(Account from,double money){
    if(money>5000){
    throw new RuntimeException("本次取款不能超过5000");
    }
    if(from.getMoney()>money){
    from.setMoney(from.getMoney()-money);
    return true;
    }else{
    throw new RuntimeException("余额不足");
    }
    }
    }

    -----------------------------------------------------------------------------------------
    public static void main(String[] args) {
    new Thread(new MyTest().new Atm()).start();
    }
    class Atm implements Runnable{

    @Override
    public void run() {
    Account account = new Account();
    account.setAccount("123");
    account.setMoney(20000);
    AccountThread at1=new AccountThread(account, 5000, "张三");
    AccountThread at2=new AccountThread(account, 5000, "李四");
    Thread th1=new Thread(at1);
    th1.start();
    Thread th2=new Thread(at2);
    th2.start();
    }

    }
    7说说SpringMvc设计模式?



    M是模型,封装数据提交给视图显示,
    V是视图,只显示数据,和业务逻辑分离,
    c是控制器,接受用户数据提交给业务逻辑,处理数据 , 返回数据和模型配和显示在视图上

    -----------------------------------------------------------------------------------------------------------------------------------------------
    8如何进行权限管理?
    用户认证和用户权限。
    用户认证就是在用户登录的时候认证用户是否存在,密码是否正确。在用户登录之后是什么样子,就要靠授权了,首先给不同的用户分配不同的角色,
    然后给不同的角色授权不同的资源,不同的用户也就有了不同的权限,即可使用或者可看到的资源就会因人因角色而异了。


    -----------------------------------------------------------------------------------------------------------------
    9MySQL的分页和模糊查询的单词
    like limit


    10:你们这个项目为什么有H5还要有JSP,H5不是也能实现数据交互吗
    可以用anglar和vue去做但是我们公司的老大决定要用原始jsp.

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    1.java的基本 类型
    ①int ②double ③folat ④byte ⑤login ⑥char ⑦shot ⑧:boolean

    2.说一下aop,oop的理解 相同点和不同点。
    ①:aop是面向切面的编程。
    ②:opp是面向对象编程。
    不同点:
    ①:面向目标不同. oop是面向名词,aop是面向动词.
    ②:思想结构不同。oop是纵向结构,aop是横向结构
    ③: 注重方面不同:oop注重逻辑单元的划分,aop注重的是业务处理的每个步骤和阶段。
    OOP与AOP联系:
    两者之间是一个相互补充和完善的关系。
    3.有一个数组 int[12,45,26,12]现在要插入一个数56插入之后仍然按升序排列
    /**
    * @param args
    */
    public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    //原数组
    int num[]=new int[]{1,4,6,8};
    //新建数组
    int nums[]=new int [num.length+1];
    //将原数组排序
    Arrays.sort(num);
    //遍历原数组至新数组
    for (int i = 0; i < num.length; i++) {
    nums[i]=i;
    }
    //友好提示要插入的新数字
    System.out.print("请输入您要插入的新数字");

    //接受用户输入
    int num1= input.nextInt();
    //插入的数组在新数组中的下标
    int index =num.length;
    //for循环遍历找到要插入数字的下标
    for (int i = 0; i < nums.length; i++) {
    if (num1<nums[i]) {
    index=i;
    break;
    } }
    System.out.println("要插入元素的下表为:"+index);
    //将元素后移
    for (int j = nums.length-1; j > index; j--) {
    nums[j] = nums[j-1];
    }
    //插入数字
    nums[index] = num1;
    //for循环遍历输出新数组 //插入后的数组为
    System.out.println("插入后的数组为:");
    for (int k = 0; k < nums.length; k++) {
    System.out.print(nums[k]+"");

    }
    }


    4.现在有zs,ls有一个银行账号里面有2W元,限制每次只能取5K如果一个人人正在操作另一个就等待,请用java模拟。
    5.请写出查询1000条到1001的存储过程

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    6.请写出优化数据库的策略。
    1:应尽量避免在 where 子句中对字段进行 null 值判断
    Select id from Goods where price=0;
    2: 应尽量避免在 where 子句中使用 or 来连接条件
    Select id from Goods price=10;
    Union all
    Select id from Goods price=20;
    3:对于连续的数值,能用 between 就不要用 in 了:
    Select id from Goods where price between 20 and 50;
    4:应尽量避免在 where 子句中对字段进行表达式操作
    Select id from Goods where price=2*4;
    5:很多时候用 exists 代替 in 是一个好的选择:
    Select num from a where exists(select 1 from b where num=a.num)
    6:应尽量避免在where子句中对字段进行函数操作。
    Select id from t where name like ‘abc%’;
    或者 -------------------------------------------------------------------------------------------------------------
    ①基于索引优化。 ②优化sql语句。 ③避免或简化排序。
    ④避免相关子查询。 ⑤创建使用临时表 ⑥用排序来取代非顺序存取

    ---------------------------------------------------------------------------------------------------------------------------------------------------------
    7.请简单描述一下表分区,及表分区的分类

    ①分区表就是通过使用分区技术,将一张大表,拆分成多个表分区(独立的segment),从而提升数据访问的性能,以及日常的可维护性。
    ①、范围分区(range partition)
    范围分区主要依据分区键定义时给出的键值范围,根据实际的取值,进行分区的选择,进而在相应分区中存储数据。
    ② 、列表分区(list)
    列表分区主要依据分区键定义时给出的取值列表,根据实际的取值,进行分区的选择,进而在相应分区中存储数据。
    ③、哈希分区(hash)
    哈希分区 分区主要通过hash算法确定相应数据行应该被存放到哪个分区中。
    ④、组合分区(composite partition)
    组合分区中,主要通过在不同列上,使用“范围分区”、“列表分区”以及“HASH分区”不同组合方式,进而实现组合分区。

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
    9.spring的几大模块,进行描述。
    Spring七大模块:Spring Core,AOP,ORM,DAO,MVC,WEB,Content。
    ①:Spring Core模块是Spring的核心类库,Spring的所有功能都依赖于该类库,Core主要实现IOC功能,Sprign的所有功能都是借助IOC实现的。
    ②: Aop模块:是Spring的Aop库,提供给Aop(拦截器)机制,并提供常用的拦截器,供用用户自定义和配置.
    ③:ORM模块:Spring 的ORM模块提供对常用的ORM框架的管理和辅助支持,Spring支持常用的Hibernate,ibtas,jdao等框架的支持,Spring本身并不对ORM进行实现,仅对常见的ORM框架进行封装,并对其进行管理
    ④:Dao模块:Spring 提供对JDBC的支持,对JDBC进行封装,允许JDBC使用Spring资源,并能统一管理JDBC事物,并不对JDBC进行实现
    ⑤:WEB模块 WEB模块提供对常见框架如Struts1,WEBWORK(Struts 2),JSF的支持,Spring能够管理这些框架,将Spring的资源注入给框架,也能在这些框架的前后插入拦截器。
    ⑥,Context模块 Context模块提供框架式的Bean访问方式,其他程序可以通过Context访问Spring的Bean资源,相当于资源注入。
    ⑦:MVC模块 WEB MVC模块为Spring提供了一套轻量级的MVC实现,在Spring的开发中,我们既可以用Struts也可以用Spring自己的MVC框架,相对于Struts,Spring自己的MVC框架更加简洁和方便。
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    10.springmvc的执行模式。
    ①SpringMvc会请所有的请求提交给DispathService,它会委托给用户程序的其他模块进行行真正的处理工作。
    ②DispathService查询一个后多个HandelMapper,找到目标给Controller。
    ③DispathService提交给目标Controller
    ④Controllere进行业务处理后,返回一个ModelAndView。
    ⑤DispathService查询一个或多个ViewResolve视图解析器,找到ModelAndView对象指定的视图对象。

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    1.继承跟static的运行顺序
    2.用for循环写99乘法表
    for(int i=1;i<=9;i++){
    for(int j=1;j<i;i++){
    System.out.println(i+"*"+j+"="+(i*j));
    }
    system.out.print();

    }

    3.i++的那种套路题,问i的值是多少

    4.描述servlet与flter的差异
    不能直接向用户生成响应。
    完整的流程是:Filter对用户请求进行预处理,接着将请求交给 Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。
    5.用struts循环map
    Map<String, String> strMap = new HashMap<String, String>();
    // 值为字符串
    strMap.put("first", "zxx");

    6.override与overload的区别
    Override重写是子类对父类的方法进行重新编写语句块,发生在子类中。形参列表,返回值类型,方法名都一样。
    Overload重载是在同一个类中,出现多个同名方法,形参列表不同即可。与返回值类型无关。
    7.spring的bean的作用
    ①Sinleton:bean在Spring ioc这容器,只能实例化一个实例。
    ②:protoType;一个bean可以有多个实例。
    ②request:在http请求创建一个bean,作用域在web的spring Application情形中有效。
    ④:session:在http session中,一个bean定义一个实例,作用域在web的spring Application情形中有效。
    ⑤:global :session:在一个全局http session中,一个bean定义一个实例,作用域在web的spring Application情形中有效。

    7.I0C,aop的概念与作用区别
    ioc就是控制反转也是依赖注入。通俗的讲就是如果在什么地方需要一个对象,你自己不用去通过new 生成你需要的对象,而是通过spring的bean工厂为你生成这样一个对象。
    aop就是面向切面的编程。比如说你每做一次对数据库操作,都要生成一句日志。如果,你对数据库的操作有很多类,那你每一类中都要写关于日志的方法。但 是如果你用aop,那么你可以写一个方法,在这个方法中有关于数据库操作的方法,每一次调用这个方法的时候,就加上生成日志的操作。
    9.乐观锁悲观锁是什么?
    1. 乐观锁是一种思想,具体实现是,表中有一个版本字段,第一次读的时候,获取到这个字段。处理完业务逻辑开始更新的时候,
    需要再次查看该字段的值是否和第一次的一样。如果一样更新,反之拒绝。之所以叫乐观,因为这个模式没有从数据库加锁。
    2. 悲观锁是读取的时候为后面的更新加锁,之后再来的读操作都会等待。这种是数据库锁乐观锁优点程序实现,不会存在死锁等问题。他的适用场景也相对乐观。
    阻止不了除了程序之外的数据库操作。悲观锁是数据库实现,他阻止一切数据库操作。


    10.写一个单例例子
    private Config config;
    public static Config getlist(){
    if(config==null){
    config=new Config();

    }
    return config;

    }


    11.写一个工厂模式的

    品接口

    //产品接口
    public interface ProductI {
    public void productName();
    }
    产品实体类

    public class ProductA implements ProductI {
    @Override
    public void productName() {
    System.out.println("product A");
    }
    }
    public class ProductB implements ProductI {
    @Override
    public void productName() {
    System.out.println("product B");
    }
    }
    工厂类

    // 简单工厂模式
    public class Factory {
    public ProductI create(String productName) {
    switch (productName) {
    case "A":
    return new ProductA();
    case "B":
    return new ProductB();
    default:
    return null;
    }
    }
    }
    public class Client {
    public static void main(String[] args) {
    Factory factory = new Factory();
    ProductI productA = factory.create("A");
    productA.productName();
    //
    ProductI productB = factory.create("B");
    productB.productName();
    }
    }


    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    1.SSM框架中怎么在页面当中传一个对象到controller
    @RequestMapping("save")
    public Object save(Person person){
    Person p = personService.save(person);
    return p;
    }

    2.在controller中怎么返回JSON到页面当中
    @ResponseBody
    @RequestMapping("/getJson")
    public Object getJson(){
    return new Object();
    }

    3.在controller中怎么注入service

    在XML中配置
    <content:component-scan base-package="com.zt.action.loginaction">
    在实现dao类中
    @Repository
    @Service
    @Autowired
    @Contrller
    @RequestMapping
    --------------------------------------------------------------------------------------------------------------------------------------------

    4.spring Security框架的使用流程

    -----------------------------------------------------

    5.spring Security框架的实现步骤
    SpringSecurity环境搭建(我用的是SpringSecurity 3.2)
    SpringSecurity简单测试
    自定义登录页面
    使用数据库进行用户认证、密码加密
    使用数据库进行URL资源认证
    使用数据库进行Method资源认证
    remember-me功能、验证码功能的实现

    ------------------------------------------------------------------------------------------------------------------------------------------------------
    6.spring Security框架的底层实现原理
    (1)在web.xml中配置过滤器,这样就可以控制这个项目的每个请求。
    (2)在applicationContext.xml配置,其中http标签配置如何截用户请求,和配置用户认证(固定用户、使用数据库管理用户)。
    (3)过滤器最上层为HttpSessionContextIntegrationFilter、然后是LogoutFilter
    (4)spring security中重要的类SecurityContextHolder提供几种访问SecurityContext的方式;SecurityContext,
    保存Authentication信息,和请求对应的安全信息;Authentication,展示Spring Security特定的主体
    (5)以登陆和退出为例说明,登陆成功后通过认证,认证信息保存到securityContext中并给holder。
    并可以通过String id= SecurityContextHolder.getContext().getAuthentication().getName(); 取出用户信息。
    退出时则清空securityContextHolder。

    7.在controller中response返回json字符串时返回到一半是页面是否可以接收到

    ------------------------------------------------------------------------------------------------------------------------------------------------------------


    -------------------------------------------------------------------------------------公司题目----------------------------------------------------------------------------------------------------------------------------------
    直接就是面技术,主要问的问题是:
    1.线程的生命周期
    新建 new thread 就绪 runnable 运行 running 堵塞 blocked 死亡 dead 睡眠 sleep

    2.请解释一下spring的IOC、DI和AOP


    3.mybatis的缓存机制


    4.MySQL的分页和模糊查询的单词
    limit like
    5.内连接和外连接的区别
    1、内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现
    2:外连接: 包括
    (1)左外连接(左边的表不加限制)
    (2)右外连接(右边的表不加限制)
    (3)全外连接(左右两表都不加限制)

    6.String和StringBuffer的区别

    它们都可以存储和操作字符串,即包含多个字符的字符数据。
    这和String类提供了数值不可改变的字符串。
    而这个StringBuffer类提供的字符串可以进行修改,
    当你知道字符数据要改变的时候你就可以用StringBuffer。典型的,
    你可以使用StringBuffer来动态构造字符数据。如果最后需要String,那么使用StringBuffer的toString()方法

    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


    java集合有哪些,各集合的存储方式
    set(集)、list(列表)和map(映射)。
    区别嘛 HASHMAP只有KEY和value值对应的。。set是可以自动清楚相同的元素
    list是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。
    列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。


    MySql查询优化
    简单说一下Spring
    SpringMVC工作流程
    简单说一下hibernate
    优点:
    1、程序更加面向对象;
    2、提高了生产率;
    3、方便移植(修改配置文件);
    4、无侵入性。
    缺点:
    1、效率比JDBC略差;
    2、不适合批量操作。


    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    1.java的集合类型
    2.java多线程的实现
    3.spring的优点
    轻量级 运行速度快 方便面向切面编程 降低组件之间的耦合性
    4.springIOC和AOP的理解

    5.Mybatis的缓存
    一级缓存是 SqlSession 级别的缓存
    二级缓存是 mapper 级别的缓存,多个 SqlSession 共享
    6.mybatis的Mapper实现
    <mapper namespace="org.mybatis.example.BlogMapper">
    <select id="selectBlog" resultType="Blog">
    select * from Blog where id = #{id}
    </select>
    </mapper>
    7.SpringMVC的传值方式

    表单中input的name值和Controller的参数变量名保持一致,就能完成数据绑定,如果不一致可以使用@RequestParam注解

    8.spring注解有哪些
    @Component
    @Controller
    @ Service
    @ Repository
    9.mybatis的分页
    RowBounds resultset的结果进行分页

    10.有在linux搭建服务器吗?

    11:char类型变量可以存储一个汉字吗?为什么?

    可以的, char 在java中是2个字节,而一个汉字也是占用两个字节。
    12:GET POST区别
    GET(从服务器获取)
    POST(向服务器发送请求数据)
    ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    13:java集合有哪些,各集合的存储方式
    set(集)、list(列表)和map(映射)。
    区别嘛 HASHMAP只有KEY和value值对应的。。set是可以自动清楚相同的元素
    list是其对象以线性方式存储,没有特定顺序,只有一个开头和一个结尾,当然,它与根本没有顺序的集是不同的。
    列表在数据结构中分别表现为:数组和向量、链表、堆栈、队列。
    ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------:1
    14简单说一下hibernate
    优点:
    1、程序更加面向对象;
    2、提高了生产率;
    3、方便移植(修改配置文件);
    4、无侵入性。
    缺点:
    1、效率比JDBC略差;
    2、不适合批量操作。



    --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    Hibernate的缓存有哪些,应用场景

    --------------------------------------------------------------------------------------------
    Spring两大核心分别是什么,具体说明。
    ioc和Aop


    Linux指令有了解吗
    4:怎么配置Mybatis的延迟加载
    lazyLoadingEnabled=true

    ----------------------------------------------------------------------------------------------------
    5:get和load的区别是什么
    ① get()方法执行的时候,会立即向数据库发出查询语句,
    ② 而load()方法返回的是一个代理(此代理中只有一个id属性),只有等真正使用该对象属性的时候,才会发出sql语句
    ③如果数据库中没有对应的记录,get()方法返回的是null.而load()方法出现异常ObjectNotFoundException

    6:了解序列化吗? 具体应用场景是什么

    序列化的作用就是把对象编程二进制文件,反序列化的作用是把二进制文件转化为对象。
    分布式应用。
    -----------------------------------------------------------------------------------------------------------------------------------

    7:ajax和jquery区别是什么

    8:ajax无刷新实现的原理是什么

    Ajax的原理就是:通过javascript的方式,将前台数据通过xmlhttp对象传递到后台,后台在接收到请求后,将需要的结果,再传回到前台,
    这样就可以实现不需要页面的回发,页面是数据实现来回传递,从页实现无刷新。

    最简单的一种方式是,能过JQuery来实现:
    例:$.ajax({
    url:"a.aspx?a=123",
    type:"post",
    success:function(data){

    }
    });

    浙江网新恩普软件有限公司





















  • 相关阅读:
    从 PHP 到 Java
    用Lua定制Redis命令
    见招拆招-PostgreSQL中文全文索引效率优化
    通过2-3-4树理解红黑树
    代码迁移之旅(二)- 渐进式迁移方案
    多线程编程
    Gotorch
    使用PostgreSQL进行中文全文检索
    代码重构之旅(一) 项目结构
    Linux“体检”指标
  • 原文地址:https://www.cnblogs.com/nancheng/p/8796608.html
Copyright © 2011-2022 走看看