基础第一章
# 一
1.mysqldump:备份,还原,按条件导出,导入,导出表
2.mysqladmin:用于执行管理性操作
3. 关系数据库设计中,关系模式是用来记录用户数据的二维表
4.INNER JOIN、LEFT JOIN 和 RIGHT JOIN 的区别
A INNER JOIN B:返回 A 和 B 中符合 on 条件式的记录
A LEFT JOIN B: 返回 A 中的所有记录和 B 中符合 on 条件式的记录
A RIGHT JOIN B:返回 B 中的所有记录和 A 中符合 on 条件式的记录
5.string:不可变字符序列,StringBuffer:可变字符序列,stringBuilder: 可变
6.Java:
-
JDK、JRE、JVM 三者的关系,以及 JDK、JRE 包含的主要结构有哪些?
JDK = JRE+java 的开发工具(java.exe\java.exe\javadoc.exe)
JRD = JVM + java 的核心类库
-
为什么要配置 path 环境变量?如何配置?
通过配置 path 环境变量,我们可以使某个程序,比如 javac.exe,在任意目录下都可以运行,而不用跑到 javac 存在的目录下进行 dos 命令。
JAVA_HOME=bin 的上一层目录
path=%JAVA_HOME%\bin
-
小段代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20package TestJava;
import java.util.ArrayList;
/*
* @Author: jun
* @Date:2022/11/5 13:24
* @概述:
*/
public class ArrayListTest {
public static void main(String[] args) {
ArrayList<String> s = new ArrayList<>();
s.add("1");
s.add("2");
s.add("3");
System.out.println(s);
//ArrayList用get方法获取值
System.out.println(s.get(1));
}
} -
链表
1 | package TestJava; |
7. 两种参数
形参(形式参数)
在函数定义中出现的参数可以看做是一个占位符,它没有数据,只能等到函数被调用时接收传递进来的数据,所以称为形式参数
实参(实际参数)
函数被调用时给出的参数包含了实实在在的数据,会被函数内部的代码使用,所以称为
实际参数
形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。
8.java 一个类可以实现多个接口;protected 成员在子类可见且可以修改;通过 super 可以调用父类构造函数;String 是不可修改的,且 java 运行环境中对 string 对象有一个对象池保存
9. 对访问修饰符作用范围的总结:
- public 可以被当前类,子类,包,其他包,访问,
- protected 可以被当前类,子类,包访问
- default 可以被可以被当前类,包内访问;
- private 只能被当前类访问
10.Map 接口有两个经典的实现:Hashtable 和 Hashmap;
Hashtable 线程安全,不支持 key 和 value 为空,key 不能重复,但 value 可以重复,不支持 key 和 value 为 null。
Hashmap 非线程安全,支持 key 和 value 为空,key 不能重复,但 value 可以重复,支持 key 和 value 为 null。
# 二
-
若要实现一个接口为普通类则必须实现接口的所有抽象方法
-
接口可以继承接口,并且可以继承多个接口,implement,但是类只允许单一继承。
1 | import java.util.Date; |
output:test.SuperTest
- 线程安全的类:
- vector:就比 arraylist 多了个同步化机制(线程安全),因为效率较低,现在已经不太建议使用;
- statck: 堆栈类,先进后出;
- hashtable:比 hashmap 多个线程安全
- enumeration:枚举,相当于迭代器
1 | package TestJava; |
output:
false
false
true
s3:codercoder
s5:codercoder
false
6. 还是一道编程题
1 | String a="Hello"; |
output:He
简记:前闭后开。
7. 检查型异常:
\1. 粉红色的是受检查的异常 (checked exceptions), 其必须被 try {} catch 语句块所捕获,或者在方法签名里通过 throws 子句声明。受检查的异常必须在编译时被捕捉处理,命名为 Checked Exception 是因为 Java 编译器要进行检查,Java 虚拟机也要进行检查,以确保这个规则得到遵守.
\2. 绿色的异常是运行时异常 (runtime exceptions), 需要程序员自己分析代码决定是否捕获和处理,比如 空指针,被 0 除…
\3. 而声明为 Error 的,则属于严重错误,如系统崩溃、虚拟机错误、动态链接失败等,这些错误无法恢复或者不可能捕捉,将导致应用程序中断,Error 不需要捕捉。
8.static 修饰的语句或变量的特点是:
- 随着类的加载而加载
- 优先于对象存在
- 为所有的对象共享
- 可以使用类名调用,即类方法
attention:
静态方法只能访问静态成员
静态方法不能使用 this 和 super 关键字
主函数为静态函数
9.@Transactional 可以作用在类上,代表这个类的所有公共非静态方法都将启用事务。
10.SpringMVC 五大核心组件
-
DispatcherServlet 请求入口
-
HandlerMapping 请求派发,负责请求和控制器建立一一对应的关系
-
Controller 处理器
-
ModelAndView 封装模型信息和视图信息
-
ViewResolver 视图处理器,定位页面
# 三
-
可以管理 Spring Bean 的生命周期的注解有:@PostContruct、@PreDestroy。
-
@EnableAutoConfiguration 注解:
- 该注解由组合注解 @SpringBootApplication 引入
- 该注解作用是开启 SpringBoot 自动配置
- 该注解会扫描各个 jar 包下的 spring.factories 文件,并加载文件中注册的 AutoCofiguration 类等
- @EnableAutoConfiguration 的关键功能是通过 @Import 注解导入的 ImportSelector 来完成的
-
String 类能不能被继承?
不能,你查看源码会发现 String 类是被 final 修饰的类,final 修饰过的类不能被继承,final 修饰过的变量不能被修改。
-
Spring 如何解决循环依赖?(高端面试题)
spring 只能通过提前暴露 bean 来解决 setter 注入的循环依赖,无法解决构造器注入的循环依赖
-
简述 java 的反射机制和使用场景
反射是 java 的一种机制,可以让我们在运行时获取类的信息,通过反射我们可以获取到类的所有信息,比如它的属性、构造器、方法、注解等(详细描述:https://blog.csdn.net/qq_33709582/article/details/113550163)
-
String str = new String (“abc”) 到底 new 了几个对象?
两种情况:
- 一个:如果常量池中已经有 “abc" 这个字符串,也就是说你在前面已经 new 过一个值为”abc“的字符串,那虚拟机就只会在堆内存中 new 一个 String 对象,并将常量池中”abc“的地址指向你刚刚 new 的 String 对象。
- 两个:如果常量池里面没有”abc" 这个字符串,那虚拟机就会在堆内存中 new 出一个 String 对象,还会在常量池中 new 一个 abc 字符串对象。
-
mysql 深度分页查询如何写 sql 语句
如果某天的一张单表数据量达到 500w 条,且你需要的数据恰恰在最后 10 条,常规的分页非常慢,
1
2
3
4
5
6
7
8
9//常规分页
SELECT * FROM table_name limit 1000000,10 //耗时3.968s
//先查id ,写法很多,看个人习惯
SELECT * FROM table_name a,(SELECT id FROM table_name limit 1000000,10) b WHERE a.id = b.id //耗时1.568
//如果你的表有自增id(并且没断层),就这么写,效率直接起飞,真的是项目经理看了感动,架构师看了落泪
SELECT * FROM table_name WHERE id>1000000 LIMIT 10 //耗时0.572
//以上代码copy,没有实际在我自己的mysql中写过。 -
接口也能被继承,是被接口继承的接口。
-
java 中的 sleep 和 wait 的区别
1.sleep 是 Thread 的方法,wait 是 Object 的方法
2.sleep 方法没有释放锁,而 wait 方法释放了锁(上锁的方法没办法让多个线程同时操作一个数据,
3.wait,notify 和 notifAll 只能在同步控制方法或者同步控制块里面使用,而 sleep 可以在任何地方使用。
4.sleep 必须获取异常,而 wait,notify 和 notifyAll 不需要捕获异常。
-
java 如何进行高效的数组拷贝?
Arrays.copyOf 或 System.arraycopy,是自己 new 数组,然后 for 循环复制效率的两倍左右
为什么快,因为它们是 native 方法;native 是包装其它语言编写的源程序
# 四
# java 中的 i++ 和 i–
i++ 每次会为变量分配一份新的内存
如下代码:
1 | public class new02{ |
结果是 j= 0