1.请说出ArrayList、Vector、LinkedList的存储性能和特性。

ArrayList底层 数组结构,线程不安全 线程异步 效率高 查找快 增加删除慢

Vector、底层数组结构 线程同步 线程安全 效率低 存储的是键值对

LinkedList :底层双向链表结构 查找慢 增加删除快 线程异步,不安全,效率高

2.数组有没有length()这个方法?String有没有length()这个方法?

数组没有length()这个方法 但是 有length属性

String 有length()方法

集合的长度 size()

3.List、Set、Map是否继承自Collection接口?

List set 集合继承了collection接口

Map 不继承 Map本身就是一个顶层接口

4.HashMap和HashTable的区别。

都是map接口的实现类

Hashmap:可以存放null值,是线程不安全的类 线程异步 基于hash表

Hashtable:不可以存放null值 是线程安全的类 线程同步

5.List < T >与List的区别?

一个是泛型,一个是Object,后者还可能要类型转换,容易出错。

Java中的泛型是个假泛型,仅仅只是在编译器那边做了语法检查而已,和C#里的泛型不一

样的。

基本上,不管你在List<>里面写什么类型,编译通过了以后运行时全部都是Object。

Java泛型是通过类型擦除实现的,编译器的语法检查是次要的。

重要的是泛型系统可以为做更多的类型检查,借助编译器在编译期的类型检查可以减少运行

时出现类型错误的几率。

6.列出一些你常见的运行时异常。

1.nullpoionterexception (空指针异常)

2.numberformatexception (数字格式化异常)

  1. indexoutofboundsexception(数组下标越界)}
7.String和StringBuffer的区别

String 是长度不可变,一旦内容创建好,不可以更改

Stringbuffer 是长度可变的,内容可变 线程安全 实际采用的字符数组的形式存储的,当长度变了的时候,实际是将它原有的内容复制到一个新的字符数组中,再加上增加的

8.请说明Java为什么能够跨平台

{因为jvm,jre包含jvm,jdk包含jre,java语言是跨平台的而jvm不是跨平台的}

9.请简述Java的垃圾回收机制

垃圾回收由java虚拟机自动执行,不能认为的干预,System在空闲的时候回自动执行垃圾回收机制,可以通过gc方法建议执行垃圾回收,但不能确定什么时候回执行回收}

10.请分别说明public、private、static、final修饰符的含义。

{public可以修饰类、方法以及属性;private可以修饰属性、方法; Static可以修饰方法、属性,被static修饰的属性或方法随着类的加载而加载; Final可以修饰类,属性、方法,被final修饰的类不可被继承,方法不可被重写,属性 只能被赋值一次,为常量

11.请列举Java中继承了List接口的类,并说明它们的不同。

继承了list接口的类:有ArrayList:数组结构,线程不安全,增加删除慢,查询快

Linkedlist: 双向链表结构,线程不安全,增加删除快,查询慢

Vector:数组结构 线程安全 增加删除慢,查询快

12.请说明异常处理中try/catch/finally语句块的作用。并且,请阐述通过ErrorCode返回错误和抛出异常的区别。

try中放可能出现异常的代码块,catch用来异常捕获,finally一般用于一些资源关闭 和释放工作。 返回错误其异常代码下边的代码还可继续执行,而抛出异常后其后的代码不会被执行 }

13.请解释何为继承,并通过一小段代码说明继承的意义。
Public class Pet {
    
    public String name;
    
    public  Int  age;
    
    public String toString() {  
    
    return "Pet [name=" + name + ", age=" + age + "]"; }}
    
    Public class
    
     Dog  extends Pet {}
    
    Public class Test {  
    
    Public static void  main(String[] args) {
    
      Dog dog = new  Dog();
    
    dog.age = 10;   dog.name = "狗蛋儿";  
    
     System.out.println(dog.toString());}}
14.请简述接口和抽象类的区别,并说明接口在实际开发项目中的意义。

接口中只能有抽象方法,抽象类中可以有普通方法
2.接口中只能有静态常量,抽象类中可以有变量和常量

  1. 类与类:单继承 类与接口:多实现 接口与接口:多继承

4.接口“like a” 抽象类“is a”

15. 请简述对面向过程、面向对象、面向函数的理解。

{面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,

使用的时候一个一个依次调用就可以了。

面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成,一个步

骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。}

16.请说明synchronized关键字的作用,在什么情况下使用它?

{线程同步的时候使用,可以解决安全问题 修饰同步代码块或同步方法,保证安全性}

17.类的加载过程?

{1、首先加载要创建对象的类及其直接与间接父类。

2、在类被加载的同时会将静态成员进行加载,主要包括静态成员变量的初始化,静态

语句块的执行,在加载时按代码的先后顺序进行。

3、需要的类加载完成后,开始创建对象,首先会加载非静态的成员,主要包括非静态

成员变量的初始化,非静态语句块的执行,在加载时按代码的先后顺序进行。

4、最后执行构造器,构造器执行完毕,对象生成。}

18.简单介绍你所了解的Java,它的特点和优势是什么,分几个体系?

{开源、面向对象、分布式处理、可移植性、安全性、高性能、健壮性、跨平台性

1.javase 2.javaee 3.javame}

19.你所知道的集合类有哪些,主要方法是什么?

{最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 、 Vector、

Linkedlist,它们是可变大小的列表,比较适合构建、存储和操作任何类型对象的元素

列表。ArrayList 、 Vector适用于按数值索引访问元素的情形,LinkedList适用于增

删元素。 ArrayList、LinkedList线程异步,不安全,效率高,Vector线程同步,安全,

效率低。

Map 提供了一个更通用的元素存储方法。 Map 集合类用于存储元素对(称作”

键”和”值”),其中每个键映射到一个值。}

20.sleep()和wait()有什么区别?

{sleep() 方法是线程类(Thread)的静态方法,让调用线程进入睡眠状态,让出执行

机会给其他线程,等到休眠时间结束后,线程进入就绪状态和其他线程一起竞争cpu

的执行时间。

因为sleep() 是static静态的方法,他不能改变对象的机锁,当一个synchronized块

中调用了sleep() 方法,线程虽然进入休眠,但是对象的机锁没有被释放,其他线程依

然无法访问这个对象。

wait()是Object类的方法,当一个线程执行到wait方法时,它就进入到一个和该对象

相关的等待池,同时释放对象的机锁,使得其他线程能够访问,可以通过notify,

notifyAll方法来唤醒等待的线程

21.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?

java虚拟机是执行字节码文件(.class)的虚拟机进程。 因为不同的平台装有不同的JVM,它们能够将相同的.class文件,解释成不同平台所需要的机器码。正是因为有JVM的存在,java被称为平台无关的编程语言。

22.JDK和JRE的区别是什么?

jdK 是Java工具包

Jre 是Java 运行环境

JRE顾名思义是java运行时环境,包含了java虚拟机,java基础类库。是使用java语言编写的程序运行所需要的软件环境,是提供给想运行java程序的用户使用的。 JDK顾名思义是java开发工具包,是程序员使用java语言编写java程序所需的开发工具包,是提供给程序员使用的。JDK包含了JRE,同时还包含了编译java源码的编译器javac,还包含了很多java程序调试和分析的工具:jconsole,jvisualvm等工具软件,还包含了java程序编写所需的文档和demo例子程序。 如果你需要运行java程序,只需安装JRE就可以了。如果你需要编写java程序,需要安装JDK。 JRE根据不同操作系统(如:windows,linux等)和不同JRE提供商(IBM,ORACLE等)有很多版本,最常用的是Oracle公司收购SUN公司的JRE版本。如果你想查看更官方的解释,可以前往Oracle官网。

23.String、StringBuffer、StringBuilder之间区别。

String 是长度不可变的 内容一旦创建 不可以更改

Stringbuilder是长度可变的 内容可变的 线程不安全的

Stringbuffe是长度可变的 内容可变的 线程安全的 实际是以字符数组的形式存储的,更改的时候 是创建一个新的数组 将原来的内容复制到新的数组中

简要的说,String 类型和 StringBuffer 类型的主要性能区别其实在于 String 是不可变的对象, 因此在每次对 String 类型进行改变的时候其实都等同于生成了一个新的 String 对象,然后将指针指向新的 String 对象,所以经常改变内容的字符串最好不要用 String ,因为每次生成对象都会对系统性能产生影响,特别当内存中无引用对象多了以后,JVM 的 GC 就会开始工作,那速度是一定会相当慢的。

24.==和equals的区别?

1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等;
如果作用于引用类型的变量,则比较的是所指向的对象的地址

2)对于equals方法,注意:equals方法不能作用于基本数据类型的变量
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址;
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。

25.为什么不能用abstrac修饰private、final、static、构造器、属性?

abstract 修饰的类,必须被继承;abstract 修饰的方法,应被重写。

final 修饰的类、属性、方法不可被更改,所以final 修饰的方法不可以被重写。

private 修饰的类只能是内部类,private 修饰的属性、方法只能在本类中调用,重写的方法无法访问这些方法和属性。

static 修饰的方法是静态的,可以直接被类所调用,但是abstract 修饰的方法抽象方法,没有方法体不能够被直接调用,需要通过类的继承或接口实现来重写抽象方法后才能使用。

26.谈谈你对对象特征—多态的理解?

就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

27.String的常用方法有哪些?

length(),charAt(),substring(),valueof(),equals(),equalsIgnoreCase(),replace(),replaceAll(),contains()、startwhith(),endwith(),split(),indexof(),tolowcase()、

28.String str=new String(“ming”);执行时创建了几个对象?

分情况,如果new的这个字符串常量池里有,那就是一个对象,如果没有就是两个对象

29.谈谈对序列化的理解?
30.什么是反射什么是动态代理?

反射就是获取类,方法。动态代理是用代理对象实现当前类实现不了的功能也就是增强

31.多线程相关?
一、什么是多线程
二、线程启动方式
三、线程安全问题如何解决
32.解释下protected?
33.StringBuilder和StringBuffer的区别?

java 大对象方法结束时 释放内存_java 大对象方法结束时 释放内存

34.cglib和jdk的核心?
35.乐观锁和悲观锁
36.垃圾回收机制

Java语言中一个显著的特点就是引入了垃圾回收机制,使c++程序员最头疼的内存管理的问题迎刃而解,它使得Java程序员在编写程序的时候不再需要考虑内存管理。由于有个垃圾回收机制,Java中的对象不再有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存。ps:内存泄露是指该内存空间使用完毕之后未回收,在不涉及复杂数据结构的一般情况下,Java 的内存泄露表现为一个内存对象的生命周期超出了程序需要它的时间长度,我们有时也将其称为“对象游离”。

37.内存什么时候会溢出,溢出的解决方案?

内存溢出是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。 引起内存溢出的原因有很多种,常见的有以下几种:
  1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
  2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
  3.代码中存在死循环或循环产生过多重复的对象实体;
  4.使用的第三方软件中的BUG;
  5.启动参数内存值设定的过小;
6.比如递归次数太多
内存溢出的解决方案:
第一步,修改JVM启动参数,直接增加内存。(-Xms,-Xmx参数一定不要忘记加。)

第二步,检查错误日志,查看“OutOfMemory”错误前是否有其它异常或错误。

第三步,对代码进行走查和分析,找出可能发生内存溢出的位置。

重点排查以下几点:
  1.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
  2.检查代码中是否有死循环或递归调用。

3.检查是否有大循环重复产生新对象实体。

4.检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中 数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。

5.检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

第四步,使用内存查看工具动态查看内存使用情况

从内存溢出看Java 环境中的内存结构

作为有个java程序员,我想大家对下面出现的这几个场景并不陌生,倍感亲切,深恶痛绝,抓心挠肝,一定会回过头来问为什么为什么为什么会这样,嘿嘿,让我们看一下我们日常在开发过程中接触内存溢出的异常:

38.overread和overload的区别?