java基础知识学习整理

Java的基本类型有哪些?

a) 8种基本类型:byte short int long float double char boolean

JDBC访问数据库的步骤

1) 加载JDBC驱动程序

2) 提供JDBC连接的URL

3) 创建数据库的连接

4) 创建一个Statement

5) 执行SQL语句

6) 处理结果。两种情况:1、执行更新返回的是本次操作影响到的记录数。2、执行查询返回的结果是一个ResultSet对象。

7) 关闭JDBC对象

    • 重写和重载的特点和区别?

a) 重载

简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

b) 重写

重写指的是在Java的子类与父类中有两个名称、参数列表和返回值类型都相同的方法的情况。由于他们具有相同的方法签名,所以子类中的新方法将覆盖父类中原有的方法。

重写是父类与子类之间的多态性,对父类的函数进行重新定义。

c) 区别

重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载是一个类中多态性的一种表现。

而重写是父类与子类之间的多态性,是对父类的函数进行重新定义。

 

    • 事务的特性有那些
  • a) 原子性(Atomicity)
  • 事务中的所有操作要么全部执行,要么都不执行。如果事务没有原子性的保证,那么在发生系统 故障的情况下,数据库就有可能处于不一致状态。
  • b) 一致性(Consistency)
  • 主要强调的是,如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的。所谓一致性简单地说就是数据库中数据的完整性,包括它们的正确性。
  • c) 隔离性(Isolation)
  • 即使多个事务并发(同时)执行,每个事务都感觉不到系统中有其他的事务在执行,因而也就能保证数据库的一致性。
  • d) 持久性(Durability)
  • 事务成功执行后它对数据库的修改是永久的,即使系统出现故障也不受影响。
    • final, finally, finalize的区别。
  • final 用于声明属性,方法和类, 分别表示属性不可变, 方法不可覆盖, 类不可继承.
  • finally 是异常处理语句结构的一部分,表示总是执行.
  • finalize 是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等. JVM不保证此方法总被调用.
    • 简述Servlet的生命周期
  • Servlet生命周期分为三个阶段:
  • 1,初始化阶段  调用init()方法
  • 2,响应客户请求阶段 调用service()方法
  • 3,终止阶段 调用destroy()方法

 

    • 线程的状态都有哪些?创建一个线程的常用方法有哪些?
  • 第一是创建(New)状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。
  •   第二是就绪(Runnable)状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。
  •   第三是运行(Running)状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。
  •   第四是阻塞(Blocked)状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
  •   第五是死亡(Terminated)状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪。

 

  • 一、继承Thread类创建线程子类
  •     1.在这子类中重写run方法,在run方法内写线程任务代码
  •     2.创建该子类实例,即是创建了一个线程实例
  •     3.调用该实例的start方法来启动该线程
  • 二、建一个类去实现Runnable接口
  •     1.该类去实现接口的run方法,run方法内写线程任务代码
  •     2.创建该类实例,把该实例当作一个标记target传给Thread类,如:Thread t = new Thread(该类实例);即创建一个线程对象
  •     3.调用线程的star方法来启用该线程

 

 

    • 值传递和引用传递的区别和联系
  • 值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。
  • 引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果在方法结束后被保留了下来,所以方法执行中形式参数的改变将会影响实际参数。

 

    • 阐述你对构造函数以及常量的理解?
  • 构造函数是类在实例化成对象时用来做一些事情的,而这些事情是该对象被创建时必须做的事。例如初始化属性,但不限于此。另外我们可以对构造函数进行重载,是让我们在类的实例化时能够更多元化。
  • 简单地说,用final修饰过的变量就叫常量,常量一旦定义了就不允许被修改。往大的说,定义常量,是不想让某些固定的属性或方法被调用后改变了值,或者被继承后重写。往底层说,常量存放在常量池里,在类加载之前就已经被加载,且不会改变。

 

    • List、Map、Set三个接口,存取元素时,各有什么特点?
  • List 以特定次序来持有元素,可有重复元素。即,有序可重复。
  • 访问时可以使用for循环,foreach循环,iterator迭代器 迭代。
  • Set 无法拥有重复元素,内部排序。即,无序不可重复。
  • 访问时可以使用foreach循环,iterator迭代器 迭代。
  • Map 保存 key-value 值,一一映射。key值 是无序,不重复的。value值可重复。
  • 访问时可以map中key值转为为set存储,然后迭代这个set,用map.get(key)获取value

 

    • 请写出string  stringbuffer  stringbuilder的区别

 

  • 1)可变与不可变
  •   String类中使用字符数组保存字符串,如下就是,因为有“final”修饰符,所以可以知道string对象是不可变的。
  •   StringBuilder与StringBuffer都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字符数组保存字符串,如下就是,可知这两种对象都是可变的。
  • 2)是否多线程安全
  •   String中的对象是不可变的,也就可以理解为常量,显然线程安全。
  •   AbstractStringBuilder是StringBuilder与StringBuffer的公共父类,定义了一些字符串的基本操作,如expandCapacity、append、insert、indexOf等公共方法。
  •   StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
  • StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
  • 最后,如果程序不是多线程的,那么使用StringBuilder效率高于StringBuffer。

 

      • 写出一个单例类(Singleton)
    • 1.饥汉式单例
    • public class Singleton {
    •     private Singleton(){};
    •     private static Singleton instance = new Singleton();
    •     public static Singleton getInstance(){
    •         return instance;
    •     }
    • }
    • 2.懒汉式单例
    • public class Singleton {
    •     private Singleton(){}
    •     private static Singleton instance = null;
    •     public static synchronized Singleton getInstance(){
    •         return instance==null?new Singleton():instance;
    •     }
    • }

 

 

  • 静态变量与实例变量的区别

 

  • 一种是被static关键字修饰的变量,叫类变量或者静态变量。另一种没有static修饰,为实例变量。类的静态变量在内存中只有一个,java虚拟机在加载类的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名进行访问,其生命周期取决于类的生命周期。而实例变量取决于类的实例。每创建一个实例,java虚拟机就会为实例变量分配一次内存,实例变量位于堆区中,其生命周期取决于实例的生命周期。

 

  •   

 

  • 抽象类和接口有什么样的区别?  

 

  • (1)抽象类中可以包含抽象方法和实例方法,而接口中只能定义抽象方法。

 

  • (2)实现接口的类一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

 

  • (3)继承只有单根继承性,一个类只内能继承一个抽象父类,但是可以实现多个接口。

 

  • (4)抽象类中可以有构造方法,接口中不能定义抽象方法。

 

  • (5)接口中定义的变量都是静态常量。

 

  • Integer与int的区别(封装类和基本类型的区别)

 

  • (1)int是java提供的8种原始数据类型之一。Java为每个原始类型提供了封装类,Integer是java为int提供的封装类。

 

  • (2)int的默认值为0,而Integer的默认值为null,即Integer可以区分出未赋值和值为0的区别,int则无法表达出未赋值的情况,例如,要想表达出没有参加考试和考试成绩为0的区别,则只能使用Integer。

 

  • (3)在JSP开发中,Integer的默认为null,所以用el表达式在文本框中显示时,值为空白字符串,而int默认的默认值为0,所以用el表达式在文本框中显示时,结果为0,所以,int不适合作为web层的表单数据的类型。

 

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

 

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

 

  • 异常的抛出,throws、throw、try、catch、finally分别有什么意义

 

  • (1)try:指定一块预防所有“异常”的程序。

 

  • (2)catch:紧跟在try程序后面,应包含一个catch子句来指定你想要捕捉的“异常”的类型。

 

  • (3)throw:用来明确地抛出一个“异常”。

 

  • (4)throws:标明一个成员函数可能抛出的各种“异常”。

 

  • (5)finally:不管发生什么“异常”都被执行一段代码

 

 

 

  • 单例模式的两种形式有什么区别

 

  •     单例模式有以下特点:(1)、单例类只能有一个实例。(2)、单例类必须自己创建自己的唯一实例。(3)、单例类必须给所有其他对象提供这一实例。单例模式主要分为饿汉式和懒汉式。懒汉式单例模式代码如下:

 

  • public class Singleton {  
  • private Singleton() {}  
  • privatestatic Singleton single=null;  
  • Public synchronizedstatic Singleton getInstance() {  
  • if (single == null) {    
  • single = new Singleton();  
  • }    
  • return single;  
  • }  
  • }  

 

  •  只有在调用getInstance方法时才会创建该类的对象。

 

  •  饿汉式单例模式代码如下:

 

  • public class Singleton1 {  
  • private Singleton1() {}  
  • privatestaticfinal Singleton1 single = new Singleton1();  
  • //静态工厂方法   
  • publicstatic Singleton1 getInstance() {  
  • return single;  
  • }   
  • }  

 

  •  饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变。

 

  • Java 中 sleep 方法和 wait 方法的区别?

 

  • (1).sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,将执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。

 

  • (2).wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/ServletGo/p/9875475.html