今日练习情况:
- 洛谷日常刷题;
- 牛客网刷题;
1.关于Statement类
执行SQL语句时必须创建一个statement对象,statement对象用于将SQL语句发送到数据库。有三种statement类:Statement
、PreparedStatement
(它从 Statement 继承而来)和 CallableStatement
(它从 PreparedStatement 继承而来)。它们都专用于发送特定类型的 SQL 语句.
Statement
对象用于执行不带参数的简单 SQL 句,可通过字符串拼接,但是他存在sql注入的危险;
PreparedStatement
对象用于执行带或不带 IN 参数的预编译 SQL 语句,可以防止sql注入;
CallableStatement
对象用于调用数据库已存在的存储过程。
而BatchedStatement
用于批量操作数据库,BatchedStatement不是标准的Statement类。
2.对于非运行时异常,程序中一般可不做处理,由java虚拟机自动进行处理。
错误
Java异常都继承自类Throwable,Throwable子类有Error和Exception,其中Exception又分为运行时异常和编译时异常(其他异常)。编译时异常是未雨绸缪性质的异常,是防范,需要显示处理。运行时异常是程序员问题造成,并不强制进行显示处理。
非运行时异常是已检查异常
,程序中需要处理。
派生于Error
和 RuntimeException
类的所有异常称为未检查异常
,其他的都是已检查异常
。
3.容器、组件
JPanel
是 Java图形用户界面(GUI)工具包swing中的面板容器类
,包含在javax.swing 包中,是一种轻量级容器,可以加入到JFrame窗体中。JPanel默认的布局管理器是FlowLayout,其自身可以嵌套组合,在不同子容器中可包含其他组件(component),如JButton、JTextArea、JTextField
等,功能是对窗体上的这些控件进行组合,相当于C++和C#中的Panel类。
JButton
、JTextField
是包装器类,包装类主要用来满足容器类添加的元素必须是对象的需要,用来将一般基本数据类型变量转化为对象。
4.JAVA中参数传递
1.在方法中,修改一个基础类型的参数不会影响原始参数值
2.在方法中,改变一个对象参数的引用不会影响到原始引用
3.在方法中,修改一个对象的属性会影响原始对象参数
4.在方法中,修改集合和Maps的元素会影响原始集合参数
5.Appletviewer
1.J2SDK
是java 2 Software devolop kit -- java2软件开发包
(Java Development kit(JDK)、Java Runtime Environment(JRE)和Java
Plug-in)。
JDK是开发包,是应用程序的开发环境;API应用程序编程接口,是一些预先定义的类,我们写程序的时候可以直接使用这些已经被打包的类来做具体的应用,在搭建jdk的时候就包含了API。
2.Appletviewer
是一种小程序浏览器,是一种执行在Html文件上的JAVA小程序的JAVA浏览器;
appletviewer.exe执行选项参数中并没有jar选项。
appletviewer可执行没有main函数的继承applet类的 java 类。类似于WEB上开发的java类,不需要写main函数
6.String类底层
这里涉及到String类的底层知识,String类是final类,不能被继承且他所有的成员方法都是final方法,String底层使用char数组来保存字符串。
String str1="hello"
,这样的创建方法使得字符串在常量池
中;
而String str1=new String("hello")
,这样的创建,str1
则是在堆中,==
则是判断连个两个对象内存地址是否相同即是否是同一个(并不是判断是不是字符串相同);
用+拼接字符串时
,会创建一个新对象并返回。且String str1="hello"
在编译的时候就已经知道,而String str2=“he”+ new String(“llo”);是在运行的时候才知道。如果使用str1.equal(str2)
那么答案是true,因为,equal
对其重载了.
7.垃圾收集
finalize与C++析构,C++中的析构函数调用的时机是确定的(对象离开作用域或delete掉),但Java中的finalize的调用具有不确定性
线程的释放是在run()方法结束以后,此时线程的引用可能并未释放。
8.解决哈希冲突的开放定址法
threadlocal 使用开放地址法 ,hashmap 采用的链地址法(分离链表法)。
9.静态/动态类型的面向对象编程语言
1、动态语言
是一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。通俗点说就是在运行时代码可以根据某些条件改变自身结构。
主要动态语言:Object-C、C#、JavaScript、PHP、Python、Erlang
。
2、静态语言
与动态语言相对应的,运行时结构不可变的语言就是静态语言。如Java、C、C++
。
10.锁资源问题
下列哪些操作会使线程释放锁资源?
A.sleep()
B.wait()
C.join()
D.yield()
正确答案: B C
1.sleep()方法
sleep会使当前线程睡眠指定时间,不释放锁
2.wait()方法
wait()和notify()
必须在synchronized函数或synchronized block
中进行调用。如果在non-synchronized
函数或non-synchronized block
中进行调用,虽然能编译通过,但在运行时会发生IllegalMonitorStateException
的异常。
wait会使当前线程回到线程池中等待,释放锁,当被其他线程使用notify,notifyAll唤醒时进入可执行状态
3.yield方法
暂停当前正在执行的线程对象。
yield()
只是使当前线程重新回到可执行状态,所以执行yield()
的线程有可能在进入到可执行状态后马上又被执行。yield()
只能使同优先级或更高优先级的线程有执行的机会。yield不会释放锁,只是让出CPU,从“运行状态”到“就绪状态”
。
4.join方法
等待调用join方法的线程结束,再继续执行。如:t.join();//主要用于等待t线程运行结束,若无此句,main则会执行完毕,导致结果不可预测。
当前线程调用 某线程.join()时会使当前线程等待某线程执行完毕再结束,底层调用了wait,释放锁