第一次面试出的面试题(持续更新)

一:面试题

image-20201103135628738

image-20201103135604665

1:解题思路:

用jdk8自带的工具类

package com.sx.interview;
import java.util.ArrayList;
import java.util.List;
import java.util.StringJoiner;

/**
 * @author SX
 * @version 1.0
 * @date 2020/11/3 13:46
 */
public class Demo01 {
    // DK1.8中将多个字符串用指定符号拼接的便捷方法
    public static void main(String[] args) {
        String[] str = {"a", "b", "c"};
        String result = String.join(",", str);
        System.out.println(result);
        //2.list
        List strList = new ArrayList();
        strList.add("a");
        strList.add("b");
        strList.add("c");
        String str2 = String.join(",", strList);
        System.out.println(str2);
        //输出结果:a,b,c

        //3.StringJoiner  对一组数据中的属性进行拼接
        StringJoiner joiner = new StringJoiner(",");
        String[] arr1 = {"a", "b", "c"};
        for (String string : arr1) {
            joiner.add(string);
        }
        System.out.println(joiner);
        //输出结果:a,b,c
    }
}

2:MVC、MVP、MVVM的选择以及使用,优缺点,详细介绍

相关解析博客

3.写一段代码遍历ArrayList中的每一个元素

for循环遍历或者迭代去遍历

答案原文章

 ArrayList<String> aList = new ArrayList<String>();  
            aList.add("a");  
            aList.add("ab");  
            aList.add("abc");  
            aList.add("abcr");  
            aList.add("abc");  
            aList.add("abcf");  
            aList.add("abc");  
            aList.add("abdc");    
            for(int i = 0;i < aList.size();i++){  
                if(aList.get(i).equals("abc")){  
                    aList.remove(i);           
                }  
            }  	

建议用迭代器

当数据变成两个连续的 abc字符串的时候 那么就会 出现**[a, ab, abc, abcr, abcf, abdc]** 有一个漏网之鱼

aList.add("a");
aList.add("ab");
aList.add("abc");
aList.add("abc");
aList.add("abcr");
aList.add("abc");
aList.add("abcf");
aList.add("abc");
aList.add("abdc");

然后再用for循环遍历,结果变为:

[a, ab, abc, abcr, abcf, abdc] 发现有一个“abc”没有被移除掉。

然而使用迭代器,答案是对的,所有的“abc”都被移除掉了。

原因:检查后发现。在for循环里,当清除掉前一个“abc”后,索引会指向下一个“abc”,然而还做了i++操作,等于直接将这个“abc”跳了过去去执行后面的步骤,从而使它“逃过法网”。

而迭代器不会有这样的问题是因为hasNext()方法,原理是指针向后移动,每运行一次it.next(),指针向后移动一次,一个一个的遍历。

总结:可以在for循环中做一点小处理,如下:

  for(int i = 0;i < aList.size();i++){  
                if(aList.get(i).equals("abc")){  
                    aList.remove(i);  
                    i--;  
                  
                }  
            }  

4:tcp的三次握手原因:

解析博客

5中文乱码的原因

博客地址

6 mysql查询31到40的记录

select * from table limit(30,10)

7 svn解决代码提交冲突

解决代码提交冲突

8MySQL、Redis 和 MongoDB 的优缺点

解析的博客

11:线程:子线程先循环十次,主线程在循环20次,再子线程循环十次,主线程循环20次,如此循环50次

/**
 * 子线程先循环十次,主线程在循环20次,再子线程循环十次,主线程循环20次,如此循环50次
 * @author llj
 *
 */
public class ThreadTest {
	
	public static void main(String[] args) {
		Syn syn = new Syn();
			new Thread(new Runnable() {		
				@Override
				public void run() {
					for(int i=0; i<50; i++) {
					    syn.child();
					}
				}
			}).start();
			for(int i=0; i<50; i++) {
			    syn.main();
			}
	}
}

class Syn{
	private boolean temp = true;
	public synchronized void main() {
		if(temp) {
			try {
				this.wait();//导致当前线程等待,直到另一个线程调用该对象的 notify()方法或 notifyAll()方法
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		for(int i=0; i<20; i++) {
			System.out.println("主线程"+i);
		}
		temp = true;
		this.notify();//唤醒正在等待对象监视器的单个线程。 
	}
	public synchronized  void child() {
		if(!temp) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}	
		for(int j=0; j<10; j++) {
			System.out.println("子线程"+j);
		}
		temp = false;
		this.notify();
	}
}

12 String 类中常用的方法

indexOf():返回指定字符的索引。
charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。

13: java中IO分为几种

按功能来分:输入流(input)、输出流(output)。

按类型来分:字节流和字符流。

14:Files的常用方法都有哪些?

  • Files.exists():检测文件路径是否存在。

  • Files.createFile():创建文件。

  • Files.createDirectory():创建文件夹。

  • Files.delete():删除一个文件或目录。

  • Files.copy():复制文件。

  • Files.move():移动文件。

  • Files.size():查看文件个数。

  • Files.read():读取文件。

  • Files.write():写入文件。

    package com.sx.RequiredForInterview;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * @author SX
     * @version 1.0
     * @date 2020/11/4 23:25
     */
    public class FileDemo {
        private static final FileInputStream fileInputStream = null;
        private static final FileOutputStream fos = null;
    
        public static void main(String[] args) throws Exception {
    
            try {
                FileInputStream fileInputStream = new FileInputStream("C:\\Users\\Lenovo\\Desktop\\wlopbk.jpg");
                FileOutputStream fos = new FileOutputStream("C:\\Users\\Lenovo\\Desktop\\upload\\wlop.jpg");
                int len = 0;
                byte[] bytes = new byte[1024];
                while ((len = fileInputStream.read(bytes)) != -1) {
                    fos.write(bytes, 0, len);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //刷新流
                fos.flush();
                fileInputStream.close();
                fos.close();
            }
        }
    }
    
    

Java中常用的集合

19:Collection 和 Collections 有什么区别?

  • java.util.Collection 是一个集合接口(集合类的一个顶级接口)。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式,其直接继承接口有List与Set。
  • Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

20:JAVA中抽象类和接口的区别

抽象类只能继承一个

接口可以实现多个

21:集合中常见的方法

排序: sort()

22 String类的常用的方法

charAt():返回指定索引处的字符。
replace():字符串替换。
trim():去除字符串两端空白。
split():分割字符串,返回一个分割后的字符串数组。
getBytes():返回字符串的 byte 类型数组。
length():返回字符串长度。
toLowerCase():将字符串转成小写字母。
toUpperCase():将字符串转成大写字符。
substring():截取字符串。
equals():字符串比较。
package com.sx.demo01;

import org.junit.Test;

/**
 * @author SX
 * @version 1.0
 * @date 2021/3/2 9:49
 * String类的常用方法
 */
public class TypeOfDataDemo {

    @Test
    public void DemoString(){
          String  temo="     欢迎来到老兵的时代:新的世界大门   ";
        System.out.println(temo);
        System.out.println(temo.indexOf("老"));   //返回指定文字的索引 当不存在就返回-1
        System.out.println(temo.charAt(temo.length() - 1));  //返回只当索引的的文字
        System.out.println(temo.replace("老兵","特种兵"));  //字符串替换。
        String newtemo = temo.trim();
        System.out.println(newtemo); //     trim():去除字符串两端空白。
        String[] split = newtemo.split(":");
        for (String s : split) {
            System.out.print(s);
        }
        String UppercaseLetter="mvp";
        String s = UppercaseLetter.toUpperCase();//将字符串转成大写字符。
        System.out.print(s);
        System.out.println(s.toLowerCase());//将字符串转为小写的
        System.out.println(newtemo.substring(newtemo.indexOf(":"), newtemo.length()));
          //截取指定位置的字符串 
    }

}

23== 和 equals 的区别是什么?

== 解读: 对于基本类型和引用类型 == 的作用效果是不同的,如下所示: 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同;

 @Test
    public static void main(String[] args) {
        String a="1";
        String b=new String("1");
        System.out.println(a.equals(b));
        System.out.println(a == b);

    }
 --一个是比较引用类型
     另一个比较
     --

24 Java中常见的io流

eg 写一个文件复制的demo

package com.sx.demo01;

import java.io.FileInputStream;
import java.io.FileOutputStream;

/**
 * @author SX
 * @version 1.0
 * @date 2021/3/2 10:51
 */
public class DemoIO {
    //文件路径的常量
    static final String FilePath = "C:\\Users\\Lenovo\\Desktop\\youyougou\\wlopbk.jpg";

    public static void main(String[] args) throws Exception {
        FileInputStream fi = new FileInputStream(FilePath);
        FileOutputStream fo = new FileOutputStream("C:\\Users\\Lenovo\\Desktop\\newpicture\\copy.jpg");
        byte[] bytes = new byte[1024 * 1024];
        int len = 0;
        while ((len = fi.read(bytes)) != -1) {
            fo.write(bytes, 0, len);
            fo.flush();
        }


    }


}

25.Array 和 ArrayList 有何区别?

38.如何实现数组和 List 之间的转换? List转换成为数组:调用ArrayList的toArray方法。 数组转换成为List:调用Arrays的asList方法。

  1. ArrayList 和 Vector 的区别是什么? Vector是同步的,而ArrayList不是。然而,如果你寻求在迭代的时候对列表进行改变,你应该使用CopyOnWriteArrayList。 ArrayList比Vector快,它是异步,不会过载。 ArrayList更加通用,因为我们可以使用Collections工具类轻易地获取同步列表和只读列表。 40.Array 和 ArrayList 有何区别? Array可以容纳基本类型和对象,而ArrayList只能容纳对象。 Array是指定大小的,而ArrayList初始大小是固定的。 Array没有提供ArrayList那么多功能,比如addAll、removeAll和iterator等。 41.在 Queue 中 poll()和 remove()有什么区别? poll() 和 remove() 都是从队列中取出一个元素,但是 poll() 在获取元素失败的时候会返回空,但是 remove() 失败的时候会抛出异常。

Oracle中的分页

分页查询 (1到5条记录)

select * from(select a.*,rownum rm from scott.ASSETSINFO a)   where rm>=1 and rm<=5

在oracle进行 其他的 操作


Mysql中的面试数据

Redis中的常见命令

常用到Hash和Redis

Redis中的业务场景

RabbitMq中的业务场景

Es 中的常见接口 进行高亮搜索

定时任务

并发 异步进行

项目中遇见的问题以及解决方案

Java中常见的容器有哪些 哪些是同步容器哪些是并发容器

常见的集合 同步

hashtable 异步

ConcurrentHashMap 异步 ConcurrentHashMap:在HashMap的基础上采用分段锁,所以效率高于Hashtable。

mysql中几个常见的索引_Mysql常见四种索引的使用

四种索引(主键索引/普通索引/全文索引/唯一索引)

int与Integer的基本使用对比

Integer是int的包装类;int是基本数据类型; Integer变量必须实例化后才能使用;int变量不需要; Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值 ; Integer的默认值是null;int的默认值是0。

事务的基本特性和隔离级别

image-20210304163208536

image-20210304164327748

关心系统业务里面的sql耗时吗?统计过慢查询吗?对慢查询都怎吗优化过吗?

image-20210304164834915

ACID靠的是什么保证的

image-20210304165825342

什么是MVCC

image-20210304170545717

Mysql主从同步的原理

image-20210304171037734

image-20210304171059155

image-20210304171352088

Redis面试 ,,

为什么使用单线程

如果业务逻辑复杂 一个业务过来要处理很长时间适合多线程

如果一个请求过来很快但是数量之多 那么这种适合使用单线程

**Exception和RuntimeException的区别

Exception是属于应用程序级别的异常,分为 RuntimeException 和 非RuntimeException。

Exception是程序员的错误。

非RuntimeException程序的异常,可以捕获,例如IOException。

必须声明异常、必须捕获异常 RuntimeException 程序员没有进行必要的检查,由于疏忽从而引起的错误。程序运行时的异常,不可捕获。例如NullPointerException。

**Sleep和Wait的区别

sleep和wait的区别在于这两个方法来自不同的类分别是Thread和Object

sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)。

end
  • 作者:金州拉文(联系作者)
  • 发表时间:2020-10-16 13:55
  • 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论