Implicit wait is the maximum time for element lookup in the DOM.
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
Means WebElement element = driver.findElement(By.id("someId"))
will look for element with id "someId"
up to 10 seconds, and return this element as soon as it exists in the DOM.
Explicit wait use ExpectedConditions, which means you can wait for an element to be in a certain state
WebDriverWait wait = new WebDriverWait(WebDriverRefrence, 10);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.id("someId")));
Is similar, wait for an element to exist in the DOM, but there are many more options, for example
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("someId")));
Which will wait for the element to be visible. It also give you options to wait for other conditions not related to locating elements, like waiting for url to change or to alert to appear
wait.until(ExpectedConditions.urlToBe("someUrl"));
wait.until(ExpectedConditions.alertIsPresent());