Java知识难点

*在short s1 = 1 ; 情况下,s1 = s1 + 1 ; 与 s1 += 1 ; 有什么区别?
    s1 = s1 + 1 ; 这种方式会在编译阶段报错,这里因为s1是byte类型,而数字1默认是int 类型。在java中,在s1+1时,会进行 自动类型转换 ,所以s1 + 1 会转换成int类型。而变量s1还是byte类型,将int 类型的s1 + 1赋值给byte类型的s1 ,无疑会报错。
    
    但是,“+=”是java中的一个运算符,而不是两个,所以在运算时 会进行自动类型转换。所以在编译时没有报错。
    
    总结一下,在两个变量的数据类型一样时:a+=b 和a=a+b 是没有区别的。但是当两个变量的数据类型不同时,就需要考虑一下数据类型自动转换的问题了。也就是涉及到精度了。

*在switch中,case只是匹配一个起点,有了起点之后就会从这里开始逐行向下执行,把其他case中的代码也执行。这也是为什么要使用break的原因。

*时间复杂度和空间复杂度
    时间复杂度
        一般来说,一个算法执行所消耗的时间从理论上是算不出来的,只有通过上机运行才能测试出来。当然,我们也没
        必要知道一个算法它具体执行的时间是多少,而我们又知道,一个算法花费的时间与算法中语句的执行次数是成正
        比的。哪个算法语句执行的次数多,它花费的时间就多。
        
        一个算法语句总的执行次数是关于问题规模N的某个函数,记为分f(N),N称为问题的规模。语句总的执行次数
        记为T[N],当N不断变化时,T[N]也在变化,算法的执行次数的增长速率和f(N)的增长速率相同。
        则T[N]=O(f(N)),称O(f(N))为时间复杂度的O渐进表示法。
        
    空间复杂度
    
    
        一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要
        的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据
        外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空
        间包括以下两部分。  
        (1)固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码空间
        )、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。
        (2)可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法
        有关。
        
        一个算法所需的存储空间用f(n)表示。S(n)=O(f(n))  其中n为问题的规模,S(n)表示空间复杂度。
        空间复杂度:函数中创建对象的个数关于问题规模函数表达式,一般情况用O的渐进表示法表示。
        
        

,f(n)是问题规模n的某个函数。

*Java中,int、long、char的可以入常量池的范围?
    Integer 也有常量池 范围是 -128~127
    
    Short Long 的常量池范围也是-128~127。    

    Boolean 也实现了常量池的功能。毕竟只有true和false两个值

    Character的范围0~127

*RsnfomAcessFile是java中提供的一个很强大的输入/输出类,可以随机访问

*NIO的特点是什么?
    传统的IO读入数据时,如果没有读到数据就会阻塞,也就是传统的输入和输出流都是阻塞式,而且面向流的输入和输出系统一次只能处理一个字节,因此面向流的输入和输出系统通常效率不高。    NIO是一种新的IO,使用了不同的方式来处理输入/输出,NIO采用内存映射文件的方式来处理输入/输出,NIO将文件或文件的一段区域映射到内存中,这样就就可以向访问内存一样来访问文件了。 
    
*NIO.2的特点?
    NIO.2中提供了Path、Paths、Files等工具类,其中Path可以更好的解决文件路径问题,Paths、Files是文件和路径操作的工具类。
    
*多线程中几个类的区别?
    Thread是多线程实现的基础类,但是无法共享实例变量。
    Runnable类继承Thread可以共享线程实例变量,但必须使用Thread.currentThread()方法获取当前线程类,不能使用this。
    Callable类提供call(),与run()类似,但是要更强大,call()可以有返回值,可以声明抛出异常。FutureTask类用来包装Callable对象。这两个类必须组合使用。
    
*sleep()、yield()、interrupt()、suspent()方法的区别?
    sleep是让线程计入阻塞,并且在规定时间内不会获得执行的机会,即使系统中没有其他可以执行的线程,处于sleep的线程也不会执行。
    但是,由于使用sleep后,线程计入阻塞状态,所以如果等待调度的线程比较多时,在规定的时间结束后,可能不会立即执行,
    所以线程睡眠的时间可能会比设置的要长。yield是让线程放弃本次执行的机会转入就绪状态,并不会让线程阻塞。有可能某个线程调用yield方法暂停之后,
    线程调度器又将其重新执行。其实在使用yield暂停线程后,之后与当线程的优先级别相等或更高的线程才会有执行的机会。interrupt是给线程打上中断标志,
    并通过提供的方法判断是否被标记中断,这样可以优雅的结束线程。
    suspent会使目标线程挂起,但是不会释放锁,并可以用resume方法唤醒继续执行。不推荐使用。
    
    以上的几种方式,都不会释放锁资源。
    
*Thread.stop()暴力结束线程,不管线程是什么状态,都会立刻死亡,不推荐使用。
    
*ThreadLocal<T>是java对线程隔离的支持,该类保存的所有数据在每个线程上都会有自己的副本,从而实现线程隔离。

* 死锁、饥饿、活锁的区别?
    死锁:多线程相互占用资源,导致对方得不到全部的资源,导致所有线程阻塞。活锁:如两个线程相互抢占对方的资源,导致自己的资源还是不够,
    又释放现有资源再次抢占对方资源,如此往复,导致两个线程一直得不到所有的资源。饥饿:上时间的不到调度,多数是由优先级太低引起。
    
*方法区、Java堆、Java栈、本地方法栈 的作用?
    PC寄存器:每一个线程都拥有一个PC寄存器,与线程一起创建,总是指向下一条指令的地址。每一个线程具有一个本地内存,是共享变量的一个副本,
    共享变量是在主存当中的。
    方法区:保存装载的类信息(类型的常量池、字段和方法信息、方法字节码),通常和永久区关联在一起,JDK7之后字符常量池移到Java堆中。
    Java堆:和程序开发密切相关,应用系统对象都保存在Java堆中,所有线程共享java堆,堆分代的GC来说Java堆也是分代的,GC主要的工作空间就是Java堆
    Java栈:线程私有,栈由一系列帧组成,帧保存一个方法的局部变量、操作数栈、常量池指针,每一次方法调用创建一个帧并压栈
    
*可见性 的意义?
    可见性是指一个线程修改了变量,其他线程立刻知道。(注意,是立刻知道)有3个方法可以实现:
    volatile:保证线程中每次使用的变量是主存中最新的。volatile变量的写先发生于读。 
    synchronized:在unlock之前,写变量回主存。
    final:一旦初始化,其他线程就可见
    
*synchronized存在的问题?
    使用同步代码块时在线程调用sleep方法和yield方法来暂停当前线程时,线程不会释放同步监视器。
    
*JDK中ClassLoader默认设计方式-协同工作?
    自底向上检查类是否已经加载
    自顶上下尝试加载类
    Bootstrap ClassLoader    rt.jar / -Xbootclasspath
    Extension ClassLoader    %JAVA_HOME%/bin/ext/*.jar
    
*JVM主要工作是将class文件字节码翻译成机器码
    JVM运行时数据区,也就是类加载位置,  在内存中

*int与Integer的区别?
    int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。int的默认值为0,而Integer的默认值为null
    即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer
    在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时
    ,结果为0,所以,int不适合作为web层的表单数据的类型。
    Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。
    
*三层架构和MVC
    三层架构:    视图层(View)、服务层(Service)、持久层(Dao)   ------ 分层开发思想,可用于前后端
    MVC        :    模型(Model)、视图(View)、控制器(Controller)     ------ 前端的开发模式MVC
    

*preparedStatement可以防止SQL注入,但是如果我在字符型参数使用 'or 1=1' 的形式,不会出错吗?
    预编译/预处理 是用占位符先执行一次打了一个模板,之后真正参数提交的时候,只会被当做参数,而不会被当做where条件。 


*所谓的rest风格,是不是访问的路径的使用方式的区别?动态模板与全名词路径的区别?
    一般我们现在使用的get与post都是rest的风格,还有其他的几种请求方式可能不是rest风格。

*java各种框架中的注解,如事务注解@Transaction ,它的实现原理?xml配置文件方式是dom4j+反射。
    网上找到一篇,是使用aop+反射,还有没有别的办法,比如在类加载过程中织入一些代码?
    
    使用前置通知的方式可以实现,至于类加载的方式没有尝试。
    
*使用AOP让自定义注解生效时,如何传入指定的参数,如HttpRequest?必须在切面中加入HttpRequest做传参才行吗?
    目前在网上只找到 遍历method参数的方式获取想要的参数。
    

*做权限该控制时,一个role不就是一组权限的集合吗?为什么在检测role之后还要检测权限?
    为了更细化,而且在做权限拦截的时候更方便。
    
*前后端分离中静态资源包括哪些?SpringCloud中实现的Web服务器属不属于前后端分离?
    应该属于。


*StringBuffer与StringBuilder的区别?
    String 字符串常量
    StringBuffer 字符串变量(线程安全)
    StringBuilder 字符串变量(非线程安全)
    
*html中能不能使用核心标签库和EL表达式?
    不能,jstl是jsp的,html中不能使用。
    html页面是无法用el表达式的,会引起冲突,只有jsp才可以使用el表达式

*reqestionMap的路径,加.do后可以访问,不加的话,访问/index.html也会访问/index
    因为路径先匹配的是handler
 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

起风了小猪仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值