《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

2、下面是单链表的几个特点:

数据元素在内存中存放的地址是不连续的:单链表的结点里面还定义一个结点,它里面保存着下一个结点的内存地址,在实例化对象的时候,jvm会开辟不同内存空间,并且是不连续的。

添加效率高:添加一个元素时,先找到插入位置的前一个,只需要将1,2个元素的连接断开,将插入结点的next指向第一个元素的next

(1),然后将第一个元素的next指向插入结点(2),

不用在挪动后面元素。

删除效率高:删除一个元素时,先找到删除位置,将前一个的next指向删除位置的next,不用在挪动后面元素。

查询效率低:查询的时候必须从头开始,依次遍历,而数组因为它的内存是连续的,可以直接通过索引查找。

3、下面通过代码来实现单链表结构:

package com.tlinkedList;

/**

* User:zhang

* Date:2020/10/26

**/

public class TLinkedList {

private Node head;//链表头部

private int size;//链表元素的个数

public TLinkedList(){

head=null;

size=0;

}

//    将结点作为内部类。也可以新建一个Node类,作为结点

class Node{

private Node next;//下一个结点

private T t;//结点的数据

public Node(T t){

this.t=t;

}

public T getT() {

return t;

}

public void setT(T t) {

this.t = t;

}

}

//    在链表头部添加一个结点

public void addFirst(T t){

Node node = new Node(t);

node.next=head;

head=node;

size++;

}

//    在链表中间添加一个结点

public void addMid(T t,int index){

Node node = new Node(t);

Node mid=head;

for (int i = 0; i < index - 1; i++) {

mid=mid.next;

}

node.next=mid.next;

mid.next=node;

size++;

}

//    在链表尾部添加一个结点

public void addLast(T t){

Node node = new Node(t);

Node last=head;

while (last.next!=null){

last=last.next;

}

last.next=node;

node.next=null;

size++;

}

//    删除链表的头结点

public void removeFirst(){

head=head.next;

size–;

}

//    删除链表的中间元素

public void removeMid(int index){

Node mid=head;

if (index==0){

removeFirst();

return;

}

int j=0;

Node qMid=head;

while (j<index){

qMid=mid;

mid=mid.next;

j++;

}

qMid.next=mid.next;

size–;

}

//    删除链表的尾结点

public void removeLast(){

Node mid=head;

Node qMid=head;

while (mid.next!=null){

qMid=mid;

mid=mid.next;

}

qMid.next= null;

size–;

}

//    获取链表指定下标的结点

public Node get(int index){

Node mid=head;

if (index==0){

return head;

}

int j=0;

while (j<index){

mid=mid.next;

j++;

}

return mid;

}

public static void main(String[] args) {

TLinkedList linkedList = new TLinkedList<>();

linkedList.addFirst(“hello1”);

linkedList.addFirst(“hello2”);

linkedList.addFirst(“hello3”);

for (int i = 0; i < linkedList.size; i++) {

System.out.println(linkedList.get(i).getT());

}

//        linkedList.removeLast();

//        linkedList.removeFirst();

//        linkedList.addLast(“hello4”);

linkedList.addMid(“hello”,2);

System.out.println(“--------------”);

for (int i = 0; i < linkedList.size; i++) {

System.out.println(linkedList.get(i).getT());

}

}

}

结果如下:

二、栈(Stack)

==========

1、一提到栈我们脑海就会浮现四个字“先进后出”,没错,它就是栈的最大特点。

2、栈的应用场景也非常多,比如将字符串反转、jvm里面的栈区等等。

3、栈里面的主要操作有:

  • push(入栈):将一个数据元素从尾部插入

  • pop(出栈):将一个数据元素从尾部删除

  • peek(返回栈顶元素):将栈顶元素的数据返回

相当于只有一个开口就是尾部,只能从尾进,从尾出。

4、下面通过链表结构实现栈结构:

package com.tStack;

/**

* User:zhang

* Date:2020/10/26

**/

public class Test_Stack {

private Node head;//栈的头结点

private int size;//栈的元素个数

class Node{

private Node next;//下一个结点

private T t;//结点的数据

public Node(T t){

this.t=t;

}

public T getT() {

return t;

}

public void setT(T t) {

this.t = t;

}

}

public Test_Stack() {

head=null;

size=0;

}

public static void main(String[] args) {

Test_Stack TStack = new Test_Stack<>();

TStack.push(“hello1”);

TStack.push(“hello2”);

TStack.push(“hello3”);

for (int i = 0; i < 3; i++) {

System.out.println(TStack.pop());

}

}

//    入栈

public void push(T t){

Node node = new Node(t);

if (size==0){

node.next=head;

head=node;

size++;

return;

}

if (size==1){

head.next=node;

node.next=null;

size++;

return;

}

Node lastNode=head;

while (lastNode.next!=null){

lastNode=lastNode.next;

}

lastNode.next=node;

node.next=null;

size++;

}

//    出栈

public T pop(){

if (size==0){

System.out.println(“栈内无值”);

return null;

}

if (size==1){

T t = head.getT();

head=null;

size–;

return t;

}

Node lastNode=head;

Node qNode=head;

while (lastNode.next!=null){

qNode=lastNode;

lastNode=lastNode.next;

}

T t = lastNode.getT();

qNode.next=null;

size–;

return t;

}

//    获取栈里面元素的个数

public int getSize(){

return size;

}

//    返回栈顶元素

public T peek(){

if (size==0){

System.out.println(“栈内无值”);

return null;

}

if (size==1){

return head.getT();

}

Node lastNode=head;

while (lastNode.next!=null){

lastNode=lastNode.next;

}

return lastNode.getT();

}

}

结果:

三、队列(Queue)

===========

1、队列的特点也用“先进先出”四个字来概括。就是先进去的元素先输出出来。

2、我们常见的消息队列就是队列结构实现的。

最后

ActiveMQ消息中间件面试专题

  • 什么是ActiveMQ?
  • ActiveMQ服务器宕机怎么办?
  • 丢消息怎么办?
  • 持久化消息非常慢怎么办?
  • 消息的不均匀消费怎么办?
  • 死信队列怎么办?
  • ActiveMQ中的消息重发时间间隔和重发次数吗?

ActiveMQ消息中间件面试专题解析拓展:

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


redis面试专题及答案

  • 支持一致性哈希的客户端有哪些?
  • Redis与其他key-value存储有什么不同?
  • Redis的内存占用情况怎么样?
  • 都有哪些办法可以降低Redis的内存使用情况呢?
  • 查看Redis使用情况及状态信息用什么命令?
  • Redis的内存用完了会发生什么?
  • Redis是单线程的,如何提高多核CPU的利用率?

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


Spring面试专题及答案

  • 谈谈你对 Spring 的理解
  • Spring 有哪些优点?
  • Spring 中的设计模式
  • 怎样开启注解装配以及常用注解
  • 简单介绍下 Spring bean 的生命周期

Spring面试答案解析拓展

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


高并发多线程面试专题

  • 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
  • Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。
  • Java 中 wait 和 sleep 方法有什么区别?
  • 如何在 Java 中实现一个阻塞队列?
  • 如何在 Java 中编写代码解决生产者消费者问题?
  • 写一段死锁代码。你在 Java 中如何解决死锁?

高并发多线程面试解析与拓展

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM


jvm面试专题与解析

  • JVM 由哪些部分组成?
  • JVM 内存划分?
  • Java 的内存模型?
  • 引用的分类?
  • GC什么时候开始?

JVM面试专题解析与拓展!

BAT面试文档:ActiveMQ+redis+Spring+高并发多线程+JVM

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!
DV-1714684171416)]


高并发多线程面试专题

  • 现在有线程 T1、T2 和 T3。你如何确保 T2 线程在 T1 之后执行,并且 T3 线程在 T2 之后执行?
  • Java 中新的 Lock 接口相对于同步代码块(synchronized block)有什么优势?如果让你实现一个高性能缓存,支持并发读取和单一写入,你如何保证数据完整性。
  • Java 中 wait 和 sleep 方法有什么区别?
  • 如何在 Java 中实现一个阻塞队列?
  • 如何在 Java 中编写代码解决生产者消费者问题?
  • 写一段死锁代码。你在 Java 中如何解决死锁?

高并发多线程面试解析与拓展

[外链图片转存中…(img-KYjYJuRg-1714684171416)]


jvm面试专题与解析

  • JVM 由哪些部分组成?
  • JVM 内存划分?
  • Java 的内存模型?
  • 引用的分类?
  • GC什么时候开始?

JVM面试专题解析与拓展!

[外链图片转存中…(img-idLQShba-1714684171417)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐