概述
Generics泛型
1. what is generics?
把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型;
即在定义类,接口,或方法时,将类型(类或接口)作为参数
泛型毕竟也是一个类型,一个参数化类型,引用型类型。
2.what is benefits of generics?
Java泛型设计原则:只要在编译时期没有出现警告,那么运行时期就不会出现ClassCastException异常.
- 在编译时有更强的的检测性,尽早发现bug
- 可以消除 类型不一致的异常【即强制转换带来的classCastException】
- 提高程序可读性和稳定性【在编写集合时可以规定具体类型】
- 编写通用算法程序【DAO】,提高代码的复用性
3.how to use generics?
- 泛型类,泛型方法,子类继承/实现泛型类/接口(已知参数类型和未知参数类型两种)
—调用泛型方法举例
public class ObjectTool {
// 创建泛型方法
public <T> void show(T t){
System.out.println(t);//打印字符串
System.out.println(t.getClass().getName());//打印类型
}
// 调用泛型方法
public static void main(String[] args) {
//创建对象
ObjectTool tool = new ObjectTool();
//调用方法,传入的参数是什么类型,返回值就是什么类型
tool.show("string"); //返回String类型
tool.show(8); //返回int类型
tool.show(8.8); //返回 double类型
}
}
结果
string
java.lang.String
8
java.lang.Integer
8.8
java.lang.Double
- 类型通配符<?><? extends T> <? super T>
- 泛型在DAO中的应用
Containers容器 集合框架
1.what container does java contain?
- Collection:一个独立元素的序列,这些元素都服从一条或者多条规则。 List必须按照插入的顺序保存元素,而set不能有重复的元素。Queue按照排队规则来确定对象产生的顺序(通常与它们被插入的顺序相同)。
|Collection接口
| ├List接口
| │-├LinkedList类 :
| │-├ArrayList 类
| │-└Vector类
| │ └Stack类
| ├Set接口
| │├HashSet 类
| │├TreeSet 类
| │└LinkedSet 类
| │Queue接口 - Map:一组成对的“键值对”对象,允许你使用键来查找值。
Map
├Hashtable
├HashMap
└WeakHashMap
2.what is difference between collection and collections?
- java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作==方式。
- java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
3.Use HashMap or TreeMap?
HashMap的实现原理是数组+链表+红黑树,它保存的Entry对象是无序的,在进行添加 查找 和删除时效率较为高。
TreeMap的数据结构是红黑树,即集合中的Entry都是排好了顺序,可以根据key的排序进行有序输出value。
4.what is the implentation principle of HashMap?
jdk1.8及以后(尾插),hashMap的数据结构是由:数组+链表+红黑树实现的,即当第一次添加元素时,底层会自动创建以个容量为16的Node[]数组;
@map.put(k,v)实现原理
第一步首先将k,v封装到Node对象当中(节点)。
第二步它的底层会调用K的hashCode()方法得出hash值。
第三步通过哈希表函数/哈希算法,将hash值转换成数组的下标,下标位置上如果没有任何元素,就把Node添加到这个位置上。如果说下标对应的位置上有链表。此时,就会拿着k和链表上每个节点的k进行equal。如果所有的equals方法返回都是false,那么这个新的节点将被添加到链表的末尾。如其中有一个equals返回了true,那么这个节点的value将会被覆盖。
另外当bucket中的链表的长度>=8时且Node[]数组长度>64则链表变成为红黑树,当bucket中的元素<=6时,树又会转变为链表的形式,这样可以提高查找效率。
5.How to does Iterator work? what are the characteristics?
- 通过itertor()方法返回一个以正确顺序在list进行过迭代的迭代器
- 通过hasnext()进行判断迭代器中是否还有迭代元素
- 通过next()返回下一个迭代元素
- 通过remove()删除从迭代器中返回的最后一个元素
6.what is difference between iterator and listiterator ?
Iterator适用于set和list接口的遍历 listIterator只适用于list接口遍历
Iterator仅支持后序遍历next,而listIterator支持前序previous和后序遍历
ListIterator继承了Iterator接口,可以进行增add 删remove 插set 以及获取索引下标nextIndex;而iterator只能进行删 remove操作 ;
GUI图形化用户界面
1.what is default layouts for object of Jframe class and Jpanel class?
JFrame的默认布局BorderLayout; Jpanel的默认布局时FlowLayout
2.Introduce the swing event model?
IO流
1.How many kinds of IO stream are there in Java?
按输入方向可分为:输入流(将源头中的数据读入到程序中),输出流(将程序中的数据写到目的地);
按读写方式分为:字节流,字符流;
2.what are the characterics of random accessfile ?
随机流的指向既可以是目的地也可以是源头;即随机流进行文件读写操作的时候可以读文件,也可以写文件;支持随机访问文件,seek(long a)可以定位到文件的具体位置,getFilePointer()可以获取当前位置。
Thread多线程
1.what is difference between parallel and concurrent?
并行性:在多处理器环境下,多个线程在不同处理器上同时运行;
并发行:在单处理器环境下,在给定时间内只有一个线程在处理器中运行,其他线程进行等待
2.what are the states of Thread ?
3.what is difference between sleep() and wait()?
Sleep()方法是Thread类的静态方法,可以使当前线程进入睡眠状态,将cpu让给其他线程,睡眠结束后又和其他线程竞争cpu。不涉及线程间的通信,它不会释放对象锁!可以在任何地方使用。
wait()方法是Object类中的方法,可以通过具体对象来调用,当某个对象调用wait()方法时使得当前线程阻塞,进入该对象的,该对象需要调用notify()方法来唤醒该线程进入就绪状态,进行线程间的通信;即当线程执行了对象的wait()方法进入等待队列释放对象锁并且一般在sychronized修饰的代码块中使用。
4.Introduce the synchronization principle of processing thread which running concurrently?synchronize 同步机制
并发规则包括数据访问规则和线程活动规则两方面,数据访问规则主要由锁来实现,线程活动规则主要表现在线程调度上。
锁又分为内部锁和显示锁,内部锁由Sychronized关键字实现,sychronized可以修饰方法和代码块,所修饰的代码成为临界区。当线程执行到同步块时,Java虚拟机需要申请引导锁,只有申请成功才能执行临界区,执行完临界区锁会被Java虚拟机释放。
内部锁的非公平调度,当多个线程进行申请锁的时候,只有一个线程能够申请成功,其他线程则会进入阻塞状态进入等待队列,当锁释放,Java虚拟机唤醒等待队列的某个线程,该线程继续和其他活跃线程抢占释放的锁。
DesignPattern设计模式
1.introduce a design pattern that you are familiar with?
*单例模式:一个类只有一个实例,且该实例由自己创建
**优点:减少了内存的开销,尤其是频繁的创建和销毁实例
**缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而 不关心外面怎么样来实例化。
**分类:
**懒汉式(加锁/不加锁):需要的时候,new对象
**饿汉式:不管需不需要,都new对象 ;没有起到lazy loading的效果
**静态内部类:当需要时,通过静态内部类new对象;相比饿汉式更为合理;
**双重检查型 (判空->加锁->判空):synchronized会带来比较严重的性能开销,volatile可以禁止指令重排,避免脏读
**枚举型:自动支持序列化机制,绝对防止多次实例;避免反射攻击
JDBC数据库驱动
1.Talk about the steps of connect to the databases?
- 导入驱动jar包
- 注册驱动class.forName(“com.mysql.jdbc.Driver”):告诉程序使用MySQL数据库的驱动jar包
- 获取连接对象DriveManager.getConnection(“jdbc:mysql://localhost:3306/databaseName”,user,password)
2.Introduce the PrepareStatement?
PrepareStatement是执行sql语句的对象,可以表示一条预编译过的sql语句
优点:
- 提高性能:
数据库服务器会对预编译语句提高性能优化,由于预编译语句会重复调用,所以sql语句被数据库服务器编译器编译后的执行代码会被·缓存下来,下次调用时。只要是相同的预编译语句就不需要再编译了只要将参数传入编译过的执行代码中就会得到编译; - 安全:
防止SQL注入,使用preparestatement预编译的语句时,自己输入的内容不会和原来SQL语句发生匹配关系,仅仅是需要的参数。符合就通过,不符合就报错。
sql:案例
3.How to traverse the ResultSet?如何遍历结果集
1.可以通过while循环判断resultSet的next()方法是否为true
第一次调用next方法 光标移动到第一行,改行元素有效则返回true,第二次调用next方法光标移动到第二行,依次类推
2.为Connition中的createStatement(int type,int concurrency)方法设置相关的参数,实现ResultSet向前或向后遍历;
Type的参数是ResultSet接口中的int型static常量
**TYPE_FORWARD_ONLY:只支持游标向下移动
**TYPE_SCROLL_INSENTIVE:支持游标上下移动,但是数据库发生变化时,当前得到的结果集不变
**TYPE_SCROLL_SENTIVE:支持游标上下移动,结果集随着数据实时更新
Concurrenc参数 决定为只读模式/更新模式
**CONCUR_REDYONLY:结果集不能更新表
**CONCUR_UPDATABLE:结果集可以更新表(resultSet中有相关的更新方法)
最后
以上就是拉长长颈鹿为你收集整理的二年级JAVA期末答辩试题的全部内容,希望文章能够帮你解决二年级JAVA期末答辩试题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复