【牛客网java练习错题笔记】 --Java基础打卡day005
01 try括号里有return语句, finally执行顺序
return执行到中间的时候发现finally,则先不返回,把值暂存到本地栈,等finally运行之后,如果finally里有返回语句,那么以finally为主,否则才把本地栈里的返回值真的返回。
02 静态变量:
因为 i 是static
的,是类属性
,所以不管有多少对象,都共用的一个变量。
03 关于依赖注入,下列说法中错误的是()
依赖注入和控制反转是同一概念:
依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源
;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源
。
04 for循环的执行次序:
for循环的执行顺序:1.先执行初始化条件
,2.执行判断条件
,3.如果满足2的条件,执行循环体中代码
;4.执行foo(‘c’), 5.初始化条件不再执行
,从2开始执行
05 在Web应用程序中,()负责将HTTP请求转换为HttpServletRequest对象
Apache就是一个Http服务器,Tomcat是一个web容器,静态的htmlApache还可以处理,但是动态的需要转发给Tomcat去处理了,比如jsp页面,请求先经由Apache转发给Tomcat再由Tomcat解析请求。所以应该是web容器去解析成request对象。
06 Java运行时内存分为线程共享和线程私有两部分,哪些属于线程共享部分?
共享的资源有:
堆
由于堆是在进程空间中开辟出来的,所以它是理所当然地被共享的;因此new出来的都是共享的(16位平台上分全局堆和局部堆,局部堆是独享的)
全局变量
它是与具体某一函数无关的,所以也与特定线程无关;因此也是共享的
静态变量
虽然对于局部变量来说,它在代码中是“放”在某一函数中的,但是其存放位置和全局变量一样,存于堆中开辟的.bss和.data段,是共享的
文件等公用资源
这个是共享的,使用这些公共资源的线程必须同步。Win32 提供了几种同步资源的方式,包括信号、临界区、事件和互斥体。
独享的资源有
栈
栈是独享的
寄存器
这个可能会误解,因为电脑的寄存器是物理的,每个线程去取值难道不一样吗?其实线程里存放的是副本,包括程序计数器PC
07
Collection
-----List
-----LinkedList 非同步
----ArrayList 非同步
,实现了可变大小的元素数组
----Vector 同步
------Stack
-----Set 不允许有相同的元素
Map
-----HashTable 同步
,实现一个key--value映射的哈希表
-----HashMap 非同步
-----WeakHashMap 改进的HashMap,实现了“弱引用”
,如果一个key不被引用,则被GC回收
08 将main()方法给出的字节数组,将其显示到控制台:
out是java.lang.System
类中的一个字段,out是“标准“”输出流,public static final PrintStream out
,
out是PrintStream
类型,PrintStream是包装流,你传入什么,他就输出什么
09 volatile关键字
volatile到底做了什么
- 禁止了指令重排
- 保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量值,这个新值对其他线程是立即可见的
- 不保证原子性(线程不安全)
10 程序的输出结果。
class Base
{
public void method()
{
System.out.println("Base");
}
}
class Son extends Base
{
public void method()
{
System.out.println("Son");
}
public void methodB()
{
System.out.println("SonB");
}
}
public class Test01
{
public static void main(String[] args)
{
Base base = new Son();
base.method();
base.methodB();
}
}
编译不通过。
Base base=new Son();
是多态的表示形式。父类对象调用了子类创建了Son对象。
base调用的method()方法就是调用了子类重写的method()方法。
而此时base还是属于Base对象,base调用methodB()时Base对象里没有这个方法,所以编译不通过。
要想调用的话需要先通过SON son=(SON)base;
强制转换,然后用son.methodB()
调用就可以了。
10 结果集
1、PreparedStatement 继承 Statement
, PreparedStatement 实例包含已编译的SQL 语句
, 所以其执行速度要快于 Statement 对象。
2、作为Statement 的子类
,PreparedStatement 继承了 Statement 的所有功能。三种方法execute
、 executeQuery
和executeUpdate
已被更改以使之不再需要参数
3. PreparedStatement尽最大可能提高性能. 最重要的一点是极大地提高了安全性.