admin 管理员组

文章数量: 1086019

java核心概念

1 java的8种基本数据类型

  1. byte-1:Byte
  2. short-2:Short
  3. int-4:Integer
  4. long-8:Long
  5. float-4:Float
  6. double-8:Double
  7. char-2:Character
  8. boolean-1:Boolean

2 jdk和jre的区别

  1. jdk:java开发工具包,是完整的java软件开发包,包含jre和jvm。
  2. jre:java运行时环境,包括java虚拟机,还有一些插件。

3 static关键字的意义,java中是否可以覆盖static的方法

  1. 意义:static修饰的成员变量或者是成员方法是静态的,在类加载的时候就加载了,不需要创建实例(对象)访问。
  2. static修饰的方法不能被覆盖,因为static修饰的方法是静态的,覆盖是动态的。

4 是否可以在static环境中访问非static变量

不能,static变量属于类,在类加载的时候就加载了,但是非static变量属于对象,类加载的时候还没有创建对象。

5 java中的构造函数,构造函数的重载,构造函数的复制?

  1. java通过构造函数创建对象,在没有提供构造函数的情况下会生成一个默认的空参构造函数
  2. 构造函数的重载和方法的重载类似,每个构造器都有不同的参数列表
  3. java不支持复制构造函数

6 java支持多继承吗

  1. java的类不支持多继承
  2. java的接口支持多继承

7 接口和抽象类的区别

  1. 接口

    1. 接口中所有的方法都是抽象的
    2. 接口可以多继承
    3. 接口中声明的变量默认都是final修饰的
    4. 接口中的成员函数默认都是public的
    5. 接口不能被实例化
  2. 抽象类

    1. 抽象类中可以包括抽象方法和非抽象的方法
    2. 抽象类只能单继承
    3. 抽象类可以包含非final修饰的变量
    4. 抽象类成员函数可以是private,protected,public
    5. 抽象类也不能被实例化,但是抽象类具有main方法可以被调用

8 值传递和引用传递

  1. 值传递:是针对基本类型的变量而言,传递的是该变量的副本,不影响原变量
  2. 引用传递:传递的是该变量的地址,影响原变量

9 java集合类框架的基本接口

  1. Collection:代表一组对象,每一个对象都是它的子元素
  2. Set:不包含重复元素的Collection
  3. List:有顺序的Collection,可以包含重复元素
  4. Map:key-value映射

10 Iterator和Listiterator的区别

  1. iterator:可以遍历Set和List集合,只能向前遍历
  2. ListIterator:只能遍历List,可以向前向后遍历,实现了Iterator接口

11 java创建对象的四种方式

  1. new关键字

  2. 反射

    1. Class.newInstance
    2. Constructor.newInstance
  3. clone :实现Cloneable接口,复用clone方法

  4. 反序列化

12 解决hash冲突

  1. 链地址法:hashMap使用的方法

  2. 在哈希法:提供多个哈希函数,第一个重复换一个函数在计算

  3. 建立公共溢出区:

  4. 开放定址法:

    1. 线性探测法

      当a和b的hash值冲突,a正常计算hash值,b的hash值为a后面最近的未被占用的hash值

      f(key) = (f(key)+<1,2,3…m-1>) % m

    2. 二次探测法:避免线性探测造成的堆积

      f(key) = (f(key)+(或-)<12,22,32…m2>) % m

13 throw和throws的区别

  1. throw:在程序中抛出一个异常
  2. throws:在方法体中声明要抛出的异常

14 Class.forName()方法的作用,反射

初始化参数指定的类,返回Class对象,将目标类加载到内存中.

15什么是servlet

severlet是客户端请求并产生动态网页内容的java类.

14 x.equals(y)==true,但是hash code不同,是否正确

正确。如果是在hashSet或者是HashMap中则不对。

15 乐观锁和悲观锁的理解

​ 乐观锁:比较乐观,认为别人不会在自己操作的时候修改数据,不会上锁,在修改提交更新数据的时候会判断别人有没有更新数据,如果别人没有修改更新,当前对象对数据操作成功,否则根据不同的实现方式执行不同的操作.可以提高吞吐量.
​ 悲观锁:每次对数据进行操作都会上锁,悲观的认为每次自己拿数据别人都会对数据进行修改.java的synchronized的实现是基于悲观锁的

16 线程池

​ 线程池是为了解决线程大量爆发的问题而设计的,通过几个有限的线程给大量的操作去服务,目的是减少创建和销毁线程的时间,提高程序效率,对于执行时间比较长的线程并不是很建议使用线程池,线程池不能很好的控制线程的状态.

17 静态变量和普通变量的区别

​ 1-静态变量就是static变量,是所有对象共享的,在程序第一次加载的时候会初始化,只有一个副本(所有对象共享)<初始化顺序是按照定义顺序来的>
​ 2-普通变量是随着对象的创建而产生的,在创建对象的时候会初始化(每个对象创建不同的副本).

18 java有哪些锁

  1. 悲观锁和乐观锁
    1. 悲观锁:每次操作数据都会上锁,适合写操作多的场景
    2. 乐观锁:判断其他事务是否会就改数据,如果修改了就拒绝更新,适合读操作多的场景
  2. 公平锁和非公平锁
    1. 公平锁:根据顺序访问数据
    2. 非公平锁:随机获取锁访问数据
  3. 共享锁和独享锁
    1. 共享锁:读锁,可以查看数据,不能修改数据
    2. 独享锁:排它锁,同时只能被一个事务占用
  4. 可重入锁和不可重入锁
    1. 可重入锁:递归锁,外层事务对数据进行锁定,内层的事务可以继续访问数据
    2. 不可重入锁:事务中的某个方法获取锁,其他锁阻塞
  5. 自旋锁
    1. 如果锁被其他事务获取,就一直循环判断等待,一直到获取到锁

19 面向对象的特征

  1. 抽象:把显示中的一个事物抽象成Java的对象
  2. 继承:继承是为了提高代码的复用性,子类可以继承父类公有的方法和属性
  3. 封装:就是把数据通过设置权限的方式封装起来,达到保护的目的。
  4. 多态:是指不同的对象对同一消息做出响应。

20 &和&&的区别

  1. &是位运算符,表示按位与运算
  2. &&是逻辑位运算符,表示逻辑与

21 java序列化和反序列化

  1. 序列化:将对象转化为字节序列的过程
  2. 反序列化:将字节序列转化为对象

22 序列化的实现

让目标对象的类实现Serrializabale接口

23 如果对象里面部分数据不想被序列化如何处理

在字段前加transient关键字

transient private String username;//不参加序列化

24 String、StringBuffer和StringBuilder的区别?

  1. String:作为字符串操作基本类型,String提供了长度不可变的字符串。
  2. StringBuffer:提供长度可变的字符串,线程安全,但是效率低一些。
  3. StringBuilder:提供长度可变的字符串,线程不安全,但是效率要高一些。

25 重载(Overload)和重写(override)的区别

  1. 重载:发生在同一个类中,方法名相同,参数列表不同,与返回值类型无关
  2. 重写:发生在不同的类中,子类重写父类的方法,实现接口重写接口的方法;方法名相同,参数列表不同,返回值类型相同或为其子类,访问权限不能严与父类。

26 abstract class 和interface 有什么区别?

  1. abstract class(抽象类):可以有抽象方法和普通方法,抽象方法要被子类重写,除非子类是抽象类,可以有自己的属性,只能单继承。方法的修饰符可以是任意的。
  2. interface(接口):只能有抽象方法,可以多继承,所有方法都需要被实现类实现,定义的属性默认都是java public static final修饰的。方法的修饰符默认是public的

27 final在Java中的作用

  1. final修饰的类叫最终类,类不能被继承。
  2. final修饰的方法不能被重写。
  3. final修饰的变量叫常量,常量必须初始化,值不能被改变。

28 final、finally和finalize的区别

  1. final:修饰符,修饰类为最终类不能被继承,修饰方法不能被重写,修饰变量为常量不能被修改。
  2. finally:try-catch-finally,默认会执行的模块
  3. finalize:Java垃圾回收机制中的方法,在执行垃圾回收的时候调用回收对象的该方法。

29 如何决定使用HashMap还是TreeMap?

  1. TreeMap<key,value>的key值是要求实现Comparable,所有TreeMap默认按照Key值升序排序,基于红黑树.继承自AbstractMap
  2. HashMap<key,value>的key是基于hashCode(),分布是散列的,不支持排序,是基于数组和链表的.继承自SortedMap

结论:在需要有序的时候使用TreeMap,否则建议使用HashMap(效率高)

30 单例模式的几种写法

30.1 饱汉模式

// 饱汉
// UnThreadSafe
public class Singleton1 {private static Singleton1 singleton = null;private Singleton1() {}public static Singleton1 getInstance() {if (singleton == null) {singleton = new Singleton1();}return singleton;}
}
  1. 绝对的线程安全
// 饱汉
// ThreadSafe
public class Singleton1_1 {private static Singleton1_1 singleton = null;private Singleton1_1() {}public synchronized static Singleton1_1 getInstance() {if (singleton == null) {singleton = new Singleton1_1();}return singleton;}
}
  1. DCL0.1
// 饱汉
// UnThreadSafe
public class Singleton1_2 {private static Singleton1_2 singleton = null;public int f1 = 1;   // 触发部分初始化问题public int f2 = 2;private Singleton1_2() {}public static Singleton1_2 getInstance() {// may get half objectif (singleton == null) {synchronized (Singleton1_2.class) {if (singleton == null) {singleton = new Singleton1_2();}}}return singleton;}
}
  1. 性能好
// 饱汉
// ThreadSafe
public class Singleton1_3 {private static volatile Singleton1_3 singleton = null;public int f1 = 1;   // 触发部分初始化问题public int f2 = 2;private Singleton1_3() {}public static Singleton1_3 getInstance() {if (singleton == null) {synchronized (Singleton1_3.class) {// must be a complete instanceif (singleton == null) {singleton = new Singleton1_3();}}}return singleton;}
}

30.2 饿汉模式

// 饿汉
// ThreadSafe
public class Singleton2 {private static final Singleton2 singleton = new Singleton2();private Singleton2() {}public static Singleton2 getInstance() {return singleton;}
}

30.3 Holder模式

// Holder模式
// ThreadSafe
public class Singleton3 {private static class SingletonHolder {private static final Singleton3 singleton = new Singleton3();private SingletonHolder() {}}private Singleton3() {}public static Singleton3 getInstance() {return SingletonHolder.singleton;}
}

30.4 枚举模式

// 枚举
// ThreadSafe
public enum Singleton4_1 {SINGLETON("enum is the easiest singleton pattern, but not the most readable") {public void testAbsMethod() {print();System.out.println("enum is ugly, but so flexible to make lots of trick");}};private String comment = null;Singleton4_1(String comment) {this.comment = comment;}public void print() {System.out.println("comment=" + comment);}abstract public void testAbsMethod();public static Singleton4_1 getInstance() {return SINGLETON;}
}

31 java中的注释

  1. 单行注释
  2. 多行注释
  3. 文档注释 : 一般用于注释类和方法
//这是一个单行注释/*
这是一个多行注释
*//**
*这是一个文档注释
*/

32 引用数据类型

  1. String
  2. 数组
  3. 对象

33 静态代码块,构造代码块,局部代码块

  1. 静态代码块,在类加载的时候加载,只加载一次;
  2. 构造代码块,在方法外部,每次创建对象都会加载一次;
  3. 局部代码块,在方法内部,每次调用方法加载.
  • 执行顺序: 静态代码块->构造代码块->构造方法->局部代码块

本文标签: java核心概念