新点面试题

目录

                                                        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的

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

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

深拷贝、浅拷贝***

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

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

泛型中<? super T>和<? extends T>的区别***

  • <? extends T>:

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

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

  • <? super T>:

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

        <? super T>可以赋值给任何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;

修改索引:

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

唯一索引

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

创建唯一索引:

-- 创建唯一索引
create unique index idx_email on user(email);
-- 也可以通过修改的方式添加唯一索引
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过多,增加服务器压力

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值