They are not the same thing.
As you can see in the example below they do different actions.
display: none; makes the element not appear on the page at all. It will only be visible in the HTML source code/DOM.
visibility: hidden; makes the element not visible, but space it occupies is yet allocated for it. The element is rendered but it's just not shown on the page and the user can't interact wit it.
opacity: 0; has a similar effect as
visibility: hidden; just that, like in the example below if you have a button, the user can still interact with it.