Java基础知识

Java中形参实参

----------------虚拟机部分 start -----------------

java虚拟机的特性

谈谈对jvm的理解

JVM组成

java常量池

JVM内存区域,开线程影响哪块内存

类加载机制

类加载器

符号引用&直接引用

谈谈对ClassLoader(类加载器)的理解

虚拟机原理,如何自己设计一个虚拟机(内存管理,类加载,双亲委派)

谈谈你对双亲委派模型理解

JVM内存模型,内存区域

内存回收机制、GC回收策略、GC原理时机以及GC对象

GC中新生代和老年代

垃圾回收机制与调用System.gc()区别

----------------虚拟机部分 end -----------------

2,java中==和equals和hashCode的区别

==比较的两个变量的值是否相等

如果比较的数引用行变量那么他比较的是内存地址,并不是里面的对象里面的数值

所有的java类都继承自Object,Object提供了equals方法。如果此方法没有被java类重写那么他跟==是一个意思比较的是引用

如果被重写了,那么根据重写的规则比较的是数值

hashCode是Object类中的方法,用于鉴定两个对象是否相等,返回对象在内存中地址转换成的一个int值,所以没有重写,任何对象的hashCode()方法都不相等

equals是给人调用的,hashCode用户一般不会调用他,比如hashMap他比较的是hashCode和equals,这种情况要都重写hashCode和equals

3,int、char、long各占多少字节数
byte 1字节 
boolean 1字节 
char 2字节
short 2字节
int 4字节
long 8字节
float 4字节

double 8字节

int与integer的区别

int基本数据类型。初始值为0

integer是对象。初始值为Null

4,谈谈对java多态的理解

5,String、StringBuffer、StringBuilder区别

6,什么是内部类?内部类的作用

静态内部了,非静态内部类比喻

简单理解就是:如果把类比喻成鸡蛋,内部类为蛋黄,外部类是蛋壳。那么静态类相当于熟鸡蛋,就算蛋壳破碎(外部类没有实例化),蛋黄依然完好(内部类可以实例化);而非静态类相当于生鸡蛋,蛋壳破碎(无实例化),蛋黄也会跟着xx(不能实例化)。
为什么匿名内部类,局部内部类只能访问final修饰变量


7,抽象类和接口区别

8,抽象类的意义

9,抽象类与接口的应用场景

10,抽象类是否可以没有方法和属性?

抽象类可以不包含抽象方法,
包含抽象方法的类一定是抽象类。

11,接口的意义

12,泛型中extends和super的区别

13,父类的静态方法能否被子类重写

父类的静态方法不能被子类继承,更谈不上重写,就算是子类中有一个和父类一模一样的静态方法,那也是子类本身的,和父类的那个静态方法不是一回事。方法加静态后就属于类不属于对象了。

14,进程和线程的区别

进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。以前进程既是资源分配也是调度的最小单位,后来为了更合理的使用cpu(实际上是cpu性能越来越好),才将资源分配和调度分开,就有了线程。线程是建立在进程的基础上的一次程序运行单位。

15,final,finally,finalize的区别

16,Serializable 和Parcelable 的区别

17,静态属性和静态方法是否可以被继承?是否可以被重写?以及原因?

结论:java中静态属性和静态方法可以被继承,但是没有被重写(overwrite)而是被隐藏.

原因:
1). 静态方法和属性是属于类的,调用的时候直接通过类名.方法名完成对,不需要继承机制及可以调用。如果子类里面定义了静态方法和属性,那么这时候父类的静态方法或属性称之为"隐藏"。如果你想要调用父类的静态方法和属性,直接通过父类名.方法或变量名完成,至于是否继承一说,子类是有继承静态方法和属性,但是跟实例方法和属性不太一样,存在"隐藏"的这种情况。
2). 多态之所以能够实现依赖于继承、接口和重写、重载(继承和重写最为关键)。有了继承和重写就可以实现父类的引用指向不同子类的对象。重写的功能是:"重写"后子类的优先级要高于父类的优先级,但是“隐藏”是没有这个优先级之分的。

3). 静态属性、静态方法和非静态的属性都可以被继承和隐藏而不能被重写,因此不能实现多态,不能实现父类的引用可以指向不同子类的对象。非静态方法可以被继承和重写,因此可以实现多态。

18,内部类的设计意图

1).完善多继承,Java只支持单继承,比如每一个人都是同时继承父亲和母亲两个类,要不然你的身体里怎么能留着父母的血呢?

2).内部类是面向对象的闭包,因为它不仅包含创建内部类的作用域的信息,还自动拥有一个指向此外围类对象的引用,在此作用域内,内部类有权操作所有的成员,包括private成员。一般使用一个库或类时,是你主动调用人家的API,这个叫Call,有的时候这样不能满足需要,需要你注册(注入)你自己的程序(比如一个对象),然后让人家在合适的时候来调用你,这叫Callback。

3).当父类和实现的接口出现同名函数时,你又不想父类的函数被覆盖,回调可以帮你解决这个问题。

19,静态内部类的设计意图

静态内部类可以带来更好的代码聚合,提高代码可维护性。

把只和这个类相关的类型放到这个类内部是很合理的

20,成员内部类、静态内部类、局部内部类和匿名内部类的理解,以及项目中的应用

解析数据使用成员内部类

建造者模式静态内部类

回调匿名内部类

public class Test {
    public static void main(String[] args){
        Bean1 bean1 = new Test().new Bean1();
        Bean2 bean2 = new Test.Bean2();
        Bean.Bean3 bean3 = new Bean().new Bean3();
    }
    
    class Bean1{
        public int I = 0;
    }
    
    static class Bean2{
        public int J = 0;
    }
}


class Bean{
    class Bean3{
        public int k = 0;
    }
}

21,谈谈对kotlin的理解

//-------自有发挥

22,闭包和局部内部类的区别 

http://blog.csdn.net/yuwenhao07/article/details/53607117

23,string 转换成 integer的方式及原理

String s = "1";

Integer i = Integer.valueOf(s);//这里要有异常处理,将字符串装换成字符然后在转换成int类型返回,在装箱成Integer

(二) java深入源码级的面试题(有难度)

1,哪些情况下的对象会被垃圾回收机制处理掉?

2,讲一下常见编码方式?

3,utf-8编码中的中文占几个字节;int型几个字节?

4,静态代理和动态代理的区别,什么场景使用?

5,Java的异常体系

6,谈谈你对解析与分派的认识。

7,修改对象A的equals方法的签名,那么使用HashMap存放这个对象实例的时候,会调用哪个equals方法?

 //HashMap
 if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
             V oldValue = e.value;
             e.value = value;
             e.recordAccess(this);
             return oldValue;
         }

会调用原方法,比较的是key值

8,Java中实现多态的机制是什么?

9,如何将一个Java对象序列化到文件里?
File aFile=new File("e:\\c.txt");
   Stu a=new Stu(1, "aa", "1");
   FileOutputStream fileOutputStream=null;
   try {
     fileOutputStream = new FileOutputStream(aFile);
     ObjectOutputStream objectOutputStream=new ObjectOutputStream(fileOutputStream);
     objectOutputStream.writeObject(a);
     objectOutputStream.flush();
     objectOutputStream.close();
   } catch (FileNotFoundException e) {
     e.printStackTrace();
   } catch (IOException e) {
     e.printStackTrace();
   }finally {
     if(fileOutputStream!=null)
     {
       try {
         fileOutputStream.close();
       } catch (IOException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
       }      
     }
   }
   ```
   
   ```java
   FileInputStream fileInputStream=new FileInputStream(aFile);
   ObjectInputStream objectInputStream=new ObjectInputStream(fileInputStream);
   Stu s=(Stu)objectInputStream.readObject();
   System.out.println(s);
   ```

10,说说你对Java反射的理解

在 Java 和 Android 开发中,一般情况下下面几种场景会用到反射机制:
1)需要访问隐藏属性或者调用方法改变程序原来的逻辑,这个在开发中是很常见的,由于一些原因,系统并没有开放一些接口出来,这个时候利用反射是一个有效的解决办法。
2)自定义注解,注解就是在运行时利用反射机制来获取的。
3)在开发中动态加载类,比如在 Android 中的动态加载解决65k问题等等,模块化和插件化都离不开反射。

11,说说你对Java注解的理解

12,说说你对依赖注入的理解

13,说一下泛型原理,并举例说明

14,Java中String的了解

15,String为什么要设计成不可变的?

字符串池的优点就是避免了相同内容的字符串的创建,节省了内存,省去了创建相同字符串的时间,同时提升了性能;另一方面,字符串池的缺点就是牺牲了JVM在常量池中遍历对象所需要的时间,不过其时间成本相比而言比较低。

16,Object类的equal和hashCode方法重写,为什么?

(三) 数据结构
1,常用数据结构简介
数据元素相互之间的关系称为结构。 
有四类基本结构:集合、线性结构、树形结构、图状结构。
集合结构:除了同属于一种类型外,别无其它关系。
线性结构:元素之间存在一对一关系常见类型有:?数组,链表,队列,栈,它们之间在操作上有所区别。
  例如:链表可在任意位置插入或删除元素,而队列在队尾插入元素,队头删除元素,
     栈只能在栈顶进行插入,删除操作.
树形结构:元素之间存在一对多关系,常见类型有:树(有许多特例:二叉树、平衡二叉树、查找树等)。
图形结构:元素之间存在多对多关系,图形结构中每个结点的前驱结点数和后续结点多个数可以任意。
 
  
2,并发集合了解哪些?

http://youyu4.iteye.com/blog/2352846

3,列举java的集合以及集合之间的继承关系

4,集合类以及集合框架

5,容器类介绍以及之间的区别(容器类估计很多人没听这个词,Java容器主要可以划分为4个部分:List列表、Set集合、Map映射、工具类(Iterator迭代器、Enumeration枚举类、Arrays和Collections),具体的可以看看这篇博文 Java容器类)

6,List,Set,Map的区别

List有序,可重复
Set无序,不可重复

Map key value形式存储 key唯一 value可重复

7,List和Map的实现方式以及存储方式

List 有序可重复 常用实现类是两个一个是ArrayLits和LinkedList

ArrayList 线程不安全 数组形式存储 查快
LinkList 线程不安全 链表形式存储 增删快
Set 无序不可重复 常用实现类HashSet TreeSet
HashSet 线程不安全 可以快速定位 存放其中的数据要实现hashCode()方法,使用了哈希算法
TreeSet 线程不安全 有序存放 存入其中的数据要可排序 这就用到了集合框架提供的另外两个实用类Comparable和Comparator。一个类是可排序的,它就应该实现Comparable接口
Map 键值对的形式存储 key唯一 value可不唯一 HashMap TreeMap
HashMap 线程不安全 key实现hash算法可快速查找一个键
TreeMap 线程不安全 key值有序排列

8,HashMap的实现原理,HashMap数据结构,HashMap源码理解,HashMap如何put数据(从HashMap源码角度讲解),HashMap怎么手写实现?

9,ConcurrentHashMap的实现原理

10,ArrayMap和HashMap的对比

11,HashTable实现原理

12,TreeMap具体实现

13,HashMap和HashTable的区别

(1)基类不同:HashTable基于Dictionary类,而HashMap是基于AbstractMap。Dictionary是什么?它是任何可将键映射到相应值的类的抽象父类,而AbstractMap是基于Map接口的骨干实现,它以最大限度地减少实现此接口所需的工作。
(2)null不同:HashMap可以允许存在一个为null的key和任意个为null的value,但是HashTable中的key和value都不允许为null。
(3)线程安全:HashMap时单线程安全的,Hashtable是多线程安全的。
(4)遍历不同:HashMap仅支持Iterator的遍历方式,Hashtable支持Iterator和Enumeration两种遍历方式

14,HashMap与HashSet的区别,HashSet与HashMap怎么判断集合元素重复?

15,集合Set实现Hash怎么防止碰撞

16,ArrayList和LinkedList的区别,以及应用场景

17,数组和链表的区别

数组 分配内存连续,长度固定,插入,删除操作效率低

链表 分配内存不连续,长度不固定,插入,删除操作效率高

18,二叉树的深度优先遍历和广度优先遍历的具体实现

19,堆的结构

20,堆和树的区别

21,堆和栈在内存中的区别是什么(解答提示:可以从数据结构方面以及实际实现方面两个方面去回答)?

22,什么是深拷贝和浅拷贝

23,手写链表逆序代码

链表翻转(即:翻转一个单项链表)

24,讲一下对树,B+树的理解

25,讲一下对图的理解

26,判断单链表成环与否?

27, 合并多个单有序链表(假设都是递增的)

(四) 线程、多线程和线程池

多线程图解

1,开启线程的三种方式?

2,线程和进程的区别?

1)进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。以前进程既是资源分配也是调度的最小单位,后来为了更合理的使用cpu(实际上是cpu性能越来越好),才将资源分配和调度分开,就有了线程。线程是建立在进程的基础上的一次程序运行单位。
2)线程是在进程中的,一个进程可以有多个线程,多个线程共享进程中的代码和数据

为什么要有线程,而不是仅仅用进程?

3,run()和start()方法区别

4,如何控制某个方法允许并发访问线程的个数?

5,在Java中wait和sleep方法的不同,谈谈wait/notify关键字的理解

6,什么导致线程阻塞?

7,线程如何关闭?

http://blog.csdn.net/wisgood/article/details/19563245

8,讲一下java中的同步的方法?如何实现线程同步?

9,数据一致性如何保证?

//后端分布式数据一致的问题,果然变态,初步分析考的是乐观锁,还有待继续调查

10,如何保证线程安全?

11,两个进程同时要求写或者读,能不能实现?如何防止进程的同步?

//这个太鸡巴难了

12,线程间操作List

//暂定

13,Java中对象的生命周期

14,Java中类的生命周期

15,单列模式与垃圾回收

16,Synchronized用法

17,synchronize的原理

http://cmsblogs.com/?p=2071

18,谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解

19,static synchronized 方法的多线程访问和作用

20,同一个类里面两个synchronized方法,两个线程同时访问的问题

对象锁,对象是同一个持有锁相同不可同时访问,对象不同持有锁不同可同时访问

21,volatile的原理 

volatile轻量级synchronized,多线程共享可见

22,谈谈volatile关键字的用法,谈谈volatile关键字的作用

23,谈谈NIO的理解    

24,synchronized 和volatile 关键字的区别

25,synchronized与Lock的区别

26,ReentrantLock 、synchronized和volatile比较

//说一下每个锁的特点,使用方式在说一下区别即可

27,ReentrantLock的内部实现

https://blog.csdn.net/yanyan19880509/article/details/52345422

CAS算法Compare and Swap

CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

AQS

28,lock原理

29,死锁的四个必要条件,怎么避免死锁?

30,对象锁和类锁是否会互相影响?

不会互相影响,

31,什么是线程池,如何使用?

32,Java的并发、多线程、线程模型

线程模型

https://blog.csdn.net/daybreak1209/article/details/51366647

https://blog.csdn.net/daybreak1209/article/details/51372929

https://blog.csdn.net/daybreak1209/article/details/51378055

33, Java并发,多线程

34, 谈谈对多线程的理解

35,多线程有什么要注意的问题?

36,谈谈你对并发编程的理解并举例说明

37,谈谈你对多线程同步机制的理解?

就是说一下synchronized关键字,Lock应用,volatile他们的用法和区别

38,如何保证多线程读写文件的安全?

读的时候可以不加锁,写的时候一定要加锁

39, 多线程断点续传原理,断点续传的实现
https://blog.csdn.net/qq_23174861/article/details/49925193
https://blog.csdn.net/SEU_Calvin/article/details/53749776
(五)并发编程有关知识点(这个是一般Android开发用的少的,所以建议多去看看):
平时Android开发中对并发编程可以做得比较少,Thread这个类经常会用到,但是我们想提升自己的话,一定不能停留在表面,,我们也应该去了解一下java的关于线程相关的源码级别的东西。


学习的参考资料如下:


1,Java 内存模型

2,java线程安全总结

3,线程状态:一张图让你看懂JAVA线程间的状态转换

锁机制:synchronized、Lock、Condition

Java 中的锁

并发编程:

Java并发编程:Thread类的使用

Java多线程编程总结

Java并发编程的总结与思考

Java并发编程实战-----synchronized

深入分析ConcurrentHashMap


你可能感兴趣的:(java)