一:面试题
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方法。
- 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。
事务的基本特性和隔离级别
关心系统业务里面的sql耗时吗?统计过慢查询吗?对慢查询都怎吗优化过吗?
ACID靠的是什么保证的
什么是MVCC
Mysql主从同步的原理
Redis面试 ,,
为什么使用单线程
如果业务逻辑复杂 一个业务过来要处理很长时间适合多线程
如果一个请求过来很快但是数量之多 那么这种适合使用单线程
**Exception和RuntimeException的区别
Exception是属于应用程序级别的异常,分为 RuntimeException 和 非RuntimeException。
Exception是程序员的错误。
非RuntimeException程序的异常,可以捕获,例如IOException。
必须声明异常、必须捕获异常 RuntimeException 程序员没有进行必要的检查,由于疏忽从而引起的错误。程序运行时的异常,不可捕获。例如NullPointerException。
**Sleep和Wait的区别
sleep和wait的区别在于这两个方法来自不同的类分别是Thread和Object
sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。wait只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用(使用范围)。
评论