面试

Posted 习惯了不该习惯的

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试相关的知识,希望对你有一定的参考价值。

代码实现题:
1.写一段代码实现删除ArrayList 集合中值为”123”的功能。

public class ONE {
    public static void main(String[] args) {
        ArrayList<String> strs=new ArrayList<>();
        strs.add("123");
        strs.add("456");
        strs.add("789");
        strs.add("123");
        strs.add("101112");
        strs.add("123");
        String s="123";
        System.out.println("删除123前:"+strs.toString());
        ArrayList<String> destrs=deleteList(strs,s);
        System.out.println("删除123后:"+destrs.toString());
    }

    private static ArrayList<String> deleteList(ArrayList<String> strs, String s) {
        for(int i=0; i <strs.size(); i++){
            if (strs.get(i).equals(s)) {
                strs.remove(i);
            }
        }
        return strs;
    }
}

2.ArrayList 中 ,假设User有2个字段,分别是name和BigDecimal类型的money,代码实现根据相同name合并money,要求最后ArrayList中User的name不会重复出现。

public class TWO {
    public static void main(String[] args) {
        BigDecimal decimal = new BigDecimal("10.0");
        ArrayList<User> userArrayList=new ArrayList<>();
        User user1=new User("wang",decimal);
        User user2=new User("xin",decimal);
        User user3=new User("lei",decimal);
        User user4=new User("wang",decimal);
        User user5=new User("xin",decimal);
        userArrayList.add(user1);
        userArrayList.add(user2);
        userArrayList.add(user3);
        userArrayList.add(user4);
        userArrayList.add(user5);
        System.out.println("删除重复数据前:"+userArrayList.toString());
        userArrayList=delDuplicate(userArrayList);
        System.out.println("删除重复数据后:"+userArrayList.toString());

    }

    private static ArrayList<User> delDuplicate(ArrayList<User> userArrayList) {
        for(int i=0; i <userArrayList.size()-1; i++){
            for(int j=i+1;j<userArrayList.size();j++){
                if(userArrayList.get(i).getName().equals(userArrayList.get(j).getName())){
                    userArrayList.get(i).setMoney(userArrayList.get(i).getMoney().add(userArrayList.get(j).getMoney()));
                    userArrayList.remove(j);
                }
            }
        }
        return userArrayList;
    }
}
class User{

    private String name;
    private BigDecimal money;
    public User(){}
    public User(String name,BigDecimal money){
        this.money=money;
        this.name=name;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public BigDecimal getMoney() {
        return money;
    }

    public void setMoney(BigDecimal money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "User{" +
                "name=\'" + name + \'\\\'\' +
                ", money=" + money +
                \'}\';
    }
}

mysql实现题:
3.有一个student表,字段为id, name(姓名), age(年龄),sno(学号), cid(班级表id)
(3.1)查找姓名不是张三 且 年龄大于18, 学号从大到小的前5个学生.

 SELECT * FROM student
      WHERE name <> "张三" AND age>18
    ORDER BY sno DESC
      LIMIT 0,5

(3.2)查找每个姓名以及每个姓名出现的次数.

SELECT name,count(*) 
FROM student
GROUP BY name

(3.3)新增class班级表,字段为id,cname(班级号),查找每个学生的姓名,学号,以及所属班级号.

SELECT name,sno,cname 
FROM student s ,class c where s.cid=c.id

4.有一个test表,字段为id,code,type, 根据相同type合并code并去重,
数据:

要求最后结果为:

SELECT GROUP_CONCAT(DISTINCT code),type FROM test GROUP BY type

SpringBuffer 和SpringBuider的区别
SpringBuffer 线程安全,SpringBuider线程不安全,SpringBuffer就是比SpringBuider多了Synchronized

说以下你知道的集合
Map List Set
HashMap Hashtable TreeMap ConcurrentHashMap
ArrayList LinkedList

ArrayList 和LinkedList的区别
ArrayList 底层是数组,LinkedList底层是链表。
ArrayList查询快,修改快
LinkedList插入,添加,删除快
LinkedList更占用内存,因为每个节点存储两个引用,一个指向前一个元素,一个指向下一个元素

HashMap和 Hashtable区别
HashMap继承自AbstractMap类。但二者都实现了Map接口。
Hashtable继承自Dictionary类,Dictionary类是一个已经被废弃的类(见其源码中的注释)。父类都被废弃,自然而然也没人用它的子类Hashtable了。
HashMap线程不安全,HashTable线程安全
Hashmap是允许key和value为null值的,用containsValue和containsKey方法判断是否包含对应键值对;
HashTable键值对都不能为空,否则包空指针异常。

HashMap的put方法
红黑树的结构
有平衡树为什么还用红黑树
Spring你知道的注解
@Configuration注解:可以作用在任意类上,表示该类是一个配置类,其实就相当于一个xml配置文件。

@Lazy(true)注解的作用主要是减少springIOC容器启动的加载时间

@Autowired:这个注解就是spring可以自动帮你把bean里面引用的对象的setter/getter方法省略,它会自动帮你set/get。

@Value注解
该注解的作用是将我们配置文件的属性读出来

1、@Controller:用于标注控制层服务。

2、@Repository:用于标注数据访问层,也可以说用于标注数据访问组件,即DAO组件。

3、@Service:用于标注业务逻辑层服务,主要用来进行业务的逻辑处理,注入DAO。这种bean默认是单例的,如果想改变,可以使用@Service(“beanName”) 、@Scope(“prototype”)来改变。

4、@Component:把普通的类实例化到spring容器中,相当于配置文件中的 <bean id="" class=""/>。泛指各种组件,就是说当我们的类不属于各种归类的时候(不属于@Controller、@Repository、@Services等的时候),我们就可以使用@Component来标注这个类。

@PostConstruct:被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的init()方法。

@PreDestory:被@PreDestroy修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的destroy()方法。

@Resource
默认按 byName自动注入,如果找不到再按byType找bean,如果还是找不到则抛异常,无论按byName还是byType如果找到多个,则抛异常。

@Primary

自动装配时当出现多个Bean候选者时,被注解为@Primary的Bean将作为首选者,否则将抛出异常。

Spring传数的注解
根据处理Request的不同内容分为4类:

  1. 处理Request URI部分的注解:@PathVariable
  2. 处理Request Header部分的注解:@RequestHeader@CookieValue
  3. 处理Request Body部分的注解:@RequestParam@RequestBody
  4. 处理Attribute类型的注解:@SessionAttribute@ModelAttribute

传入json数据用什么注解
在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换。

1.@ResponseBody
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
即可以将返回的对象(带有数据的javabean的集合List或Map)转换成JSON。

2.@RequestBody
该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对象上。

Mybatis的#{}和$()的区别
#{}是预编译处理,${}是字符串替换。
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的
set 方法来赋值;
Mybatis 在处理${}时,就是把${}替换成变量的值。
使用#{}可以有效的防止 SQL 注入,提高系统安全性。

说一下栈和堆分别存什么
两种不同的内存结构
栈: 存放基本数据类型、对象的引用
堆:存放对象的数据
队列(Queue):是限定只能在表的一端进行插入和在另一端进行删除操作的线性表;
栈(Stack):是限定只能在表的一端进行插入和删除操作的线性表。

  1. 队列:先进先出(First In First Out)FIFO
  2. 栈:先进后出(First In Last Out )FILO

int i+1,1存在哪?
在运行时存放在堆内存中

mysql的索引结构
(1)普通索引
这是最基本的索引,它没有任何限制
(2)唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
(3)主键索引
它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引:
(4)组合索引
为了形象地对比单列索引和组合索引,为表添加多个字段:

为什么用B+Tree
如何跳出两层for循环
使用标号outter

SQL关键字的书写顺序
mysql 中sql语句关键字的书写顺序与执行顺序

书写顺序:
select -> from -> where -> group by -> having -> order by

执行顺序:
from -> where -> group by -> having -> select -> order by

hashmap的扩容机制
string创建几个对象问题
String str="abc";   1 引号内包含文本,这种方式是String特有的,并且它与new的方式存在很大区别

String a="abc";   
String b="abc";    1 还是一个对象 String str=new String("abc"); 2 "abc"一个,new String一个

String a="ab"+"cd"; 3 答案是三个。有点奇怪吗?说到这里,我们就需要引入对字符串池相关知识的回顾了。  
在JAVA虚拟机(JVM)中存在着一个字符串池,其中保存着很多String对象,并且可以被共享使用,因此它提高了效率。由于String类是final的,它的值一经创建就不可改变,因此我们不用担心String对象共享而带来程序的混乱。字符串池由String类维护,我们可以调用intern()方法来访问字符串池。  

我们再回头看看String a="abc";,这行代码被执行的时候,JAVA虚拟机首先在字符串池中查找是否已经存在了值为"abc"的这么一个对象,它的判断依据是String类equals(Object obj)方法的返回值。如果有,则不再创建新的对象,直接返回已存在对象的引用;如果没有,则先创建这个对象,然后把它加入到字符串池中,再将它的引用返回。因此,我们不难理解前面三个例子中头两个例子为什么是这个答案了。
"ab"和"cd"分别创建了一个对象,它们经过“+”连接后又创建了一个对象"abcd",因此一共三个,并且它们都被保存在字符串池里了。

String c;创建对象个数为 0;
初始化为null

int i=1存储位置
成员变量 int i = 1, i作为变量名,在JVM中是以代码的形式存在,存放在方法区,当有线程执行到该代码的时候,会加载该代码进行执行,而1作为参数 i 的值在运行时存放在堆内存中,i指向该内存

以上是关于面试的主要内容,如果未能解决你的问题,请参考以下文章

前端面试题之手写promise

2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试

Java进阶之光!2021必看-Java高级面试题总结

Java工程师面试题,二级java刷题软件

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

一道面试题目