货拉拉Java开发实习

news/2024/11/13 4:06:44/

目录

    • 1.Java的重载和重写有什么区别
    • 2.什么情况下需要用到重载
    • 3.有很多个字符串和变量,需要把它们加起来,这时候用String会有什么问题
    • 4.有没有其它的替代方案
    • 5.StringBuffer和StringBuilder有什么区别
    • 6.一个自定义对象,分别创建了两个实例,怎么样比较它们的大小,使用equals可以比较吗
    • 7.String是一个不可变的类型,这种类型一般用什么关键字修饰
    • 8.final除了修饰String还可以修饰其它的吗
    • 9.Java里有哪些集合
    • 10.如果要存一个自定义对象,适合用哪个数据结构来存储
    • 11.HashMap有提供什么方法吗
    • 12.先判断再put这个方案,这两步操作下是否存在问题,怎么解决
    • 13.CAS的ABA问题了解吗,一般怎么解决
    • 14.列举一下你了解的数据结构
    • 15.队列的特点
    • 16.Java中的队列
    • 17.LinkedList和ArrayList的区别是什么
    • 18.二叉树有什么特点
    • 19.二叉树有什么缺点,有什么数据结构可以解决这个问题
    • 20.平衡二叉树有什么特点
    • 21.Java中有哪些平衡二叉树的应用例子
    • 22.简单介绍一下tcp的三次握手和四次挥手
    • 23.Linux哪个命令是用来发送请求的
    • 24.spring中事务的隔离级别有几种
    • 25.spring的两大特性是什么
    • 26.MySQL索引可以提升查询性能,那索引是越多越好吗
    • 27.索引使用过程中什么情况会失效
    • 28.MySQL如果想查最大的一行怎么查,比如要查id最大的那一行
    • 29.limit后面接两个数字,那两个数字分别是什么意思
    • 30.现在如果有一个字符串是驼峰命名的,怎么转化为下划线命名
    • 31.怎么样把字符串所有的字符倒过来

1.Java的重载和重写有什么区别

1、重载发生在本类,重写发生在父类与子类之间;
2、重载的方法名必须相同,重写的方法名相同且返回值类型必须相同;
3、重载的参数列表不同,重写的参数列表必须相同。
4、重写的访问权限不能比父类中被重写的方法的访问权限更低。
5、构造方法不能被重写

2.什么情况下需要用到重载

重载应该在需要让方法对不同类型的参数进行操作时使用。例如,如果您需要编写一个加法方法来将两个数字相加,那么您可能会编写多个实现方式,以便以不同的方式来处理不同类型的数字。这种方法可以使您的代码更加灵活和复用。

3.有很多个字符串和变量,需要把它们加起来,这时候用String会有什么问题

在将多个字符串和变量拼接成一个字符串时,使用String类型可能会导致性能问题和内存浪费。这是因为String类型是不可变的,每次对字符串进行修改时都会创建一个新的String对象,而原来的String对象则会被丢弃。

4.有没有其它的替代方案

StringBuilder和StringBuffer都是不可变的

5.StringBuffer和StringBuilder有什么区别

StringBuffer是线程安全的,因为它每个操作方法都加了synchronized同步关键字。
StringBuilder不是线程安全的,所以在多线程环境下对字符串进行操作,应该使用StringBuffer,否则使用StringBuilder

6.一个自定义对象,分别创建了两个实例,怎么样比较它们的大小,使用equals可以比较吗

不可以

  • 如果你想比较两个自定义对象的大小,你需要在自定义对象中实现Comparable接口,并重写compareTo方法。在compareTo方法中,你需要定义比较规则,然后根据规则比较两个对象的大小。比较规则可以根据对象的某个属性进行比较,例如按照对象的id属性进行比较。
  • 如果你想比较两个自定义对象是否相等,你需要在自定义对象中实现equals方法,并重写hashCode方法。在equals方法中,你需要定义相等的规则,例如两个对象的id属性相等,则认为它们相等。在hashCode方法中,你需要根据相等的规则生成hashCode值,以便在使用希表等数据结构时能够正确地处理相等的对象。
  • 需要注意的是,equals方法只能用于比较两个对象是否相等,而不能用于比较它们的大小。如果你想比较两个对象的大小,你需要使用compareTo方法。

7.String是一个不可变的类型,这种类型一般用什么关键字修饰

final
在这里插入图片描述

8.final除了修饰String还可以修饰其它的吗

  • final 变量:被修饰的变量不可变,不可变分为引用不可变和对象不可变,final 指的是引用不可变,final 修饰的变量必须初始化,通常称被修饰的变量为常量。
  • final 方法:被修饰的方法不允许任何子类重写,子类可以使用该方法。
  • final 类:被修饰的类不能被继承,所有方法不能被重写。

9.Java里有哪些集合

在这里插入图片描述

10.如果要存一个自定义对象,适合用哪个数据结构来存储

  • List:List是一个有序的集合,可以存储重复的素。常用的实现类有ArrayList和LinkedList。如果需要按照插入顺序存储自定义对象,可以使用ArrayList;如果需要频繁地在集合中间插入或删除元素,可以使用LinkedList。
  • Set:Set是一个不允许重复元素的集合,可以用于去重。常用的实现类有HashSet和TreeSet。如果需要快速地判断一个元素是否存在于集合中,可以使用HashSet;如果需要按照元素的自然顺序进行排序,可以使用TreeSet。
  • Map:Map是一个键值对的集合,可以用于存储具有映射关系的数据。常用的实现类有HashMap和TreeMap。如果需要快速地根据键查找值,可以使用HashMap;如果需要按照键的自然顺序进行排序,可以使用TreeMap。

如果存Key-Value数据时候,如果有多条同名Key数据,现在只想存第一条其它忽略掉,那么用HashMap来存储,用什么方法比较简单

11.HashMap有提供什么方法吗

  • put(key, value):将指定的键值对存储到HashMap中。
  • get(key):根据指定的键获取对应的值。
  • remove(key):根据指定的键删除对应的键值对。
  • containsKey(key):判断HashMap中是否包含指定的键。
  • size():返回HashMap中键值对的数量。

12.先判断再put这个方案,这两步操作下是否存在问题,怎么解决

  • 先判断再put的方案是一种常见的HashMap操作,可以用于避免重复添加键值对。但是,在多线程环境下,这两步操作可能存在问题,因为在判断和添加之间可能会有其他线程修改了HashMap,导致判断结果不准确或者添加的键值对被覆盖。
  • 为了解决这个问题,可以使用Java中的ConcurrentHashMap类,它是线程安全的HashMap实现,支持并发访问。ConcurrentHashMap提供了putIfAbsent(key, value)方法,可以在添加键值对之前先判断指定的键是否已经存在,如果不存在则添加键值对,否则返回已存在的值。这个方法是原子性的,可以保证在多线程环境下的正确性。

13.CAS的ABA问题了解吗,一般怎么解决

CAS算法实现一个重要前提需要取出内存中某时刻的数据并在当下时刻比较并替换,那么在这个时间差类会导致数据的变化。
如说一个线程one从内存位置V中取出A,这时候另一个线程two也从内存中取出A,并且线程two进行了一些操作将值变成了B,然后线程two又将V位置的数据变成A,这时候线程one进行CAS操作发现内存中仍然是A,然后线程one操作成功。
尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的。
解决方案
Java 提供了一个 AtomicStampedReference 原子引用变量

14.列举一下你了解的数据结构

栈、堆、队列、树、图、数组、哈希表、链表

15.队列的特点

  • 先进先出(FIFO):队列中的元素按照它们进入队列的顺序进行处理。也就是说,先进入队列的元素先被处理,后进入队列的元素后被处理。
  • 只能在队首删除元素,只能在队尾添加元素:队列的操作只能在队首和队尾进行。在队首删除元素,队尾添加元素。

16.Java中的队列

Java中提供了多种队列实现,其中常用的有以下几种:

  1. LinkedList:LinkedList是Java中的一个双向链表实现,也可以用来实现队列。在LinkedList中,队列的头部对应链表的头部,队列的尾部对应链表的尾部。因此,可以使用LinkedList来实现一个FIFO队列。

  2. ArrayDeque:ArrayDeque是Java中的一个双端队列实现,也可以用来实现队列。在ArrayDeque中,队列的头部对应数组的第一个元素,队列的尾部对应数组的最后一个元素。因此,可以使用ArrayDeque来实现一个FIFO队列。

  3. PriorityQueue:PriorityQueue是Java中的一个优先队列实现,它可以根据元素的优先级进行排序。在PriorityQueue中,元素的优先级由元素的自然顺序或者Comparator指定。因此,可以使用PriorityQueue来实现一个按照优先级排序的队列。

  4. BlockingQueue:BlockingQueue是Java中的一个阻塞队列接口,它提供了多种阻塞操作,例如put、take等。在多线程环境下,BlockingQueue可以用来实现线程间的通信。

这些队列实现都是线程安全的,可以在多线程环境下使用。选择哪种队列实现取决于具体的需求,例如是否需要排序、是否需要阻塞等。

17.LinkedList和ArrayList的区别是什么

ArrayList

  • 基于数组,需要连续内存
  • 随机访问快(指根据下标访问)
  • 尾部插入、删除性能可以,其它部分插入、删除都会移动数据,因此性能会低
  • 可以利用 cpu 缓存,局部性原理

LinkedList

  • 基于双向链表,无需连续内存
  • 随机访问慢(要沿着链表遍历)
  • 头尾插入删除性能高
  • 占用内存多

18.二叉树有什么特点

二叉树的特性就是每个节点的子结点不允许超过两个。
二叉树的特点使得它非常适合这些场景,因为它可以方便地表示层次关系,并且可以进行快速的查找、插入和删除操作。

19.二叉树有什么缺点,有什么数据结构可以解决这个问题

二叉树的主要缺点是可能会退化成链表,这种情况下,二叉树的查找、插入和删除操作的时间复杂度会退化为O(n),其中n是节点的数量。这种情况下,二叉的性能会变得非常差,因为它失去了平衡性。
为了解决这个问题,有平衡二叉树,例如AVL树、红黑树等。

20.平衡二叉树有什么特点

  • 平衡二叉树是一种特殊的二叉树,它保证了左右子树的高度差不超过1,从而保证了树的平衡性
  • 平衡二叉树的查找、插入和删除操作的时间复杂度都是O(log n),其中n是节点的数量。因此,平衡二叉树比普通的二叉树更加高效。

21.Java中有哪些平衡二叉树的应用例子

  • TreeMap:TreeMap是Java中的一种基于红黑树实现的有序映射表,它可以根据键的自然顺序或者自的比较器进行排序。TreeMap的查找、插入和删除操作的时间复杂度都是O(log n),其中n是元素的数量。
  • TreeSet:TreeSet是Java中的一种基于红黑树实现的有序集合,它可以根据元素的自然顺序或者自定义的比较器进行排序。TreeSet的查找、插入和删除操作的时间复杂度都是O(log n),其中n是元素的数量。

22.简单介绍一下tcp的三次握手和四次挥手

TCP协议
保证传输过程的三个关键的步骤,分别为三次握手、传输确认、四次挥手。
三次握手
在这里插入图片描述
三次握手是建立连接的过程,当客户端向服务端发起连接时,会先发一包连接请求数据,过去询问一下,能否与你建立连接,这包数据我们称之为SYN包。如果对端同意连接,则回复一包SYN+ACK包,客户端收到之后回复一包ACK包连接建立。
因为这个过程中互相发送了三包数据,所以称之为三次握手。
Q:为什么要三次握手,而不是两次握手,服务端回复完SYN+ACK包之后就建立连接
A:这是为了防止因为已失效的请求报文突然又传到服务器引起错误。解决网络信道不可靠的问题
如果没有第三次握手告诉服务器端客户端收的到服务器端传输的数据的话,服务器端是不知道客户端有没有接收到服务器端返回的信息的。服务端就认为这个连接是可用的,端口就一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接。
这样一来,就会有很多无效的连接端口白白地开着,导致资源的浪费。
在这里插入图片描述
还有一种情况是已经失效的客户端发出的请求信息,由于某种原因传输到了服务器端,服务器端以为是客户端发出的有效请求,接收后产生错误。
在这里插入图片描述
Q:为什么不是四次握手?
A:因为通信不可能100%可靠,而上面的三次握手已经做好了通信的准备工作,再四次握手,并不能显著提高可靠性,而且也没有必要。
数据传输
在这里插入图片描述
经过三次握手之后,客户端和服务端都进入了数据传输状态。tcp协议需要在不可靠的信道上保证可靠的连接。现在就有几个问题需要面对:1. 一包数据有可能被拆成多包发送,如何处理丢包问题 ;2. 这些数据包到达的先后顺序不同,如何处理乱乱序问题。

针对以上的要求,TCP协议为每一个连接建立了一个发送缓冲区,从建立链接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1。发送数据时,从发送缓冲区,取一部分数据组成发送报文,在其tcp协议头中会附带序列号和长度,接受端在收到数据后,需要回复确认报文。确认报文中的ACK,等于接收序列号加长度,也就是下一包数据需要发送的起始序列号。

这样一问一答的发送方式,能够使发送端确认发送的数据已经被对方收到,发送端也可以一次发送连续多包数据,接收端只需要回复一次ACK就可以了,这样发送端可以把待发送的数据分割成一系列的碎片,发送到对端。对端根据序列号和长度,在接受后重构出来完整的数据,假设其中丢失了某些数据包,在接收端可以要求发送端重传。比如丢失了100-199,这100个字节,接收端向发送端发送ACK = 100 报文,发送端收到后重传这一包数据,接受端进行补齐。

以上过程不区分客户端和服务端,TCP连接是全双工的,对于两端来说均采用上述机制。

四次挥手
处于连接状态的客户端和服务端都可以发起关闭连接请求,此时需要四次挥手来进行连接关闭。

1.假设客户端主动发起连接关闭请求,他需要将服务端发起一包FIN包,表示要关闭连接,自己进入终止等待1状态,这是第一次挥手。

2.服务端收到FIN包,发送一包ACK包,表示自己进入了关闭等待状态,客户端进入终止等待2状态,这是第二次挥手。

3.服务端此时还可以发送未发送的数据,而客户端还可以接收数据,待服务端发送完数据之后,发送一包FIN包,进入最后确认状态,这是第三次挥手。

4.客户端收到之后回复ACK包,进入超时等待状态,经过超时时间后关闭连接,而服务端收到ACK包后,立即关闭连接,这是第四次挥手。

Q:为什么客户端需要等待超时时间?
A:为了保证对方已收到ACK包,因为假设客户端发送完最后一包ACK包后就释放了连接,一旦ACK包在网络中丢失,服务端将一直停留在最后确认状态;如果客户端发送最后一包ACK包后,等待一段时间,这是服务端会因为没有收到ACK包会重发FIN包,客户端会响应这个FIN包重发ACK包并刷新超时时间。这个机制跟三次握手一样,也是为了保证在不可靠的网络链路中进行可靠的连接断开确认。

23.Linux哪个命令是用来发送请求的

curl的使用示例:

curl http://example.com/api

这个命令会发送一个GET请求到http://example.com/api,并且输出响应内容到控制台。
如果需要发送POST请求,可以使用-d参数来设置请求体:

curl -d "param1=value1&param2=value2" http://example.com/api

这个命令会发送一个POST请求到http://example.com/api,并且设置请求体为param1=value1&param2=value2。

24.spring中事务的隔离级别有几种

  • DEFAULT:使用数据库默认的隔离级别,以连接的数据库的事务隔离级别为准;
  • READ_UNCOMMITTED:最低的隔离级别,允许读取未提交的数据变更,可能导脏读、不可重复读和幻读问题。
  • READ_COMMITTED:允许读取已提交的数据变更,可以避免脏读问题,但是可能会出现不可重复读和幻读问题。
  • REPEATABLE_READ:保证同一事务中多次读取同一数据时,结果始终一致,可以避免脏读和不可重复读问题,但是可能会出现幻读问题
  • SERIALIZABLE:最高的隔离级别,强制事务串行执行,可以避免脏读、不可重复读和幻读问题,但是会影响并发性能。

25.spring的两大特性是什么

IOC
IOC—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。
AOP
面向切面编程,用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合。

26.MySQL索引可以提升查询性能,那索引是越多越好吗

不是的,索引并不是越多越好。虽然索引可以提升查询性能,但是过多的索引会带来以下几个问题:

  1. 索引占用磁盘空间。每个索引都需要占用一定的磁盘空间,如果过多的创建索引,会导致磁盘空间的浪费。

  2. 索引会影响写操作的性能。每次对表进行插入更新或删除操作时,都需要更新索引,如果过多的创建引,会导致写操作的性能下降。

  3. 索引会增查询优化器的负担。查询优化器需要考虑多个索引的选择,如果过多的创建索引,会增加查询优化器的负担,导致查询性能下降。

  4. 索引会增加查询的复杂度。每个索引都需要维护一定的数据结构,如果过多的创建索引,会增加查询的复杂度,导致查询性能下降。

因此,在创建索引时,需要根据具体的业务场景进行选择,只创建必要的索引。一般来说,可以根据以下几个原则来选择创建索引的列:

  1. 频繁作为查询条件的列。

  2. 用于连接表的外键列。

  3. 频繁作为排序条件的列。

  4. 频繁作为分组条件的列。

需要注意的是,虽然索引可以提升查询性能,但是过多的创建索引也会带来一些问题。因此,在创建索引时,需要根据具体的业务场景进行选择,只创建必要的索引。

27.索引使用过程中什么情况会失效

  • 1.最佳左前缀法则
    结论:过滤条件要使用索引必须按照索引建立时的顺序,依次满足,一旦跳过某个字段,索引后面的字段都无法被使用。
  • 2.计算、函数导致索引失效
  • 3.范围条件右边的列索引失效
  • 4.不等于(!= 或者<>)索引失效
  • 5.is not null无法使用索引,is null可使用索引
  • 6.like以通配符%开头索引失效

28.MySQL如果想查最大的一行怎么查,比如要查id最大的那一行

SELECT * FROM table_name ORDER BY id DESC LIMIT 1;

29.limit后面接两个数字,那两个数字分别是什么意思

第一个数字表示返回结果的起始位置,第二个数字表示返回结果的数量。

SELECT * FROM table_name LIMIT 20, 10;

这个查询语句表示返回table_name表中从第21行开始的10行数据。

30.现在如果有一个字符串是驼峰命名的,怎么转化为下划线命名

String camelCaseString = "camelCaseString";
String underScoreString = camelCaseString.replaceAll("([a-z])([A-Z]+)", "$1_$2").toLowerCase();
System.out.println(underScoreString);

31.怎么样把字符串所有的字符倒过来

在Java中,可以使用StringBuilder类的reverse方法将字符串中的所有字符倒过来。具体来说,可以使用以下代码实现:

String originalString = "Hello, world!";
StringBuilder reversedString = new StringBuilder(originalString).reverse();
System.out.println(reversedString);

执行以上代码的结果为:

!dlrow ,olleH

http://www.ppmy.cn/news/87463.html

相关文章

安全中级2:nginx的中间件漏洞

目录 一、nginx解析php的流程 1.原理 2.CGI、FastCGI、PHP-FPM、PHP-CG、WrapperI的定义 二、Fastcgi协议 1.Fastecgi Record 2.Fastcgi Type 3.PHP-FPM(FastCGI进程管理器) 4.总结FastCGI解析的流程 三、nginx配置错误导致的漏洞 1.CRLF注入漏洞&#xff08;$uri解…

二叉树的相关知识

1.树概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#…

LeetCode 674 最长连续递增序列

题目&#xff1a; 给定一个未经排序的整数数组&#xff0c;找到最长且 连续递增的子序列&#xff0c;并返回该序列的长度。连续递增的子序列 可以由两个下标 l 和 r&#xff08;l < r&#xff09;确定&#xff0c;如果对于每个 l < i < r&#xff0c;都有 nums[i] <…

【瑞萨RA_FSP】UART 编程实战

文章目录 一、UART收发回显二、UART指令控制RGB灯三、基于环形队列的UART收发回显 一、UART收发回显 UART只需两根信号线即可完成双向通信&#xff0c;对硬件要求低&#xff0c;使得很多模块都预留UART接口来实现与其他模块或者控制器进行数据传输&#xff0c; 比如GSM模块&am…

立创梁山派学习笔记——GPIO输入检测

按键检测 前言按键的硬件电路BOOT选择复位按键唤醒按键GPIO输入框图软件配置寄存器简介1.端口控制寄存器&#xff08;GPIOx_CTL, xA..I&#xff09;2.端口上拉/下拉寄存器&#xff08;GPIOx_PUD, xA..I&#xff09;3.端口输入状态寄存器&#xff08;GPIOx_ISTAT, xA..I&#xf…

Java 核心技术 卷I 第3 章 Java 的基本程序设计结构

第3 章 Java 的基本程序设计结构 3.1 一个简单的Java应用程序 Java区分大小写 关键字public 称为访问修饰符 &#xff08;access modifier&#xff09; 这些修饰符用于控制程序的其他部分对这段代码的访问级别。 关键字class表明Java程序中的全部内容都包含在类中。 类是…

自动化测试 selenium

目录 一、了解自动化测试和selenium 1. 什么是自动化测试&#xff1f;为什么要使用自动化测试&#xff1f; 2. 为什么使用selenium&#xff1f; 3. 环境部署 4. 什么是驱动&#xff1f;驱动的工作原理 5. selenium 的依赖代码 二、selenium 的基础语法 1. 元素的定位 …

Kafka实时数据即席查询应用与实践

作者&#xff1a;vivo 互联网搜索团队- Deng Jie Kafka中的实时数据是以Topic的概念进行分类存储&#xff0c;而Topic的数据是有一定时效性的&#xff0c;比如保存24小时、36小时、48小时等。而在定位一些实时数据的Case时&#xff0c;如果没有对实时数据进行历史归档&#xff…