面试
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类:
- 处理
Request URI
部分的注解:@PathVariable
- 处理
Request Header
部分的注解:@RequestHeader
,@CookieValue
- 处理
Request Body
部分的注解:@RequestParam
,@RequestBody
- 处理
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):是限定只能在表的一端进行插入和删除操作的线性表。
- 队列:先进先出(First In First Out)FIFO
- 栈:先进后出(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指向该内存
以上是关于面试的主要内容,如果未能解决你的问题,请参考以下文章
2021-12-24:划分字母区间。 字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。返回一个表示每个字符串片段的长度的列表。 力扣763。某大厂面试