java 基础面试题

一。什么是哈希值哟
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的。
  消息身份验证代码 (MAC) 哈希函数通常与数字签名一起用于对数据进行签名,而消息检测代码 (MDC) 哈希函数则用于数据完整性。
  小红和小明可按下面的方式使用哈希函数以确保数据完整性。如果小红对小明编写一条消息并创建该消息的哈希,则小明可以在稍后散列该消息并将他的哈希与原始哈希进行比较。如果两个哈希值相同,则该消息没有被更改;但是,如果值不相同,则该消息在小红编写它之后已被更改。为了使此系统运行,小红必须对除小明外的所有人保密原始的哈希值
二:HTTP与HTTPS区别
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议
它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换信息。它使用安全套接字层(SSL)进行信息交换,简单来说它是HTTP的安全版。
它是由Netscape开发并内置于其浏览器中,用于对数据进行压缩和解压操作,并返回网络上传送回的结果。HTTPS实际上应用了Netscape的安全全套接字层(SSL)作为HTTP应用层的子层。(HTTPS使用端口443,而不是象HTTP那样使用端口80来和TCP/IP进行通信。)SSL使用40 位关键字作为RC4流加密算法,这对于商业信息的加密是合适的。HTTPS和SSL支持使用X.509数字认证,如果需要的话用户可以确认发送者是谁。
HTTPS和HTTP的区别:
https协议需要到ca申请证书,一般免费证书很少,需要交费。
http是超文本传输协议,信息是明文传输,https 则是具有安全性的ssl加密传输协议
http和https使用的是完全不同的连接方式用的端口也不一样,前者是80,后者是443。
http的连接很简单,是无状态的
HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议 要比http协议安全

三,谈谈你对JAVA的认识
Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即JavaSE, JavaEE, JavaME)的总称。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台、科学超级计算机、移动电话和互联网,同时拥有全球最大的开发者专业社群。在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。它最初被命名为Oak,目标设定在家用电器等小型系统的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,以“Java”的名称正式发布。

四:线程安全与线程不安全的区别
线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

首先要明白线程的工作原理,jvm有一个main   memory,而每个线程有自己的working   memory,一个线程对一个variable进行操作时,都要在自己的working   memory里面建立一个copy,操作完之后再写入main   memory。多个线程同时操作同一个variable,就可能会出现不可预知的结果。根据上面的解释,很容易想出相应的scenario。
而用synchronized的关键是建立一个monitor,这个monitor可以是要修改的variable也可以其他你认为合适的object比如method,然后通过给这个monitor加锁来实现线程安全,每个线程在获得这个锁之后,要执行完   load到workingmemory   ->   use&assign   ->   store到mainmemory   的过程,才会释放它得到的锁。这样就实现了所谓的线程安全
线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低依靠线程同步
在多线程环境中,当各线程不共享数据的时候,那么一定是线程安全的
五:IO流分为哪两大类:字节流和字符流

六:java中同步和异步的区别是什么?
同步就是许多线程同时用一个资源啥的哦,一个在用别的就要等,异步就相反了,可以不用等待
下面这是人家的话:
同步:发送一个请求,等待返回,然后再发送下一个请求
异步:发送一个请求,不等待返回,随时可以再发送下一个请求

同步可以避免出现死锁,读脏数据的发生,一般共享某一资源的时候用,如果每个人都有修改权限,同时修改一个文件,有可能使一个人读取另一个人已经删除的内容,就会出错,同步就会按顺序来修改。
异步则是可以提高效率了,现在cpu都是双核,四核,异步处理的话可以同时做多项工作,当然必须保证是可以并发处理的。
这些都是对的。
同步和异步最大的区别就在于。一个需要等待,一个不需要等待。
比如广播,就是一个异步例子。发起者不关心接收者的状态。不需要等待接收者的返回信息
电话,就是一个同步例子。发起者需要等待接收者,接通电话后,通信才开始。需要等待接收者的返回信息
七:java序列化;
序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题

八:struts1和struts2的区别
1、配置文件格式不同
2、struts1有from类和action类,属性封装from类里,在struts2里只有action类,属性封装action类里
3、页面调用是struts1 是*.do  struts2 是*.action
我认为struts2要比struts1,简单、方便、快捷。就是用着比struts1好
以上是我开发的体会,下面是我找的资料
主要表现在如下几个方面:
  在Action的实现方面:Struts1要求必须统一扩展自Action类,而Struts2中可以是一个普通的POJO。
  线程模型方面:Struts1的Action工作在单例模式,一个Action的实例处理所有的请求。Struts2的Action是一个请求对应一个实例。没有线程安全方面的问题。
  Servlet依赖方面:Struts1的Action依赖于Servlet API,比如Action的execute方法的参数就包括request和response对象。这使程序难于测试。Struts2中的Action不再依赖于Servlet API,有利于测试,并且实现TDD。
  封装请求参数:Struts1中强制使用ActionForm对象封装请求的参数。Struts2可以选择使用POJO类来封装请求的参数,或者直接使用Action的属性。
  表达式语言方面:Struts1中整合了EL,但是EL对集合和索引的支持不强,Struts2整合了OGNL(Object Graph NavigationLanguage)。
  绑定值到视图技术:Struts1使用标准的JSP,Struts2使用“ValueStack”技术。
  类型转换:Struts1中的ActionForm基本使用String类型的属性。Struts2中使用OGNL进行转换,可以更方便的使用。
  数据校验:Struts1中支持覆盖validate方法或者使用Validator框架。Struts2支持重写validate方法或者使用XWork的验证框架。
  Action执行控制的对比:Struts1支持每一个模块对应一个请求处理,但是模块中的所有Action必须共享相同的生命周期。Struts2支持通过拦截器堆栈为每一个Action创建不同的生命周期

1. java异常机制的原理与应用
答:每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象。
实际上,产生了异常之后,JVM会抛出一个异常类的实例化对象,如果此时使用了try语句捕获的话,则可以进行异常的处理,否则,交给JVM进行处理。当try语句捕获异常之后,将与catch语句的异常类型进行匹配,如果匹配成功则执行catch内的语句。简单的应用:在所以throws语句的地方加入try-catch。标准应用:try-catch-finally-throw-throws一起使用。

2. 垃圾回收机制的优点
答:释放无用的对象所占用的空间。方式:自动回收,手动回收。使用System.gc(),实际上调用Runtime.getRuntime().gc()fangf

3. Error与Exception区别
答:Error是jvm进行处理,是jvm出错
exception是可以由程序处理的,可以用try-catch捕获的

4. final,finally,finallize
答:final定义的变量的值不能改变,定义的方法不能被覆盖,定义的类不能被继承
finally是异常的统一出口,finallize是垃圾回收前的收尾工作,是Object类定义的

5. Anonymous Inner Class是否可以extends,是否可以implements Interface
答:允许继承和实现,因为匿名内部类就是在抽象类和接口的基础上发展起来的

6. Static Nested Class 与Inner Class的区别
答:使用Static定义的Class就是外部类,可以通过外部类. 内部类直接访问
而Inner Class是不能被外部访问的,只能通过外部类的实例再找到内部类实例。

7. HashMap and HashTable?
答:HashMap:1) released in jdk 1.2,new Class 2)采用异步处理方式,性能较高,是非线程安全的 3)允许null
HashTable:1)released in jdk 1.0 ,old Class 2)采用同步处理方式,性能低,是线程安全的         3)不允许null

8. assert代表什么?
答:asserts是jdk 1.4之后发布的新关键字,表示断言,即程序执行到某个地方肯定是预计的值,一般开发很少使用。要使用assert,必须加上 -ea参数

9. gc是什么?
答:gc是garbage collection,垃圾回收,使用gc可以进行垃圾空间的释放

10. String s = new String("xyz")产生了几个对象?
答:一个匿名对象xyz,在栈空间内。一个new实例化的对象,在堆空间内。

11. sleep() and wait()?
答:sleep()是Thread类定义方法,表示线程的休眠,可以自动唤醒
wait()方法是Object类定义的方法,需要手动notify()和notifyAll()

12. java中存在goto,但不能使用

13.数组有没有length(),String有没有length()?
答:数组有length属性,String有length()

14. Overload与Override的区别
答:Overload:重载
               |- 在一个类中定义的若干方法
              |- 所有的方法名相同,但参数类型或个数不同
               |- 只有参数有关,与返回类型无关
Override:覆写
              |- 在继承的关系中
              |- 子类定义了父类同名的方法,参数类型或个数最好完全一样。
              |- 访问权限不能更严格

15. Set里的元素不能重复,用什么方法区分?==与equals()方法的区别
答:依靠hashCode()和equals()两个方法完成,==属于地址比较,equals()属于内容比较。使用的是equals()方法。

16. 列出常见的 runtime exception
答:NumberFormatException/ArrayOutIndexofBoundException/NullPointerException/ClassCastException

17. abstract class 和 interface有什么区别?
答:抽象类:
              |-由抽象方法和常量、变量、全局常量、构造方法、普通方法组成
              |-使用abstract声明
              |-子类要通过extends继承抽象类,子类如果不是抽象类,则必须覆写抽象类的全部抽象方法
              |-存在单继承的局限
              |-抽象类可以实现若干个接口
接口:
              |-由抽象方法和全局常量组成
              |-使用interface关键字
              |-子类要通过implements实现接口,子类如果不是抽象类,则必须覆写抽象类的全部抽象方法
              |-一个子类可以实现多个接口
              |-接口不能继承一个抽象类,但允许继承多个接口

18. 启动一个线程要用start(),因为要通知jvm进行cpu资源的分配

19. try{}里面有一个return,问finally{}里面的代码是否执行,在什么时机执行?
答:finally{}里面的代码执行,在return之前。

20. 写一个singleton
答:singleton的核心就是构造方法私有化,Class,Runtime都采用单例
package com.leongod.demo;
public class Singleton(){
         private static final Singleton sin = new Singleton();
        private Singleton(){}
        public static Singleton getInstance(){
                  return sin;
}
}

21. 程序设计:输入一组数字,然后排序输出
答:package com.leongod.demo;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class IO {
public static void main(String[] args) throws Exception {
   BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
   System.out.println("请输入一组数字,中间用空格分割:");
   String str = buf.readLine();
   Set<Integer> set = new TreeSet<Integer>();
   String[] arr = str.split(" ");
 
   for(String s : arr) {
    if (s.matches("+")) {
     set.add(Integer.parseInt(s));
    }
   }
 
   Iterator<Integer> it = set.iterator();
   System.out.println("排序后的结果:");
   while (it.hasNext()) {
    System.out.print(it.next() + ",");
   }
}
}

22.列出目录内的文件
package com.leongod.demo;
import java.io.File;
import com.sun.org.apache.xpath.internal.functions.FuncBoolean;

public class FileDemo {
public static void main(String[] args) {
   File file = new File("D:" + File.separator + "kongkong");
   fun(file);
}

public static void fun(File file) {
   if (file.isDirectory()) {
    File[] lf = file.listFiles();
    if (lf != null) {
     for(File f : lf) {
      fun(f);
     }
    }
   }else {
    System.out.println(file.toString());
   }
}
}

23. char可以存一个中文汉字吗?
答:可以,使用了unicode编码

24.多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?
答:两种多线程方法,继承Thread类,实现Runnable接口
              |-Thread类是Runnable接口的子类
              |-使用Runnable接口可以实现资源共享的目的
              |-所有线程操作都必须通过Thread类的start()方法启动
两种实现同步的方法:
              |-同步代码块:Synchronized(this)
              |-同步方法
25.f=3.4是不对的,3.4默认是double类型的

26.String and StringBuffer?
答:String 不可以修改,StringBuffer可以修改

27.Class.forname向容器中加载驱动程序

28.int与Integer有什么区别?
答:int是基本数据类型,Integer是包装类
在jdk1.5以后,可以实现自动装箱和拆箱

29.2*8有效的方法是移位操作:2<<3

30.请说出类集框架的完整结构
答:类级框架的最大接口:Collection、Map、Iterator、Enumeration
Collection:存放单值
              |-List:允许有重复内容
                     |-ArrayList:异步处理,新的操作类,非线程安全
                     |-Vector:同步处理,旧的操作类,线程安全,支持Enumeration
              |-Set:不允许有重复的内容,依靠hashCode()和equals()进行重复的验证
                     |-HashSet:无序存放
                     |-TreeSet:有序存放,按Comparable排序
              |-Map:存放一对值
                     |-HashMap:新的类,异步处理,非线程安全,允许有null
                     |-HashTable:旧的类,同步处理,线程安全,不允许有null
                     |-TreeMap:有序排列,按key配需
              |-Iterator:迭代输出,依靠collection接口中的iterator方法输出,是新的输出标准

31.是否可以继承String类?答:不可以,因为使用了final关键字

32.数据库设计三范式:

1.第一范式(确保每列保持原子性)

一范式是最基本的范式。如果数据库表中的 所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。第一范式的合理遵循需要根据系统的 实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第一范式

2.第二范式(确保表中的每列都和主键相关)

第二范式在第一范式的基础之上更进一层。第二范式需要确保数据库表中的每一列都和主键相关,而不能只与主键的某一部分相关(主要针对联合主键而言)。也就是说在一个数据库表中,一个表中只能保存一种数据,不可以把多种数据保存在同一张数据库表中。

比如要设计一个订单信息表,因为订单中可能会有多种商品,所以要将订单编号和商品编号作为数据库表的联合主键

3.第三范式(确保每列都和主键列直接相关,而不是间接相关)

第三范式需要确保数据表中的每一列数据都和主键直接相关,而不能间接相关

比如在设计一个订单数据表的时候,可以将客户编号作为一个外键和订单表建立相应的关系。而不可以在订单表中添加关于客户其它信息(比如姓名、所属公司等)的字段。如下面这两个表所示的设计就是一个满足第三范式的数据库表

33.java中的线程池

线程池的作用:

     线程池作用就是限制系统中执行线程的数量。
     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。

 

为什么要用线程池:

  1. 减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务
  2. 可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值