java构造对象简洁_Java面向对象(二)

1.Error和Exception的区别

31832b8ee32f8572500d3d0a283c892a.png1.Error类,表示仅靠程序本身无法恢复的严重错误,比如说内存溢出、动态链接异常、虚拟机错误。应用程序不应该抛出这种类型的对象。假如出现这种错误,除了尽力使程序安全退出外,在其他方面是无能为力的。所以在进行程序设计时,应该更关注Exception类。

2.Exception类,由Java应用程序抛出和处理的非严重错误,比如所需文件没有找到、零作除数,数组下标越界等。它的各种不同子类分别对应不同类型异常。可分为两类:Checked异常和Runtime异常

2.Checked异常和Runtime异常的区别

1.运行时异常:包括RuntimeaException及其所有子类。不要求程序必须对它们作出处理,比如InputMismatchException、ArithmeticException、NullPointerException等。即使没有使用try-catch或throws进行处理,仍旧可以进行编译和运行。如果运行时发生异常,会输出异常的堆栈信息并中止程序执行。

2.Checked异常(非运行时异常):除了运行时异常外的其他异常类都是Checked异常。程序必须捕获或者声明抛出这种异常,否则出现编译错误,无法通过编译。处理方式包括两种:通过try-catch捕获异常,通过throws声明抛出异常从而交给上一级调用方法处理。

3.Java异常处理try-catch-finally的执行过程

try-catch-finally程序块的执行流程以及执行结果比较复杂。基本执行过程如下:

程序首先执行可能发生异常的try语句块。如果try语句没有出现异常则执行完后跳至finally语句块执行;如果try语句出现异常,则中断执行并根据发生的异常类型跳至相应的catch语句块执行处理。catch语句块可以有多个,分别捕获不同类型的异常。catch语句块执行完后程序会继续执行finally语句块。finally语句是可选的,如果有的话,则不管是否发生异常,finally语句都会被执行。

需要注意的是即使try和catch块中存在return语句,finally语句也会执行。是在执行完finally语句后再通过return退出。

4.异常处理中throws和throw的区别1.作用不同:throw用于程序员自行产生并抛出异常;throws用于声明在该方法内抛出了异常

2.使用的位置不同:throw位于方法体内部,可以作为单独语句使用;throws必须跟在方法参数列表的后面,不能单独使用。

3.内容不同:throw抛出一个异常对象,且只能是一个;throws后面跟异常类,而且可以有多个。

5.编写一段简单的log4j日志处理代码

public class Test11 {

privatestatic Logger logger=Logger.getLogger(Test11.class.getName());

public static voidmain(String[] args) {

try {

Scannerin = new Scanner(System.in);

System.out.print("请输入被除数:");

int num1= in.nextInt();

logger.debug("输入被除数:" +num1);

System.out.print("请输入除数:");

int num2= in.nextInt();

logger.debug("输入除数:" +num2);

System.out.println(String.format("%d/ %d = %d", num1, num2, num1/ num2));

logger.debug("输出运算结果:" + num1 /num2));

} catch(InputMismatchException e) {

logger.error("被除数和除数必须是整数",e);

} catch(ArithmeticException e) {

logger.error(e.getMessage());

} catch(Exception e) {

logger.error(e.getMessage());

} finally {

System.out.println("欢迎使用本程序!");

}

}

}

6.基本数据类型和包装类

1)八个基本数据类型的包装类

基本数据类型包装类

byte       Byte

boolean    Boolean

short      Short

char       Character

int        Integer

long       Long

float      Float

double     Double

2)为什么为基本类型引入包装类

基本数据类型有方便之处,简单、高效。

但是Java中的基本数据类型却是不面向对象的(没有属性、方法),这在实际使用时存在很多的不便(比如集合的元素只能是Object)。

为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行包装,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。

3)包装类和基本数据类型之间的转换

包装类------ wrapperInstance.xxxValue() ----------->基本数据类型

包装类

4)自动装箱和自动拆箱

JDK1.5提供了自动装箱(autoboxing)和自动拆箱(autounboxing)功能,从而实现了包装类和基本数据类型之间的自动转换

5)、包装类还可以实现基本类型变量和字符串之间的转换

基本类型变量------------String.valueof()------------>字符串

基本类型变量

7、Integer与int的区别

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层的表单数据的类型。

在Hibernate中,如果将OID定义为Integer类型,那么Hibernate就可以根据其值是否为null而判断一个对象是否是临时的,如果将OID定义为了int类型,还需要在hbm映射文件中设置其unsaved-value属性为0。

另外,Integer提供了多个与整数相关的操作方法,例如,将一个字符串转换成整数,Integer中还定义了表示整数的最大值和最小值的常量。

8.Java集合体系结构(List、Set、Collection、Map的区别和联系)

1f9ee3aa9cff3328caf597ac8660d788.png

2f926da459edf284d37435d179b13227.png

Collection接口存储一组不唯一,无序的对象

List接口存储一组不唯一,有序(插入顺序)的对象

Set接口存储一组唯一,无序的对象

Map接口存储一组键值对象,提供key到value的映射。Key无序,唯一。value不要求有序,允许重复。(如果只使用key存储,而不使用value,那就是Set)

9.Vector和ArrayList、ArrayList和LinkedList的区别和联系

Vector和ArrayList的区别和联系

实现原理相同,功能相同,都是长度可变的数组结构,很多情况下可以互用

两者的主要区别如下1.Vector是早期JDK接口,ArrayList是替代Vector的新接口

2.Vector线程安全,ArrayList重速度轻安全,线程非安全

3.长度需增长时,Vector默认增长一倍,ArrayList增长50%

ArrayList和LinkedList的区别和联系

ArrayList实现了长度可变的数组,在内存中分配连续空间。遍历元素和随机访问元素的效率比较高;

e3b8105b69d8879d963dedf0e0b1e8b0.png

LinkedList采用链表存储方式。插入、删除元素时效率比较高

0a5b0e8ae66566ced76050a76e0bf2ff.png

10.HashMap和Hashtable的区别和联系

实现原理相同,功能相同,底层都是哈希表结构,查询速度快,在很多情况下可以互用

两者的主要区别如下1.Hashtable是早期JDK提供的接口,HashMap是新版JDK提供的接口

2.Hashtable继承Dictionary类,HashMap实现Map接口

3.Hashtable线程安全,HashMap线程非安全

4.Hashtable不允许null值,HashMap允许null值

11.HashSet的使用和原理(hashCode()和equals())

1)哈希表的查询速度特别快,时间复杂度为O(1)。

2)      HashMap、Hashtable、HashSet这些集合采用的是哈希表结构,需要用到hashCode哈希码,hashCode是一个整数值。

3)系统类已经覆盖了hashCode方法自定义类如果要放入hash类集合,必须重写hashcode。如果不重写,调用的是Object的hashcode,而Object的hashCode实际上是地址。

4)向哈希表中添加数据的原理:当向集合Set中增加对象时,首先集合计算要增加对象的hashCode码,根据该值来得到一个位置用来存放当前对象,如在该位置没有一个对象存在的话,那么集合Set认为该对象在集合中不存在,直接增加进去。如果在该位置有一个对象存在的话,接着将准备增加到集合中的对象与该位置上的对象进行equals方法比较,如果该equals方法返回false,那么集合认为集合中不存在该对象,在进行一次散列,将该对象放到散列后计算出的新地址里。如果equals方法返回true,那么集合认为集合中已经存在该对象了,不会再将该对象增加到集合中了。

5)在哈希表中判断两个元素是否重复要使用到hashCode()和equals()。hashCode决定数据在表中的存储位置,而equals判断是否存在相同数据。

6)Y=K(X):K是函数,X是哈希码,Y是地址

12. TreeSet的原理和使用(Comparable和comparator)

1、TreeSet中的元素不允许重复,但是有序

2、TreeSet采用树结构存储数据,存入元素时需要和树中元素进行对比,需要指定比较策略。可以通过Comparable和Comparator来指定比较策略。

3、实现了Comparable的系统类可以顺利存入TreeSet。自定义类可以实现Comparable接口来指定比较策略。

4、可创建Comparator接口实现类来指定比较策略,并通过TreeSet构造方法参数传入。这种方式尤其对系统类非常适用。

13.集合和数组的比较(为什么引入集合)

数组不是面向对象的,存在明显的缺陷,集合完全弥补了数组的一些缺点,比数组更灵活更实用,可大大提高软件的开发效率而且不同的集合框架类可适用于不同场合。具体如下:

1:数组的效率高于集合类.

2:数组能存放基本数据类型和对象,而集合类中只能放对象。

3:数组容量固定且无法动态改变,集合类容量动态改变。

4:数组无法判断其中实际存有多少元素,length只告诉了array的容量。

5:集合有多种实现方式和不同的适用场合,而不像数组仅采用顺序表方式。

6:集合以类的形式存在,具有封装、继承、多态等类的特性,通过简单的方法和属性调用即可实现各种复杂操作,大大提高软件的开发效率。

14.Collection和Collections的区别

Collection是Java提供的集合接口,存储一组不唯一,无序的对象。它有两个子接口List和Set。

Java中还有一个Collections类,专门用来操作集合类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。

15.使用JDBC进行数据库操作的基本步骤

public class Test5{

private static Logger logger =Logger.getLogger(Test5.class.getName());

public static void main(String[] args){

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

// 1、加载驱动

try {

Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");

} catch(ClassNotFoundException e) {

logger.error(e);

}

try{  // 2、建立连接

conn =DriverManager.getConnection(

"jdbc:sqlserver://localhost:1433;DatabaseName=epet","jbit","bdqn");

// 3、向数据库发送SQL命令并得到结果

stmt =conn.createStatement();

rs =stmt.executeQuery("select * from dog");

//4、处理返回结果

System.out.println("\t\t狗狗信息列表");

System.out.println("编号\t姓名\t健康值\t亲密度\t品种");

while (rs.next()) {

System.out.print(rs.getInt(1)+"\t");System.out.print(rs.getString(2)+"\t");

System.out.print(rs.getInt("health")+"\t");

System.out.print(rs.getInt("love")+"\t");  System.out.println(rs.getString("strain"));

}

} catch (SQLException e) {

logger.error(e);

} finally {

// 5、关闭Statement和数据库连接

try {  if (null != rs) {rs.close();}

if (null !=stmt) {stmt.close();}

if (null !=conn) {         conn.close();}

} catch(SQLException e) {

logger.error(e);

}

}

}

}

16.Statement和PreparedStatement的区别

PreparedStatement接口继承Statement接口,因此PreparedStatement比Statement功能更强大,有人主张,在JDBC应用中,应该始终以PreparedStatement代替Statement。也就是说,在任何时候都不要使用Statement。

1、. PreparedStatement代码的可读性和可维护性。虽然用PreparedStatement来代替Statement会使代码多出几行,但这样的代码无论从可读性还是可维护性上来说.都比直接用Statement的代码高很多档次

2、PreparedStatement尽最大可能提高性能。大部分关系型数据库通过JDBC进行SQL查询,分以下4步。1.转换SQL。2.编译SQL。3.优化数据查询路径。4.执行最优化的查寻,并返回数据。Statement对于每一个SQL查询总是处理这4步。而PreparedStatement对象已经预先执行了步骤1-3,这样的话,当PreparedStatement只需要做查询动作,因此比Statement会快很多

3、PreparedStatement极大地提高了安全性。使用Statement时需要通过字符串拼接来形成SQL语句,这会导致SQL注入的安全风险。而使用预编译语句则完全避免了该风险

17.为什么引入事务?事务的基本特性。JDBC和Hibernate中如何使用事务1.事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。

2.事务具有四个特性。原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability),简称为ACID。

3.数据库事务有一列语句组成:一组DML语句、一个DDL语句、一个DCL语句

4.JDBC默认开启事务。每条SQL语句一旦执行就会立即提交到数据库。如果希望多条SQL语句为一个事务,需要关闭事务的自动提交。并且手动提交或回滚。事务操作语句有:Conn.setAutoCommit(false); conn.commit();conn.rollback();

5.Hibernate默认关闭事务的自动提交。必须手动开启事务和提交/回滚事务。

18.请使用递归算法计算n!

publicclassTest {

publicintfactorial(intn) {

if(n == 1 || n ==0){

returnn;

}else{

returnn * factorial(n -1);

}

}

publicstaticvoidmain(String[]args) {

Test test =newTest();

System.out.println(test.factorial(6));

}

}

递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。

递归算法解决问题的特点:

(1)递归就是在过程或函数里调用自身。

(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

(3)递归算法解题通常显得很简洁,但运行效率较低。所以一般不提倡用递归算法设计程序。

(4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。

4a3688c36fb7fc4722a05599a621b826.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值