小白业余时间整理一些面试题

小白平时整理Java易错面试题汇总 --(1)

  1. 连接MySql报错(时区错误)可以在Spring连接mysql的配置文件后面添加serverTimezone的字段进行视察纠正
    jdbc:mysql://localhost:3306/shining?serverTimezone=Asia/Shanghai
  2. .javac编译可以对字符串常量直接相加的表达式进行优化不用等到运行期在进行加法运算处理,而是在编译时去掉其中的加号,直接将其编译成一个这些常量相连的结果。所以
    String s1 = “a”;
    String s2 = s1 + “b”;
    String s3 = “a” + “b”;
    System.out.println(s2 == “ab”); //false
    System.out.println(s3 == “ab”); //true
    所以 String s =“a” + “b” +“c” + “d”; 只创建了一个对象
  3. .SpringBootApplication注解 等同于@Configuration + @EnableAutoConfiguration + @ComponentScan三个注解。
    (1) @ComponentScan 注解。该注解默认会扫描该类所在的包下所有的配置类,如果扫描到有@Component、@Controller、@Service等这些注解的类,并注册为Bean,可以自动收集所有的Spring组件,包括@Configuration类。我们经常使用@ComponentScan注解搜索beans,并结合@Autowired注解导入。可以自动收集所有的Spring组件,包括@Configuration类。
    (2) @Configuration 声明配置类 等同于spring的XML配置文件。
    (3) @EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器
    补充–springboot配置的实现 写一个配置类XxxConfig 类上注解@Configuration 方法注解@Bean编实现配置等同于xml配置
  4. SpringBoot操作redis
    redisTemplate.opsForValue();//操作字符串
    redisTemplate.opsForHash();//操作hash
    redisTemplate.opsForList();//操作list
    redisTemplate.opsForSet();//操作set
    redisTemplate.opsForZSet();//操作有序set
    操作set
    在redis中set值以后 例如:redisTemplate.opsForValue().set(“username”,“test”) 执行以后发现存在redis中的数据是乱码的
    因为redis会序列化key和value 所以需要在config中重写一下redisTemplate即可
    redisTemplate.opsForSet().add(“username”,“admin”);
    redisTemplate.opsForSet().members(“username”) 取值
    redisTemplate.opsForSet().remove(“username”) 删除
    操作list
    redisTemplate.opsForList().leftPush()//从左侧添加值
    redisTemplate.opsForList().rightPush()//从右侧添加值
    redisTemplate.opsForList().range(“userlist”,0,1)//list取值 要取的list 和 取值索引
    操作hash
    redisTemplate.opsForHash().put();//新增
    redisTemplate.delete();//删除
  5. 开启redis缓存需要修改项目启动类,增加注解@EnableCaching,开启缓存功能,新建Redis缓存配置类RedisConfig并增加配置信息
    验证:第一次查询数据库中的一条数据,在控制台可以看到执行了数据库查询,开启了redis缓存查询结果,在此查询数据库中存在的这条数据发现没有执行数据库查询而是从redis缓存中查询并返回查询结果
  6. jdbc访问数据库的基本步骤
    (1).加载数据库驱动,利用反射机制 Class.forName(com.mysql.jdbc.Driver)
    (2).使用DriverManager获得数据库连接并返回一个statement对象,使用statement对象来执行sql语句
    即:Statement stmt = DriverManager.getConnection(“jdbc:mysql://127.0.0.1:3306/user”, “root”, “root”).creatStatement();
    (3).执行sql语句 ResultSet rs=stmt.executeQuery(“select * from demo1”);返回一个结果集
    (4).操作结果集
  7. .mybatis中KaTeX parse error: Expected 'EOF', got '#' at position 4: {}与#̲{}是怎样防止sql注入的? …使用的时候将传入的数据直接显示在sql中
  8. 同步方法和同步块,哪个是更好的选择?
    同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。所以同步方法的范围比较大,范围越大,越是浪费性能
  9. 数据库索引:索引就是为了加速表中的数据行的检索而创建的一种分散的数据结构,可以将索引比作成书的目录,有目录的肯定比没有目录的书更方便查找。
  10. 唯一约束:保证在一个字段或者一组字段里的数据都与表中其它行的对应数据不同。和主键约束不同,唯一约束允许为 NULL,只是只能有一行。
  11. 唯一索引:不允许有索引值相同的行,从而禁止重复的索引和键值
  12. .HashSet与HashMap的区别 HashSet是通过HashMap来实现的,HashMap的输入的参数有key和value两个组成,在实现hashSet的时候保持HashMap的
    value值为常量,相当于只在HashMap中对key进行处理
    源码分析:
    HashSet hashSet = new HashSet();
    hashSet.add(“user”); 调用hashSet的add方法后
    public boolean add(E e) {
    return map.put(e, PRESENT)==null;
    }
    E为泛型 此处的map为 HashSet定义的全局变量 private transient HashMap<E,Object> map;
    map.put即为调用的HashMap的put方法,e作为key,PRESENT作为value,而PRESENT也为HashSet中定义的全局变量,
    private static final Object PRESENT = new Object();所以value为常量支只对key值进行操作
  13. HashMap存储对象过程
    对HahMap的Key调用hashCode()方法,返回int值,即对应的hashCode;
    把此hashCode作为哈希表的索引,查找哈希表的相应位置,若当前位置内容为NULL,则把hashMap的Key、Value包装成Entry数组,放入当前位置;
    若当前位置内容不为空,则继续查找当前索引处存放的链表,利用equals方法,找到Key相同的Entry数组,则用当前Value去替换旧的Value;
    若未找到与当前Key值相同的对象,则把当前位置的链表后移(Entry数组持有一个指向下一个元素的引用),把新的Entry数组放到链表表头;
  14. .HashMap和HashTable都是使用hash表来存储键值对,在数据结构上是基本相同的,都创建一个集成map.entry的私有的静态内部类Entry,每一个Entry对象表示存储在hash表中的键值对
    Entry对象唯一表示一个键值对,有四个属性:
    -K key 键对象
    -V value 值对象
    -int hash 键对象的hash值
    -Entryentry 指向链表中下一个Entry对象,可为null,表示当前Entry对象在链表尾部
    所以可以说有多少键值对就有多少entry对象
  15. String,StringBuffer和StringBuilder的区别
    1、运行速度,或者说是执行速度,在这方面运行速度快慢为:StringBuilder > StringBuffer > String。
    2、线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的。
  16. String s = "hello"和String s = new String(“hello”);区别
    String s = new String(“hello”)可能创建两个对象也可能创建一个对象。如果常量池中存在 hello 字符串常量的话,则仅仅在堆中创建一个对象
    如果常量池中不存在hello对象,则在堆中和常量池中都要创建
    String s = “hello”,这样创建对象,JVM会检查常量池中是否存在 hello 字符串对象,如果没有就分配一个内存存放 hello,如果有了就直接将字符串常量池中的地址返回给栈。(没有new,没有堆的操作)
  17. 为什么要使用线程池
    1.降低系统资源消耗
    2.提高线程可控性
    线程池的5种状态:Running、ShutDown、Stop、Tidying、Terminated。
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值