算法面试基本问题

一、Java

1.一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。
2.对象:对象是类的一个实例,有状态和行为。
3.类:类是一个模板,它描述一类对象的行为和状态。
4.方法:方法就是行为,一个类可以有很多方法。
5.实例变量:每个对象都有独特的实例变量,对象的状态由这些实例变量的值决定。
6.编写Java程序时,应注意以下几点:

  • 大小写敏感
  • 类名:每个单词的首字母应该大写
  • 方法名:所有的方法名都应该以小写字母开头。如果方法名含有若干单词,则后面的每个单词首字母大写。
  • 源文件名:源文件名必须和类名相同。当保存文件的时候,你应该使用类名作为文件名保存(切记Java是大小写敏感的),文件名的后缀为.java。
  • 主方法入口:所有的Java 程序由public static void main(String []args)方法开始执行。
  • 在Java语言中,所有的变量在使用前必须声明
import java.io.*;  //导入包
final double PI = 3.1415926;  //final修饰常量
public class 类名{
   
成员/实例变量;
static 类变量;
public 返回类型 方法名(参数){
   
    局部变量;
    相关操作;
}
public static void main(string[] args){
   
    类名 对象=new 类名(“对象值”);//创建对象
    System.out.println(12+变量名+34); //输出语句
}
}

7.Char类型
(1)字符char ch = ‘a’;
(2)字符数组 char[] charArray={‘a’,’b’,’c’};
(3)创建对象char[] charArray = new char[];
(4)字符数组转字符串:toString()
8.String类型
(1)String类型不能改,String str = “hello world”;
(2)创建对象,String str = new String(charArray);
(3)字符串长度:str.length()
(4)字符串转字符数组:toCharArray()
(5)StringBuffer和StringBuilder:字符串可变,StringBuilder更快但线程不安全,用的多。

StringBuilder ss = new StringBuilder(“hello”); ss.append(“world”);//扩展
ss.replace(“world”,”word”);//替换

9.Array数组类型
(1)创建数组int[] array = new int[arraysize];array[0] = 1; array[1] = 2;
(2)创建数组并赋值 int[] array = {1,2,3,4,5};
(3)数组长度:array.length
(4)多维数组:String array[][] = new String[row][col];
10.输入Scanner

import java.util.Scanner;
Scanner sc = new Scanner(System.in); 
System.out.println("请输入你的姓名:"); 
String name = sc.nextLine(); 
System.out.println("请输入你的年龄:"); 
int age = sc.nextInt(); 
System.out.println("请输入你的工资:"); 
float salary = sc.nextFloat();

11.java虚拟机的内存如何划分的?类加载机制,类加载器,双亲委派模型?jvm调优做过没,-Xms和-Xmx分别指什么?堆,栈,永久区,GC?
答:主要划分为五个区域,方法区,本地方法栈,虚拟机栈,程序计数器,堆。大概就是这五个区域,一定要背下来。咱们的垃圾回收主要就是针对堆区来进行的,堆区又会被划分为新生代老年代
12.java的垃圾回收算法有哪些?垃圾回收器有哪些?不同的垃圾回收器有什么区别?对象什么时候进入老年代,什么时候进行FullGC?
答:垃圾回收算法有标记复制法,标记清除法 等。垃圾回收器最常被问的就是CMS和G1。scavage之类的回收器基本上不问。CMS在不同阶段使用串行或并发来做垃圾回收的,而且他和G1垃圾回收器有什么区别。
13.voliatile和synchonized有什么区别?synchonized和jdk提供的Lock包又有什么区别?volatile怎么保证可见性?synchronized和lock的区别,synchronized的底层实现?
synchronized和reentrantlock的区别。讲讲阻塞队列,volatile和synchronized为啥是非公平的
答:voliatile只能够保证可见性和有序性,不能保证原子性,synchonized是通过上锁来防治出现并发问题。jdk提供的Lock包相比于synchozied提供了更加多样化的锁机制。
14.HashMap的原理是什么?HashMap和HashTable的区别,HashMap怎么解决hash冲突,jdk1.8后对HashMap的改进?
hashmap也是一个被问烂的问题,但是我这里进行一些拓展。基本上面试官最常问的就是hashmap是如何实现的,这个网上一查就知道了。但是一些深入一点的东西,如果你能够讲的话,是会有加分的。例如hashmap如何实现动态扩容,hashmap并不是线程安全的,在哪些情况下会出现线程安全的问题?那么哪一个提供了线程安全的map?他的锁机制是如何实现的?(它的锁机制并不是简单地直接把函数给锁住,而是通过分段来治理的,还是很有意思的)
hashmap介绍先说了下自己知道JAVA的hash map的用法,python中dictionary也是用hash表实现的:首先利用hash()将key和value映射到一个地址,它通过把key和value映射到表中一个位置来访问记录,这种查询速度非常快,更新也快。而这个映射函数叫做哈希函数,存放值的数组叫做哈希表。 哈希函数的实现方式决定了哈希表的搜索效率。具体操作过程是:

  1. 数据添加:把key通过哈希函数转换成一个整型数字,然后就将该数字对数组长度进行取余,取余结果就当作数组的下标,将value存储在以该数字为下标的数组空间里。
  2. 数据查询:再次使用哈希函数将key转换为对应的数组下标,并定位到数组的位置获取value。
    但是,对key进行hash的时候,不同的key可能hash出来的结果是一样的,尤其是数据量增多的时候,这个问题叫做哈希冲突。如果解决这种冲突情况呢?通常的做法有两种,一种是链接法,另一种是开放寻址法,Python选择后者。
    开放寻址法(open addressing):
    开放寻址法中,所有的元素都存放在散列表里,当产生哈希冲突时,通过一个探测函数计算出下一个候选位置,如果下一个获选位置还是有冲突,那么不断通过探测函数往下找,直到找个一个空槽来存放待插入元素

15.常用的设计模式有哪些?单例模式的实现方式?
答:这个地方你最少有说得出来单例模式、工厂模式、代理模式等,这些都是很常见的设计模式,而且这个问题也经常被问。
16.Spring的AOP、IOC作用是什么?如何实现的
答:Spring是一个java web的框架,面试官特别喜欢问。但是问spring基本上也只围绕着这几个点,第一个是AOP、IOC的作用是什么,这个问题查一下就知道了。第二个是AOP、IOC是通过什么实现的?AOP是通过代理模式来实现的,IOC是通过单例模式+工厂模式来实现的。问得比较多的是AOP的实现方式,你如果回答代理模式一般就够了。作为拓展,你可以回答里面用到了动态代理,动态代理有两种方式,一种是jdk提供的,一种是cglib。。。然后你和面试官比较一下两种动态代理的区别,我觉得也是会有加分的。
17.java的3大特性,java相关的数据结构,java对象,java的集合的继承关系,为什么不能多继承?抽象类和接口?容器
封装,继承,多态
18.java里set,Array和map等容器了解吗,它

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值