• 新点面试题


    目录

                                                            JavaSE

    循环语句

    跳出循环

    自动装包自动解包***

    ==和equals的区别***

    抽象类和接口的区别

    深拷贝、浅拷贝***

    泛型中和的区别***

    常见的异常

    进程线程

    创建线程的方式***

    并发并行***

    wait()、sleep()、yield()、join()

    run和start的区别

    死锁

    加锁方式***

    死锁产生的4个必要条件

    如何避免死锁

    常见集合list set map

    Arraylist和linkedlist的区别

    HashMap和HashTable的区别

                                                             MySQL数据库

    sql语句***

    数据库事务***

    事务用到的场景

    数据库池

    数据库连接池的作用

    引擎种类,区别

    索引

    数据结构

    B-树

    B+树

    索引的分类和创建

    聚簇索引和非聚簇索引

    普通索引

    唯一索引

    使用索引的问题

    哪些情况下适合建立索引

    哪些情况不适合建立索引

    索引失效

                                                             Web前端

    post和get的区别

    双向绑定 城市天气思路

                                                            JavaWeb  

    http状态码

    http和https                                                         

    cookie和session**


                                                            JavaSE

    循环语句

    while:先判断条件是否满足,是则进入循环,否进行后续语句

    do while:先进入循环,后判断条件

    for:固定次数用for,必须执行一次用do while,其他用while

    跳出循环

    • break[break语句]的使用场合主要是switch语句和循环结构。
    1. 在循环结构中使用break语句,如果执行了break语句,那么就退出循环,接着执行循环结构下面的第一条语句。如果在多重嵌套循环中使用break语句,当执行break语句的时候,退出的是它所在的循环结构,对外层循环没有任何影响。
    2. 如果循环结构里有switch语句,并且在switch语句中使用了break语句,当执行switch语句中的break语句时,仅退出switch语句,不会退出外面的循环结构。
    • continue跳过循环这一轮剩下的语句进行下一轮循环
    • 在循环体内执行return,将会结束该方法,循环9直接结束。
    • 跳过二次循环 break+标签

    自动装包自动解包***

    装箱就是自动将基本数据类型转换为包装器类型;

    拆箱就是自动将包装器类型转换为基本数据类型。

    ==和equals的区别***

    • ==是运算符
    1. 对于基本类型, 比较的是值是否相同
    2. 对于引用类型,比较引用地址是否相同
    • equals是object方法

    equals方法只能用来比较引用数据类型,在Object类中所定义的equals方法底层也是通过==号比

    较对象的地址值。但是如果一个类重写了 equals 方法此时就可以比较内容了。

    抽象类和接口的区别

    • 抽象类

    ①抽象类可以定义构造器

    ②可以有抽象⽅法和具体⽅法

    ③抽象类中的成员可以是各种类型

    ④抽象类中可以定义成员变量可以包含静态⽅法

    ⑤有抽象⽅法的类必须声明为抽象类⽽抽象类未必要有抽象⽅法

    ⑥ ⼀个类只能继承⼀个抽象类

    • 接⼝

    ①接⼝中不能定义构造器

    ②⽅法全是抽象⽅法

    ③接⼝中的成员全是Public的

    ④接⼝中定义的成员变量实际上都是常量

    接⼝中不能有静态⽅法,⼀个类可以实现多个接⼝

    深拷贝、浅拷贝***

    深拷贝:深拷贝则是拷贝了主对象的所有值而不是地址,所以即使主对象的值发生任何变化时,拷贝对象的值也不会改变。

    浅拷贝:浅拷贝只是拷贝了主对象的地址,拷贝对象的值也会随之发生变化。

    泛型中的区别***

            是get优先,put受限,适用于提取元素为主的场景。

            可以赋值给任何T以及T的子类的集合,上界为T,取出的类型带有泛型限制,向上转型为T,除了null以外,任何元素不得添加进集合内。

            是put优先,get受限,适用于存放元素为主的场景。

            可以赋值给任何T以及T的父类集合,下界为T,取出的类型会泛型丢失,添加时只能添加T或T的子类。

    常见的异常

    输入输出异常:IOException

    空指针异常类:NullPointerException

    算术异常类:ArithmeticExecption

    数组下标越界异常:ArrayIndexOutOfBoundsException

    进程线程

    1、电脑打开一个应用程序就是一个进程。

    2、进程实现了操作系统的并发性,线程实现了进程的内部并发

    3、一个进程包含多个线程,线程在进程的内部

    4、进程是资源分配的最小单位,线程是程序执行的最小单位

    5、进程有自己的独立地址空间,线程是共享进程中的数据,使用相同的地址空间

    6、多个进程同时执行时,如果一个进程崩溃,一般不会影响其他进程,而同一进程内的多个线程之间,如果一个线程崩溃,很可能使得整个进程崩溃。

    创建线程的方式***

    继承Thread类创建线程

    实现Runnable接口

    使用Callable接口,有返回值

    使用线程池例如用Executor框架

    并发并行***

    • 并发是指一个处理器同时处理多个任务。允许两个任务彼此干扰,同一时间点只有一个任务运行,交替执行(接力跑)
    • 并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。时间上重叠,两任务在同一时刻互不干扰同时执行(齐跑)

    并发是逻辑上的同时发生(simultaneous),而并行是物理上的同时发生。

    并发就像一个人(CPU)喂两个小孩(程序)吃饭,表面上是两个小孩在吃饭,实际是一个人在喂。

    并行就是两个人喂两个小孩子吃饭。

    wait()、sleep()、yield()、join()

    • wait() -- 让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)。
    1. notify() -- 唤醒在此对象监视器上等待的单个线程。
    2. notifyAll() -- 唤醒在此对象监视器上等待的所有线程。
    • sleep()的作用是让当前线程休眠,即当前线程会从“运行状态”进入到“休眠(阻塞)状态”。sleep()会指定休眠时间,线程休眠的时间会大于/等于该休眠时间;在线程重新被唤醒时,它会由“阻塞状态”变成“就绪状态”,从而等待cpu的调度执行。
    • yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!
    • join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。
    1. wait() 是Object类 的方法,sleep()是 Thread 类的方法。

    2. wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用。

    3. sleep不需要被唤醒,wait需要

    4. sleep方法没有释放锁,而wait方法释放了锁。

    run和start的区别

    • run执行的是main线程,他只是thread的一个普通方法的调用而已
    • start执行的是thread线程,调用start方法会创建一个新的子线程并启动

    死锁

    资源竞争,两个或两个以上的进程因争夺资源而造成一种相互等待的现象

    两个线程互相持有对方的锁从而造成线程阻塞

    加锁方式***

    Lock(比synchronized要轻量级)

    synchronized方式(重量级锁)

    wait() notify() notifyAll()

    死锁产生的4个必要条件

    1、互斥: 某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束。

    2、占有且等待: 一个进程本身占有资源(一种或多种),同时还有资源未得到满足,正在等待其他进程释放该资源。

    3、不可抢占: 别人已经占有了某项资源,你不能因为自己也需要该资源,就去把别人的资源抢过来。

    4、循环等待: 存在一个进程链,使得每个进程都占有下一个进程所需的至少一种资源。

    如何避免死锁

    • 加锁顺序

    一个线程如果要获取多个锁,必须按照一定的顺序去获取,比如要获取A B C 三把锁,我们规定,必须获取到了 AB 两把锁,才能去获取 C锁

    举个例子 现在有两个线程 都要去获取 ABC 三把锁

    然后 1号 线程 获取到了 A 和 B 两把锁
    2号 线程获取了 C锁

    于是 1号线程在等待 2号线程释放锁C锁
    2号线程在等待 1 号线程释放 A 和 B 锁
    于是出现了死锁

    现在采用加锁队列后,必须先 获取 A 和 B 才能获取C锁,所以 2号线程就没有机会在没有获取 AB 的情况下拿到C锁,就不会出现死锁问题

    这个策略的最大问题是,你必须提前知道所有用到的锁,这个有些时候难以预测

    • 加锁时限

    一个线程尝试去获取锁,如果在指定的时间内获取不到,就放弃等待锁,并释放自己现在所持有的锁,然后随机等待一定时间,再去获取锁

    这里要注意的是 ,等待的时间一定要是随机,不然可能出现 两个线程都释放资源,然后等待相同时间,然后再一起去获取锁,于是又死锁,这种现象称为活锁

    • 死锁检测

    利用数据结构,如 一个map,然后每次线程的上锁,和获取不到锁,都记录在里面,当一个线程获取不到锁的时候,就去便利查看这个map,看一下有没有死锁,有的话就将整个map里所有的锁全部释放,然后各个线程稍作等待,再去竞争锁。
    这里还可以优化下,设置优先级,释放所有锁的时候,不释放优先级高的锁,能提高性能。

    常见集合list set map

    • list:有序,按对象进入的顺序保存对象,可重复,允许多个Null元素对象,可以使用Iterator取出所有元素,在逐一遍历,还可以使用get(int index)获取指定下标的元素
    • set :无序,集合属于单列集合,不允许包含重复元素,判断元素是否重复的标准为对象的 equals 方法
    • map:集合属于双列Key-value键值对的集合,Key不允许重复,是否允许为 null 根据实现类而定,Value 随意; 2) Map 接口的实现类主要有三种:HashMap、LinkedHashMap、TreeMap、Hashtable、ConcurrentHashMap。

    Arraylist和linkedlist的区别

    arraylist:基于动态数组,连续内存存储,适合下标访问,扩容时适合使用尾插法,线程不安全

    linkedlist:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询,遍历时使用iterator不能使用for,因为每次for循环体内通过get(i)取得某一元素时都需要对list重新进行遍历,性能消耗极大,线程安全

    HashMap和HashTable的区别

    HashMap方法没有synchronized修饰,线程非安全,HashTable线程安全;

    HashMap允许key和value为null,而HashTable不允许


                                                            MySQL数据库

    sql语句***

    1)select count(*)from 订单        表 where name like “%电脑%” group by name

    2)select name birth from student where name like 李% and birth > 2001.1 . 1 limit 10 desc

    3)select 学号,sum(成绩)from学生表group by学号 order by sum(成绩)desc

    数据库事务***

    数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。(例子:电子支付)

    A:原子性:事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败

    C:一致性:在事务开始之前和事务结束之后,数据库的完整性没有被破坏。

    I:隔离性:并发执行的事务不会相互影响

    D:持久性:事务一旦提交,其对数据库的更新就是持久的

    事务用到的场景

    对数据库库进行操作的时候,可以进行提交事务,如果不想提交事务,可以用到事务回滚

    数据库池

    Druid、Tomcat jdbc pool

    数据库连接池的作用

    连接池是将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对数据库进行访问。这样省略了创建连接和销毁连接的过程。这样性能上得到了提高。

    1、资源复用:由于数据库连接得到重用,避免了频繁创建、释放引起的大量性能开销。在减少系统消耗的基础上,在另一方面也增进了系统运行环境的平稳性(减少内存碎片及数据库临时进程/线程的数量)

    2、更快的系统响应速度:数据库连接池在初始化过程中,往往已经创建了若干个数据库连接置于池中备用,此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有的可用连接,避免了数据库连接初始化和释放过程的时间,从而缩减了系统整体相应时间。

    3、统一的连接管理,避免数据库连接泄露:在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接,从而避免了常规数据库连接操作中可能出现的额资源泄露。

    引擎种类,区别

    1.MyISAM : 是旧版本mysql的默认引擎,现在默认引擎是InnoDB。MyISAM引擎的主要特点就是快,没有事务处理操作,也不支持外键操作。适合于多读取插入,少更新删除的操作表。存储数据分成三个文件:.frm(存储表定义) .MYD(存储数据) .MYI(存储索引)

    用法: engine=myisam default charset=utf-8 ;

    2.InnoDB :是新版本mysql的默认引擎,支持事务处理和外键,但是其缺点几就是慢了些。存储方式分为两种:1.共享表空间存储。[.frm(表结构) 和 innodb_data_home(数据)和innodb_data_file_path(索引)] 2.多表空间存储。 [.frm(表结构) 和 .idb(数据) ]。

    索引

    数据结构

    mysql的数据是存储在磁盘上的,满足对日常操作【CRUD】的高效稳定,可以通过提升硬件配置来解决。选用合适的数据结构也很关键,innodb采用的就是一种名为【B+树】的数据结构。

    我们之前学习过的innodb数据是以【行】为单位,存在一个大小为16k【页】中,B+树的作用就是按照一个组织形式,将所有的【页】组织关联起来。

    B-树

    Balance(平衡),类似一种平衡二叉树。

    B-树的特点:

    1. 所有的键值分步在整棵树中;

    2. 任何一个关键字出现且只出现在一个结点中

    3. 搜索有可能在非子结点结束

    4. 在关键字全集内做一次查找,性能逼近二分查找

    B+树

    是B-树的变体,是一种多路搜索树。

    特点:

    1. 所有的关键字都存储在子结点

    2. 为所有的子结点增加了一个双向指针

    选择使用B+树的原因:

    • 相同的空间,不存放【整行数据】就能存【更多的id】,B+树能使每个结点能检索的【范围更大、更精确、极大的减少了I/O操作,层高较低,通常3到4层就可以支持百万级的数据量】

    • Mysql是关系型数据库,B+树子结点增加了双向指针,加强了区间的方文星,可以在范围内查询。

    查询相同的记录,使用【id列】比使用【非主键列】快几百倍!!!

    • 使用主键列查找数据时,可以利用B+树的特定,自上向下查询

    • 使用非主键列只能从子结点进行【全表扫描】,一个一个的比较。

    索引的分类和创建

    聚簇索引和非聚簇索引

    【主键和数据】共存的索引被称之为【聚簇索引】。

    【username和数据】建立的索引【非聚簇索引】。

    聚簇索引只有在innodb引擎中才存在,再MyIsam中是不存在的。

    Innodb使用的时聚簇索引,他会将主键组织到一颗B+树中,而行数据存储在叶子结点上,

    如果使用的是where id=1这样的条件查询主键,按照B+树的检索算法来查找对应的叶子结点,获得行的数据。

    如果对username列进行搜索,并且username列已经建立索引,需要两个步骤:

    • 第一步在非聚簇索引中检索username,到达其子结点获取对应的主键

    • 第二步使用主键在聚簇索引B+数中再执行一次B+树检索操作,最后达到叶子结点集合获取整行的数据。

    MyIsam使用的是非聚簇索引。

    普通索引

    创建索引:

    -- 给username整列添加索引
    create index idx_user_name on user(user_name);
    -- 给email可以截取前几个字符
    create index idx_email on user(email(5));

    创建索引本身是一个非常耗资源的操作。

    创建索引之后,查询效率会显著提升。

    删除索引:

    drop index idx_user_name on user;

    修改索引:

    1. -- 通过修改的方式来添加索引
    2. ALTER table user add index idx_email (email)
    3. -- 在创建表的同时创建索引
    4. CREATE table student (
    5. sid int,
    6. sname varchar(20),
    7. gender varchar(1),
    8. index idx_sid (sid)
    9. );

    唯一索引

    对列的要求:索引列的值不能重复。

    创建唯一索引:

    1. -- 创建唯一索引
    2. create unique index idx_email on user(email);
    3. -- 也可以通过修改的方式添加唯一索引
    4. ALTER table user add unique index idx_email (email)

    唯一索引和主键的区别:

    • 唯一索引列允许空值,主键列不能为空

    • 主键列在创建时,已经默认为非空+唯一索引

    • 主键可以被其他表引用为外键,但是唯一索引不能用为外键

    • 一个表只能有一个主键,但是可以创建多个唯一索引

    • 主键更适合不容易更改的标识,如:身份证号,自增

    唯一约束和唯一索引的区别:

    • 都可以实现数据的唯一,数据都可以为null

    • 创建唯一约束,会自动创建一个同名的唯一索引,该索引不能单独删除,删除约束时会自动删除索引。唯一约束是通过唯一索引来实现数据的唯一。

    • 创建一个唯一索引,这个索引就是一个独立的索引,是可以单独删除

    • 建议,如果想要让索引和约束单独存在,先建立唯一索引,再建立唯一约束。

    使用索引的问题

    哪些情况下适合建立索引

    • 频繁作为where条件语句查询的字段

    • 关联字段需要建立索引

    • 分组,排序字段可以建立索引

    • 统计字段可以建立索引

    哪些情况不适合建立索引

    • 频繁更新的字段

    • where条件中用不到的字段

    • 表数据可以确定比较少

    • 数据重复且发布比较均匀的资源

    • 参与列计算

    索引失效

    • 如果查询条件中有or,除非全部条件都有索引。

    • 复合索引不满足最左原则

    • like查询以“%”开头

    • 存在列计算

    • 如果mysql使用全表扫描比使用索引快:结果量很大。

    • 列存在类型转换


                                                            Web前端

    post和get的区别

    GET请求参数是通过URL进行传递的,POST请求的参数包含在请求体当中。

    GET请求比POST请求更不安全,因为参数直接暴露在URL中,所以,GET请求不能用来传递敏感信息。

    GET请求在url中传递的参数是有长度限制的(在HTTP协议中并没有对URL的长度进行限制,限制是特定的浏览器以及服务器对他的限制,不同浏览器限制的长度不同。),POST对长度没有限制。

    GET请求参数会完整的保留在浏览器的历史记录中,POST请求的参数不会保留。

    GET请求进行url编码(百分号编码),POST请求支持多种编码方式。

    GET请求产生的URL地址是可以被bookmark(添加书签)的,POST请求不可以。

    GET请求在浏览器回退的时候是无害的,POST请求会.再次提交数据。

    GET请求在浏览器中可以被主动cache(缓存),而POST请求不会,可以手动设置。

    双向绑定 城市天气思路

    首先需要获取所有省的数组,通过遍历得到省

    需要根据省份的adcode值与你选择的省份值进行对比,然后得到所有市的数组,获取市的数组、再进行遍历得到市

    最后获取所有(县、镇)的数组,必须根据所在省、所在市才可以得到县、镇


                                                            JavaWeb

    http状态码

    200(成功)服务器已成功处理了请求

    400(错误请求)服务器不理解请求的语法

    403(禁止)服务器拒绝请求

    404(未找到)服务器找不到请求网页

    500,(服务器内部错误)服务器遇到错误,无法完成请求

    http和https

    • http协议:是超文本传输协议,信息是明文传输。如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。

    • https协议:是具有安 全性的ssl加密传输协议,为浏览器和服务器之间的通信加密,确保数据传输的安全。

    • http协议:http的连接很简单,是无状态的。

    • https协议:是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议。

    • http协议:使用的端口是80。

    • https协议:使用的端口是443.

    • http协议:免费申请。

    • https协议:需要到ca申请证书,一般免费证书很少,需要交费。

    cookie和session***

    Session存在服务器,Cookie可以存储在浏览器

    session能够存储任意的java对象,cookie只能存储String类型

    Session比cookie更具安全性

    session没有大小限制,cookie保存的数据不超过4k,只能服务器内存的大小有关

    session占用服务器性能,session过多,增加服务器压力

  • 相关阅读:
    开源MyBatisGenerator组件源码分析
    如何在不依靠工资收入的情况下赚到一万元?
    计算机组成原理——中央处理器-异常和中断机制(课程笔记)
    linux gdb常用命令汇总
    黑客(网络安全)技术——高效自学
    [杂谈]-快速了解直接内存访问 (DMA)
    HAL库笔记(重要库函数)
    Matlab操作HDF5文件示例
    Linux进程等待
    MySQL之数据查询(WHERE)
  • 原文地址:https://blog.csdn.net/weixin_56982770/article/details/127406273