Java基础常识及面试题(一)

window10安装环境
    slmgr.vbs -xpr  查看状态
    slmgr.vbs /upk 卸载之前的
    slmgr /ipk VK7JG-NPHTM-C97JM-9MPGT-3V66T
    slmgr /skms kms.xspace.in
    slmgr /ato

tomcat.bat文件

    set JAVA_OPTS=%JAVA_OPTS% -server -Xms1000m -Xmx1000m -XX:MaxNewSize=256m

eclipse.ini配置文件

    -vm
    E:/Program Files/Java/jdk1.8.0_191/bin

    -Xms512m
    -Xmx2048m
    --add-modules=ALL-SYSTEM

eclipse+python+anaconda

    http://pydev.org/updates/
    选择anaconda位置

maven

    C:\Users\Administrator\.m2     加入setting,xml

    cmd 

    mvn - version
    
    下载3.6最新版本

    cd E:\workspace1\noaper-demo-all>

    打包
    mvn clean install -DskipTests -U 
    -DskipTests,不执行测试用例,但编译测试用例类生成相应的class文件至target/test-classes下。
    -Dmaven.test.skip=true,不执行测试用例,也不编译测试用例类。

ArrayList

1、什么是
    数组
         
Redis

1、什么是Redis

    key-value数据库

2、Redis memcached

    1、memcached所以的值均是简单的字符串,redis支持更为丰富的数据类型
    2、redis的速度比memcached快很多
    3、redis可以持久化其数据

3、String 、List、Set SortedSet、hashes

4、Redis主要消耗什么物理资源?内存

5、Remote Dictionary Server


13、会话缓存、全员缓存、队列、排行榜/计算器、发布/订阅

14、Redisson、Jedis、Lettuce


0、面向对象

    封装 给对象提供了隐藏内部特性和行为的能力

    封装的好处

    通过隐藏对象的属性来保护对象内部的状态
    提高了代码的可用性和可维护性 因为对象的行为可以被单独的改变或者扩展
    禁止对象之间的不良交互提高模块化 
    
    多态 是编程语言给不同的底层数据类型做相同的接口展示的一种能力。一个多态            
    类型上的操作可以应用到其他类型的值上面
    
    抽象 把想法从具体实例中分离出来的步骤,要根据它们的功能不同而不是实现细            
    节来创建(java支持创建只暴漏接口而不包含方法实现的抽象类 类的行为细节分离    
    
    继承 从基类获取字段和方法 提高了代码重用性 也可不修改的情况 给现有类添加        

    新特性

    抽象和封装的不同点

    抽象和封装是互补的概念。一方面,抽象关注对象的行为。另一方面,封装关注对    
    行为的细节,一般是通过隐藏对象内部状态信息做到封装,因此,封装可以看出是    
    用来提供抽象的一种策略

1、重写与重载的区别
    重写:1、重写是在俩个类中(父子类)方法名和参数列表相同,方法体实现不同
          2、重写遵循“运行期绑定”,根据对象类型调用
    
    重载:1、重载是在一个类中,方法名相同,参数列表不同,
          2、重载遵循“编译器绑定”,根据参数列表调用

2、抽象类和接口的区别
    
    1、抽象类是类有构造器,结构没有构造器
    
    2、抽象类可以有抽象方法和非抽象方法,接口只有抽象方法
    
    3、一个类只能继承一个抽象类,一个类可以实现多个接口
    
    4、子类继承抽象类,建议实现抽象类的所有抽象方法,否者子类也声明为抽象类 ,               
    子类实现接口,接口必须实现接口新所有的抽象方法
    
    5、抽象类和接口都不能被实例化,都需要子类继承与实现

3:this关键字与super关键字区别:
    
    1、this: 指的是当前对象  谁调用指的就是谁。
        访问成员变量或者方法的时候默认都有一个this
        this语法 :this.成员变量  this.方法名this()必须位于构造器第一行
    
    2、super:指的当前对象的父类
        super语法:super.成员变量 super.方法名 super()必须第一行


4:String及StringBuffer和StringBuilder区别
    
    1、String及StringBuffer,StringBuilder都是java.lang包下面的
    
    2、String是不可改变的,StringBuffer及StringBuilder是可变的
    
    3、StringBuffer是线程安全的,同步处理的,性能稍慢
    
    4、StringBuilder是线程不安全的,并发处理,性能稍快。


5:==和equals区别:
    
    1、 ==用于比较变量的值,可以任何类型,若是引用类型则比较两个对象的                
    地址存储是否同一个。

    2、  equals是Object方法,重写之后用于比较两个对象的内容是否一致(像不像)。
    
    3、  Object默认的equals方法比较规则是==一致。

6、List和Set区别Map(都是Collection的子接口):
    
    1、List:可重复元素,且有序,(元素是否重复,却决于元素自身的equals比较结果)    
    实现接口有ArrayList和LinkedList

    
    2、Set: 不可重复集,且无序。最多包含一个null。 
        实现接口有HashSet和TreeSet

    1、ArrayList:底层采用数组方式实现,可以通过下标访问,并且下标从0开始,更        
    适合随机访问,插入和删除性能稍慢。
    
    2、LinkedList底层采用双向链表实现,更适合插入和删除,随机访问速度较慢,在            
    性能要求不是特别苛刻的情况可以忽略。

    3、HashSet底层采用数据结构是Hash表,HashSet是通过元素HashCode值相同,才会        
    判断equals是否为true。若HashCode值不同,不会掉用equals进行判断。

    4、TreeSet:底层是二叉树,TreeSet存储对象时,可以进行排序,但需要指定排序
        算法,依赖于comparaTo方法

集合要掌握的是ArrayList、LinkedList、Hashtable、HashMap、ConcurrentHashMap、HashSet的实现原理,能流利作答,当然能掌握CopyOnWrite容器和Queue是再好不过的了。另外多说一句,ConcurrentHashMap的问题在面试中问得特别多,大概是因为这个类可以衍生出非常多的问题,关于ConcurrentHashMap,我给网友朋友们提供三点回答或者是研究方向:

(1)ConcurrentHashMap的锁分段技术

(2)ConcurrentHashMap的读是否要加锁,为什么

(3)ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器

7、Collection和Collections区别
    
    1、Collection是一个接口,定义集合相关操作方法,有俩个子接口

    2、Collections是集合的工具类,它提供了很多便于操作集合的方法,
        
        静态方法sort()方法进行排序 可以自定义sort()方法(仅对List排序)
        
        静态方法synchronized()方法
        对已有的集合或Map进行转换成线程安全的集合或Map   

8、Exception和Error区别:

    0、都是Throwable的子类

    1、Exception: 表示程序可以处理的异常,可以捕获,遇到这类异常,应该尽可能            处理异常,而不应该随意终止程序。
    

    2、Error:一般指的是虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足            这类错误导致程序中断,仅靠程序本身是无法恢复及维护

    (checked受检查的)必须要用throws 语句在方法或者是构造函数上声明

    (unchecked不受检查的)

    运行时异常RuntimeException
    ArithmeticException ClassCastException IllegalArgumentException
    IllegalStateException IndexOutOfBoundsException NoSuchElementException
    

    

9、进程和线程的区别:
    
    https://blog.csdn.net/u012459345/article/details/51179578

    1、一个进程可以包含多个线程。
        
    2、线程的划分尺度小于进程,使得多线程程序的并发性提高

    3、进程在执行过程中拥有独立的内存单元,而多个线程共享此内存,从而极大提高
        了程序的运行效率

    4、线程不能独立执行


9-1. 请说出你所知道的线程同步的方法。 

    wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 

    sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉        InterruptedException异常。 

    notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确    切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级 

    Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的    锁,而是让它们竞争。 

9-2、区别 线程安全 和线程不安全

    HashMap   是线程不安全的 效率稍快 Hashtable   是线程安全的 效率慢
    ArrayList 不安全的                Vector      安全的 效率慢 
    StringBuilder                  StringBuffer线程安全的 效率慢    


9-3、简述线程的创建方式,线程的几*五*种状态以及状态间的切换**

    //Thread 重写run()方法

    new新建状态  RUNABLE就绪状态  running运行状态 
    
    blocked阻塞状态 dead死亡状态


10、同步操作,异步操作:

    1、同步操作:有先后顺序的操作,性能稍慢,相当于你干完,我再干。

    2、异步操作:多线程并发操作,性能稍快,相当于大家一起干,各干各的

    3、异步操作会发生线程安全问题,需要将异步操作变成同步操作(join)

11、冒泡排序:
    
    //比较相邻的元素,小的往前,大的往后
    public static void bubbleSort(int[]arr){
        //外层控制排序次数
        for(int i=0;i<arr.length-1;i++){
              //内层控制比较次数
            for(int j=0;j<arr.length-1-i;j++){
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
    }

12、查询语句执行顺序

    1、from子句: 执行顺序为从后往前、从右到左(数据量较少的表尽量放在后面)

    2、where子句:执行顺序为自上而下,从右到左(将能过滤掉最大数量记录的条件        写在WHere字句的最右)

    3、group by -- 执行顺讯从左往右分组(最好在GROUP BY 前使用WHERE 将不需要        的记录在GROUP BY 之前过滤掉)

    4、having 子句:消耗资源(尽量避免使用,HAVING 会在检索出所有记录之后才对        结果进行过滤,需要排序等操作)

    5、select子句:少用*号,尽量取字段名称(ORACLE在解析的过程中,通过查询数        据字典将*号依次转换成所有的列名,消耗时间)

    6、order by子句:执行顺序为从左到右排序,消耗资源


13.转发和重定向的区别
    
    转发:只有一次请求  地址栏不刷新  可以携带数据  是之前的request和response
        不能形成回路  
    
    重定向:    地址栏刷新    不可以携带数据 重新创建request和response
        不能形成回路   response.sendRedirect();

    转发和重定向不能同时使用


    主要区别:

    (1)sendRedirect()方法不但可以在位于同一个主机上的不同Web应用程序之间进行重定        向,而且可以将客户端重定向到其他服务器上的Web应用程序资源。而forward(        )方法只能将请求转发给同一Web应用的组件。

    (2)sendRedirect()方法

    (3)转发:浏览器URL的地址栏不变。
    
    转发的绝对路径  从webroot下一层开始写

14、jsp页面中的9大内置对象
    
    request:    向客户端请求数据(一次请求)
    
    response:    服务器响应
    
    out:        向客户端输出数据
    
    pageContext:    页面上下文   管理对属于jsp中特殊可见部分中已经命名对象的访问
    
    session:    会话  默认(30分) 用于保存每个用户信息
    
    config:       servlet配置信息 当一个servlet初始化 容器把某些信息通过此对象            传递给这个servlet        
    
    page              当前jsp实例  是jsp本身 通过这个可以对它进行访问
    
    appliction        代表了当前应用程序的上下文。可以在不同的用户之间共享信息。
    
    exception(只有当前页面设置了isErrorPage="true")  反应运行异常


15、servlet生命周期(******)

    servlet---出生(init)----服务(service)----消亡(destroy)
    当用户第一次访问servlet服务的时候创建该servlet对象
    再次访问servlet,会使用已经创建号的servlet为用户服务
    servlet是一个多线程的
    服务器关闭的时候销毁


16、创建员工表和部门表**
alter table emp ADD
constraint FK_emp_did
foreign key(did) references dept(did);


create table emp(
    eid int primary key auto_increment,
    ename VARCHAR(30),
    pwd VARCHAR(30),
    sex CHAR(2),
    age int,
    hiredate date,
    photo varchar(100),
    resume varchar(100),
    did int
);

create table dept(
    did int primary key auto_increment,
    dname varchar(30),
    des varchar(100)
);


17、springmvc和struts区别

    1、springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过滤器

    2、springmvc是基于方法开发(一个uri对应一个方法),请求参数传递到方法的形参    
    可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,        只能设计为多例

    3、Struts采用值桟存储请求和响应的数据,通过ognl存取数据,springmvc通过参数解        析器是将request请求内容解析,并将方法形成赋值,将数据和视图封装成ModelAndView        对象,最后又将ModelAndView中的模型数据通过request域传输到页面。jsp视图解析器        默认使用jstl(c标签)el表达式

18、Java 中的final关键字有哪些用法?
    (1)修饰类:表示该类不能被继承;
    (2)修饰方法:表示方法不能被重写;
    (3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。


19、&和&&的区别?
    
    &运算符有两种用法:(1)按位与;(2)逻辑与。
    &&运算符是短路与运算。逻辑与跟短路与的差别是非常巨大的,虽然二者都要求运算符左右两端的布尔值都是true整个表达式的值才是true。&&之所以称为短路运算是因为,如果&&左边的表达式的值是false,右边的表达式会被直接短路掉,不会进行运算。很多时候我们可能都需要用&&而不是&,例如在验证用户登录时判定用户名不是null而且不是空字符串,应当写为:username != null &&!username.equals(“”),二者的顺序不能交换,更不能用&运算符,因为第一个条件如果不成立,根本不能进行字符串的equals比较,否则会产生NullPointerException异常。注意:逻辑或运算符(|)和短路或运算符(||)的差别也是如此。


20、******ACID     数据库事务的四大特性

    (原子性)atomic:原子性是指事物包含的所有操作要么全部成功,要么全部失            败回滚
    
    (一致性)caonsistent:一致性是指数据必须从一个一致性状态变换到另一个一            致性状态,也就是一个事务执行之前和执行之后都必须处于一致性状            态

    (隔离性)lsolate:当多个用户并发访问数据库,比如操作同一张表时,数据库            为每个用户开启事务,不能被其他事务的操作干扰,多个并发事务之            间要相互隔离
    
    (持久性)Durable:事务一旦本提交,那么数据库中的改变就是永久性的,即            便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

    
    
21、*****隔离级别

    脏读 是指在一个事务处理过程里读取另一个未提交的事务的数据

    不可重复读(具体字段) 是指在对于数据库中的某个数据,一个事务范围内多            次查询却返回了不同的数据值 这是由于在查询间隔,将另一个事务修改并提交
    
    幻读  (多条记录) 事务非独立执行时发生的一种现象
    
    事务:多行代码 一块成功 一块失败

    幻读和不可重复读都是读取了另一条已经提交的事务(这点和脏读不同),所不            同的his不可重复读查询的都是同一个数据,二幻读针对的是一批数据整体(比如数    据的个数)

    mysql四种隔离级别
    Serializable 可避免脏读、不可重复读、幻读发送  最高级别(级别高执行效率低)

22、(JDBC)PreparedStatement比Statement有什么优势?

    PreparedStatement 是预编译的,因此,性能会更好,同时,不同的查询参数值
    PreparedStatement 可以重用

23、在Java项目中,我们可能有一些开发(需求),它需要我们抽象出一个面,需要在这个    面上做一些处理,而spring就可以可以实现,借助Spring就非常便利。实现上面的    需求,我们需要完成的事情,如下:

    抽象一个切面(aspect) 
    创建一个bean;

    找到切入点(pointcut)

    在切人点,执行指定的通知(advice); 
    注意通知的类型:around,before,after。

    在spring的 XML中使用指定的标签进行配置即可

    总结:完成上面的事情之后,在Spring启动的时候,在指定的切入点(方法)执行    时,就会按照配置的预期执行我们的通知。    

24、数据库的优化:
    
    0、不用和数据库频繁的连接(批量操作 尽量多用缓冲ehcache,redies)
         1、使用连接池 获取连接
     2、在合适的列上建立索引
    3、要对表中的数据进行分区(列表分区 范围分区 散列分区  复合分区)  查询数便        利 
    4、尽量降低join 表的连接数量
    5、尽量避免子查询过多的使用
    6、select 不能用* 查询条件不能很复杂
     7、尽量不要用'%张' not in () 等 就索引失效了   
    8、(选择正确的存储引擎)存储过程

    9、几乎总是有一个id字段
    10、在varchar上使用enum

25、什么是spring框架
    
    使用spring框架有哪些好处
    
    什么是控制反转ioc和依赖注入
        1、构造器注入
        2、Setter方法注入
        3、接口注入
    
    org.springframework.beans 和context包构成了spring框架ioc容器的基础

    org.springframwwork.beans.factory.BeanFactory是spring ioc容器的具体实现,        用来包装盒管理前面提到的各种bean

    BeanFactory接口是spring ioc容器核心接口


26、maven 项目构建的生命周期

    清理clean
    初始化  编译  测试  
    大包  集成测试 安装(install)  本地仓库  发布(deploy)
    生成站点报告  文档等 

27、单例模式

    不管什么情况这个类只能有唯一的一个实例对象

    1)只能在本类内部创建唯一实例对象(注意:构造器是私有的)
    2)在外部类 提供一个能获取一次实例公开方法
    3)即使在本类内部 只能获取一次实例对象

    饿汉式
    public class SingleTon2{
       
       private static final SingleTon2 instance = new SingleTon2();

       private SingleTon2(){}

       public static SingleTon2 getInstance(){
        return instance;    
       }
    }

    懒汉式
    package test;

    public class SingleTon2 {
    
    private static SingleTon2 instance = null;
    
    private SingleTon2(){}
    
    public static synchronized SingleTon2 getInstance(){
        if(instance==null){
            instance  = new SingleTon2();
        }
        return instance;
    }
    }


1.重定向的概念(******)
    
    response.sendRedirect("重定向的地址");
    1).会创建俩组reuqest,和response对象
    2).会导致浏览器地址栏刷新
    3).重定向不能形成回路
    4).重定向之前不能关闭response的输出流


2.servlet生命周期(******)

    servlet---出生(init)----服务(service)----消亡(destroy)
    当用户第一次访问servlet服务的时候创建该servlet对象
    再次访问servlet,会使用已经创建号的servlet为用户服务
    servlet是一个多线程的
    服务器关闭的时候销毁

3.servlet相关对象的创建


**4、创建员工表和部门表**
alter table emp ADD
constraint FK_emp_did
foreign key(did) references dept(did);


create table emp(
    eid int primary key auto_increment,
    ename VARCHAR(30),
    pwd VARCHAR(30),
    sex CHAR(2),
    age int,
    hiredate date,
    photo varchar(100),
    resume varchar(100),
    did int
);

create table dept(
    did int primary key auto_increment,
    dname varchar(30),
    des varchar(100)
);

**5.简述线程的创建方式,线程的几种状态以及状态间的切换**

    new  RUNABLE  running blocked dead

**6.简述 & 与 &&  的区别
       
       &并且  是位运算
       &&  一般用这个  有短路
       &和&&都是逻辑运算


**7.简述多态中向上转型、向下转型

    向上转型自然转换  向下转换需要强转


**8.接口与抽象类

    (1)接口可以被多重implements,抽象类只能被单一extends
    (2)接口只有定义,抽象类可以有定义和实现
    (3)接口的字段定义默认为:public static final, 抽象类字段默认是"friendly"(本        包可见)     


**9.异常

    Try:执行部分,产生异常
    Catch:捕捉异常
    Finally:不管有没有异常都执行
    Throws:在方法声明处声明要抛出的异常,调用者必须对其进行处理。
    Throw:抛出一个异常
    在try中可以抛出异常,一般与声明的异常相同。
    自定义异常要继承于Exception或Exception的子类


**10.set  和  equals()

    Set里的元素是不能重复的,那么用iterator()方法来区分重复与否。equals()是判            读两个Set是否相等
        equals()和==方法决定引用值是否指向同一对象equals()在类中被覆盖,为的是当两        个分离的对象的内容和类型相配的话,返回真值


1、什么是服务器


查看Apache的定义时,会发现,Apache为Web server,也就是Web服务器。

Web服务器是指能够为发出请求的浏览器提供文档的程序。服务器是一种被动程序,只有浏览器发出请求的时候才会响应。应用层使用的是HTTP协议。

2、Web服务器,Web容器和应用服务器的区别


Web Server,Web container和Application Server区别。

Web Server,Web服务器,同上面所说,Web服务器是指能够为发出请求的浏览器提供文档的程序。服务器是一种被动程序,只有浏览器发出请求的时候才会响应。应用层使用的是HTTP协议。目前最主流的三个Web服务器是Apache Nginx IIS。

3、Apache和Tomcat的区别


Apache指的是Apache HTTP Server。
stackoverflow里面的这个问题虽然被关闭了,但是有一个评论写的博客挺好的。
What is Tomcat? Is it a Web Server? What can Tomcat do? How is it different than Apache Web Server?
里面就讲到:

Tomcat是一个Servlet/Jsp容器,它同时也作为一个web服务器使用。

Tomcat = ( Web Server + Servlet container + JSP environment ),因为我们知道JSP也是转译为Servlet的,Tomcat接收请求之后,如果是JSP页面的话,Tomcat里面的JSP引擎可以将JSP转换为Servlet类。

从这里也可以看到,其实Tomcat既是Web服务器也是Web容器。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值