- java.object 类下的方法?
答: hashcode(),equals(),getClass();wait();notify() - string 的相关问题 == ?
@Test
public void testString(){
//常量找 池 ,变量找 堆
String s1 = new String("java"); //创建2 个对象
String s2 = "java"; //创建0 个
String s3 = new String("java"); // 创建1 个
System.out.println(s1 == s2);
System.out.println(s2 == s3);
System.out.println(s1 == s3);
// false false false
String s4 = "spring";
String s5 = "sp";
String s6 = "ing";
System.out.println(s4 == "spring");
System.out.println(s4 == s5+s6);
System.out.println(s4 == s5+"ing");
//true false false
}
- mysql 和时间相关的查询,如当天 当月 等
答:https://www.cnblogs.com/benefitworld/p/5832897.html ,使用DATE_FORMAT( 时间字段名, ‘%Y%m’ ) 进行格式化进行比较。 - 关于classCloader的一些特点?
答:https://mp.weixin.qq.com/s/4n59kP3RZDSircDiHzXtHQ 。接着按需加载,向上传递,三个加载类 BootstrapClassLoader 负责加载 JVM 运行时核心类;ExtensionClassLoader 负责加载 JVM 扩展类,比如 swing 系列、内置的 js 引擎、xml 解析器 等;AppClassLoader 才是直接面向我们用户的加载器,它会加载 Classpath 环境变量里定义的路径中的 jar 包和目录;Class.forName 方法来动态加载驱动类; - 选择排序?
//从大到小
@Test
public void oderNum(){
int[] arr = {23,43,24,65,42};
for(int i = 0; i<arr.length;i++){
int min = i;
//找出最小值的下表
for(int j = i + 1 ;j<arr.length;j++){
if(arr[j]>arr[min]){
min = j;
}
}
// 将最小值放到未排序记录的第一个位置
if(min > i){
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
- 冒泡排序算法?
//要求从小到大排序
@Test
public void orderNum(){
int[] arr = {23,12,34,53,15};
for(int i= 0;i<arr.length-1;i++){
for(int j = 0;j<arr.length-i-1;j++){
if(arr[j] > arr[j+1]){ //交换位置
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
-
Http请求 get 与 post 的区别?
答:详细:https://www.cnblogs.com/logsharing/p/8448446.html ,HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
GET产生一个TCP数据包;POST产生两个TCP数据包。
长的说:
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。 -
以下js 代码输出什么?
function test(){
console.log(a);
console.log(fun());
var a = 3;
function fun(){
return 4;
}
}
test();
答:将会打印 undefined 4
- 使用js 如何创建对象?
function createStudent(name,sex,grade){
var o = new Object();
o.name = name;
o.sex = sex;
o.grade = grade;
o.sayName = function(){
console.log(this.name);
}
return o;
}
var s1 = createStudent('Claiyre','famale',1);
- spring 的@Resource和@Autowired注解有什么区别?
答:@Autowired注解是根据类型注入,而@Resource是先根据name进行装配,name找不到再根据类型进行装配。 - ajax 主要是用哪个对象创建的?
答: XMLHttpRequest是一个浏览器接口,使得Javascript可以进行HTTP(S)通信,这就是我们熟悉的AJAX。 - linux 查端口查服务命令?
1.[root@localhost-ninl bin]# netstat -tunlp | grep 2181
tcp6 0 0 :::2181 :::* LISTEN 1729/java
2.[root@localhost-ninl bin]# ps -ef|grep zookeeper
- 说出一些的服务的默认端口号?
答:Tomcat 默认是8080;nginx默认是80 ;elasticsearch 默认是java 操作 9300,浏览器访问 9200 ;redis 是 6379 ; zookeeper 默认是2181 - redis 是什么?
答:是一种key-value型数据库,五种类型 String(字符串),Hash(哈希),List(列表),Set(集合),SortedSet(有序集合). 使用场景:用作缓存(经常查询,很少改动),减少数据库访问压力;用作计数器(原子性),解决库存溢出等问题,web集群时作为session缓存服务器。 - redis 对象存储的方式?
答:redis 的key 总是字符串类型,值可以是字符串对象,列表对象,哈希对象,集合对象,有序集合对象。redis的对象存储方式有 json 字符串 (需要将对象转为json字符串,当作字符串,直接使用get或set,使用比较简单)或者是字节(需要做序列化处理,就是把对象序列化成字节,使用序列化工具kyro)
127.0.0.1:6379> set str "hello world"
OK
127.0.0.1:6379> type str
string
127.0.0.1:6379> rpush listksy "hello" "world" "listKsy"
(integer) 3
127.0.0.1:6379> lrange listksy 0 -1
1) "hello"
2) "world"
3) "listKsy"
127.0.0.1:6379> type listksy
list
127.0.0.1:6379> sadd fruits apple bannana cherry
(integer) 3
127.0.0.1:6379> type fruits
set
127.0.0.1:6379> zadd price 8.5 apple 5.0 bannana 6.8 cherry
(integer) 3
127.0.0.1:6379> type price
zset
127.0.0.1:6379> zrange price 0 -1
1) "bannana"
2) "cherry"
3) "apple"
127.0.0.1:6379> zrangebyscore price 0 100
1) "bannana"
2) "cherry"
3) "apple"
127.0.0.1:6379> zrange price 0 -1 withscores
1) "bannana"
2) "5"
3) "cherry"
4) "6.7999999999999998"
5) "apple"
6) "8.5"
127.0.0.1:6379> hset profile name tom age 23 career javaProgram
(integer) 3
127.0.0.1:6379> hget profile name
"tom"
127.0.0.1:6379> type profile
hash
-
redis的数据淘汰机制?
答:redis的数据量上升到一定大小的时候,就会实行数据淘汰;有6中数据淘汰机制。
volatile-lru:从已设置过期时间的数据集挑选最少使用的数据进行淘汰;
volitile-ttl:将已过期的数据淘汰;
从已过期的数据中选择任意数据进行淘汰;从数据中挑选最少使用的数据;从数据中挑选任意数据进行淘汰; -
批量添加几百万条数据?
答:jdbc更改提交为非自动提交;变多次提交为一次,批量插入, 然后再提交;批量插入也可以使用存储过程。 -
inner join ,left join以及right join的功能特点?
答:inner join(等值连接) 只返回两个表中联结字段相等的行
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录 -
sleep() 和wait() 方法的区别?
答:sleep() 方法:线程主动放弃CPU,使得线程在指定的时间内进入阻塞状态,不能得到CPU 时间,指定的时间一过,线程重新进入可执行状态。典型地,sleep() 被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。
wait( ) :与notify()配套使用,wait()使得线程进入阻塞状态,它有两种形式,一种允许指定以毫秒为单位的一段时间作为参数,另一种没有参数,当指定时间参数时对应的 notify() 被调用或者超出指定时间时线程重新进入可执行状态,后者则必须对应的 notify() 被调用 -
HashSet是如何保证 添加的内容是不重复的?
答:由源码可知,HashSet的add( key )方法 是通过Hashmap的put(key,new Object() )实现的。HashMap是允许键值为null的。 -
hashMap 的工作原理?
答:Hashmap 存储一个键值对的时候,先对key调用hasCode()方法,如果哈希值不一样则认为该key不存在,可以添加;如果哈希值是一样的,则还需要调用newKey.equals( oldKey) 方法 进行再次判断,如果equals 方法返回true, 则认为该key 已存在,然后对值进行更新;获取key对应的值的时候,也是通过key的哈希值找到对应的节点,然后获取该节点上value;
@Test
public void testSet(){
HashSet set = new HashSet();
set.add("Hello");
set.add("world");
set.add("Hello");
for (Object s:set) {
System.out.println(s.toString());
}
String a = "hello";
System.out.println(a.hashCode());
String b = "hello";
System.out.println(b.hashCode());
Map<String,String> map = new HashMap();
map.put(a,"world1");
map.put(b,"world2");
for (Map.Entry<String,String> entry:map.entrySet()){
System.out.println(entry.getKey()+"-->"+entry.getValue());
}
System.out.println(map.get(a));
}
- & 和 && 的区别?
答:一个是与操作符,一个逻辑与;& 是操作符,1001 & 1011 = 1001; && 是逻辑关系,不具有计算功能,都为真,结果才为真,如果第一个表达式的值是false,则第二个表达式将不会执行,直接返回false。 - 用最有效率的方法计算2 乘以8 等于几?
答:利用c语言的操作符。2 右移 3位 --> 0010(二进制)–>左移3位是0010,000 == 2的四次方 (16); - 1.spring开发模式的流程
==| springmvc 将所有的请求都提交给DispatcherServlet ->DispactcherServlet将请求目标提交到目标Controller
DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller -> Controller进行业务逻辑处理后,会返回一个ModleAndView ->
找到ModleAndView对象指定的视图对象 -> 视图对象负责渲染返回客户端 - 2.int 占4个字节,每个字节是8位,占32位;
- 3.面向对象的特征? 封装,继承,多态,抽象
- 4.基本数据类型?int byte char boolean double float long short ; 装箱之后(成为包装类型) integer Byte … ;string 是引用类型
-
- == 和 equals() 的区别?
答:先说清一个,再说清一个;
== 操作符,用来判断两个变量是否相等,如果类型是基本数据类型则直接比较值是否相等,如果类型是引用变量则比较对应内存地址的首地址。
equals() 用来比较两个对象的的某些特征是否一样,实际就是调用该对象的equals()方法。
- == 和 equals() 的区别?
- 6.staring , stringBuilder , stringBuffer 的区别?
答:都是用来操作字符串的的,String是内容不可变,使用final修饰的 不可变的字符数组 final char[] value,而StringBuilder 和 StringBuffer 是内容可变的,底层使用的可变的字符数组char[] value,没有使用final 修饰。 都可以用来拼接字符串,单线程下 StringBuiler 效率最高(不用创建多个对象),多线程下应
使用StringBuffer,使用string的“+” 号 拼接 ,需要创建多个对象,所以效率低。 - 7.java 中的集合?
答: java 中的集合分为 value 和 key-value ;值 集合包括 list,set,key-value 包括map ;
list 集合的特点: 可以重复,有序的;而set 集合是 不可重复的,无序的,通过 hashcode() 和 equals() 进行判断 是否重复,所以如果一个对象要存在set中需要重写 hashcode 和 equals 方法;
List 的实现类有ArrayList 和 LinkedList ;
ArrayList 底层使用数组的方式实现的,所以查询快,增删慢;而LinkedList 底层是队列实现的,所以查询慢(无索引),增删快; - 8.hashMap 和 hashTable 的区别?
答: hashmap 是可以用null 作为key 和 value的,而hashtable 不可以;Hashmap 是线程不安全的,效率高,HashTable 是线程安全的,效率低。 如果想效率高,并且线程安全,可以使用CurrentHashMap,该类在jdk1.5 之后,和上面两个类包名不一样,在并发包下。 - 9.实现拷贝文件的工具类是使用字节流 还是字符流?
答:我们拷贝的文件不确定只包含字符流,例如包括 图片,图像 ,声音等,我们应该使用字节流 ,这样会通用;引文字符流不支支持图片等 - 10.线程的几种实现方式?
答啊:一种是继承Thread,另一种是实现Runable接口,还有通过 Callable 和 Future 创建线程;推荐使用实现Runable接口,因为java是单继承。
线程的几种状态:
新建状态:使用 new 关键字和 Thread 类或其子类建立一个线程对象后,该线程对象就处于新建状态。它保持这个状态直到程序 start() 这个线程。
就绪状态:当线程对象调用了start()方法之后,该线程就进入就绪状态。就绪状态的线程处于就绪队列中,要等待JVM里线程调度器的调度。
运行状态:如果就绪状态的线程获取 CPU 资源,就可以执行 run(),此时线程便处于运行状态。处于运行状态的线程最为复杂,它可以变为阻塞状态、就绪状态和死亡状态。
阻塞状态:如果一个线程执行了sleep(睡眠)、suspend(挂起)等方法,失去所占用资源之后,该线程就从运行状态进入阻塞状态。在睡眠时间已到或获得设备资源后可以重新进入就绪状态。可以分为三种:等待阻塞:运行状态中的线程执行 wait() 方法,使线程进入到等待阻塞状态。
同步阻塞:线程在获取 synchronized 同步锁失败(因为同步锁被其他线程占用)。
其他阻塞:通过调用线程的 sleep() 或 join() 发出了 I/O 请求时,线程就会进入到阻塞状态。当sleep() 状态超时,join() 等待线程终止或超时,或者 I/O 处理完毕,线程重新转入就绪状态。
死亡状态:一个运行状态的线程完成任务或者其他终止条件发生时,该线程就切换到终止状态。
class RunnableDemo implements Runnable {
private Thread t;
private String threadName;
RunnableDemo( String name) {
threadName = name;
System.out.println("Creating " + threadName );
}
public void run() {
System.out.println("Running " + threadName );
try {
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// 让线程睡眠一会
Thread.sleep(50);
}
}catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
RunnableDemo R1 = new RunnableDemo( "Thread-1");
R1.start();
RunnableDemo R2 = new RunnableDemo( "Thread-2");
R2.start();
}
}
第二种方式:
class ThreadDemo extends Thread {
private Thread t;
private String threadName;
ThreadDemo( String name) {
threadName = name;
System.out.println("Creating " + threadName );
}
public void run() {
System.out.println("Running " + threadName );
try {
for(int i = 4; i > 0; i--) {
System.out.println("Thread: " + threadName + ", " + i);
// 让线程睡眠一会
Thread.sleep(50);
}
}catch (InterruptedException e) {
System.out.println("Thread " + threadName + " interrupted.");
}
System.out.println("Thread " + threadName + " exiting.");
}
public void start () {
System.out.println("Starting " + threadName );
if (t == null) {
t = new Thread (this, threadName);
t.start ();
}
}
}
public class TestThread {
public static void main(String args[]) {
ThreadDemo T1 = new ThreadDemo( "Thread-1");
T1.start();
ThreadDemo T2 = new ThreadDemo( "Thread-2");
T2.start();
}
}
- 11.有没有使用过线程并发库?
答: 简单了解过,jdk5中引入douglea的并发库,这一引进给java 线程的管理和使用提供了强大的便利性,在java.util.current 包中提供了对线程池优化,管理的各项操作;该包提供了对线程的运行,线程池的创建,线程生命周期的控制。
java 中通过 Executors 提供四个静态方法创建线程池,分别为 newCachedThreadPool创建一个可缓存的线程池,如果线程池长度超出处理需要,则可灵活回收空闲线程
分别为;newFixedThreadPool创建一个定长线程池,可控制线程池最大并发数,超出的线程会在线程池中等待。
分别为:newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务; - 12.线程池的作用?
答:限定线程个数,可防止线程过多 导致系统运行缓慢;线程池不需要每次都创建和销毁节约系统资源;由于线程池不需要每次都创建,响应时间更快。 == 连接池的作用 - 13.一些设计模式?
答:单例模式(饱汉式,饿汉式),工厂模式(spring的IOC),代理模式(spring的AOP),包装模式
单例模式代码
/**
*@program: javaBase
*@description: 单例模式
*@author: ningl
*@create: 2019.2.13-21.14
*/
public class SingleTn {
private static SingleTn singleTn = new SingleTn();
private SingleTn(){
}
public static SingleTn getSingleTn(){
//饿汉式
return singleTn;
}
}
/**
*@program: javaBase
*@description: 单例模式
*@author: ningl
*@create: 2019.2.13-21.46
*/
public class SingleTn2 {
private static SingleTn2 singleTn2 = null;
public synchronized static SingleTn2 getSingleTn2() {
//饱汉式 ,多线程下不安全,需要synchronized 关键字
if(singleTn2 == null) {
return new SingleTn2();
}
return singleTn2;
}
}
- 14.什么是servlet? servlet的生命周期?
答:servlet是一种服务器程序,负责和web的交互,我们可以重写doGet() 或者doPost() 或者 service()方法。生命周期:servlet启动时,开始加载servlet,实例化一个servlet,生命周期开始–>服务器启动,
开始初始化servlet(调用init() 方法),请求到达是时运行 servce()方法,而service方法会自动匹配运行doPost或者是doGet方法,当服务器将该实例销毁的时候调用distroy()方法。 - 15.forward() 和redirect()的区别?
答: forward是服务器端的跳转,地址栏不变,一个请求;redirect是客户端的跳转,是两个请求,地址栏内容改变; - 16.cookie 和session ?
答:都可以用来做会话跟踪,不同的是cookie是客户端,而session 存储在服务器上; - 17.事物的特性?
答:是事物并发控制的单位,是用户定义的一个操作序列,要么都成功,要么失败;举例是A向B转账,A的钱减少,B的钱增加才算成功;
事物的四大特性:原子性(表示事物内的操作不可分割),一致性(保持状态一致,失败要进行回滚),隔离性,持久性 - 18.mysql 数据库的最大连接数?
答:默认是100,在mysql的配置中可以修改。max_contacts = 100; - 19.mysql的分页和orcal的分页?
答;mysql 使用关键字 limit offset,size,表示从offset 开始之后size 位。
oracle的分页 使用三层嵌套查询,平时是从网上拷贝或者从以前项目拷贝。 - 20.触发器的使用?存储过程?
答:触发器需要触发条件,当触发条件达到时执行某个操作;存储过程只在创建时编译,存储过程 创建一次可以多次使用; - 21.jdbc 链接步骤?
答:加载驱动,获取连接,设置参数,执行语句,返回结果集,释放资源。 - 22.ajax 的介绍?什么是跨域?如何解决
答:XMLHttpRequest对象;跨域是访问另一个服务器上的资源,解决方式:调试的时候谷歌浏览器可以设置下 或者 在服务器端配置等 - 23.springMVC的流程或者是原理?
答:用户向服务器发送一个请求,请求被spring前端控制器 dispactherServlet 捕获,DispatcherServlet对请求url进行解析,得到请求资源符(url),然后执行对应的
Hadnler(controller),然后选择一个ViewResolver进行配置ModelAndView,然后渲染界面, - 24.过滤器与拦截器的区别?
答:Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。
Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。 - 25.struts 与springmvc 的区别?
答:struts 没有使用过但是有一些了解,springmvc是基于方法设计的 而stuts 是基于对象设计的;springmvc 的实现方式是servlet而strut是通过Filter实现的; - 26.spring的两大核心是什么?
答: 控制反转(IOC,也可以称为 依赖注入DI)与 面向切面编程(AOP). 控制反转:就是说 将一些bean 现在由spring进行控制和注入。例如我的service层需要dao,则spring发现的该service
依赖的dao,就会将该dao自动注入,核心原理是工厂模式+反射+配置文件;
面向切面:首要核心原理 使用动态代理的方式在执行前后或者出现异常之后做相关处理;我们主要使用AOP来做事物处理,权限判断以及日志文件等。 - 27.spring的事物传播特性
答: - 28.什么是ORM?
答: 对象关系映射。ORM框架有mybaties 以及 hibernate.是为了解决对象与关系数据库之间不匹配的状况。 - 29.hibernate 对象映射的状态?
答:瞬时状态(使用new 刚创建,没有被持久化,每有id),游离状态/托管状态(已经被持久化,到那时不存在session中),持久状态(已经被持久化,存在session中), - 30.webService 的应用场景?
答:webService 是一个SOA(面向服务的编程),不依赖语言,不依赖平台。通过internet进行基于http 协议网络应用的交互。 - 31.简单介绍下activity?
答: - 32.关于linux?
答:用过,linux是一个操作系统,可以用来作为服务器,我们的一些软件是没有软件包的,需要在linux上进行编译才能得到软件包,比如redis,nginx等
常用命令:pwd 获取当前路径,cd 跳转到目录,ls 列举目录下的文件
文件操作命令:mkdir 创建文件夹,rm-r 删除文件夹,tail 查看, - 33.用什么来连接linux服务器的?
答: 使用xsheel,连接 输入用户名 主机地址 ,密码,默认端口号是22;上传文件 使用xftp,用来上传一些软件的安装包。 - 34.有没有使用过云主机?
答:公司是租的阿里的,云服务运营商提供的远程的服务器功能,使用xheel操作。 - 35.mysql的优化?
答;查找,定位慢查询,并优化;创建索引;分表(当一个表字段非常多并且很少使用时,水平分表和垂直分表);读写分离(当一台服务器不能满足需求时,采用读写读写分离的方式进行集群);进行redis ;sql 优化技巧。