diff --git a/contents/stacks_and_queues/code/java/Queue.java b/contents/stacks_and_queues/code/java/Queue.java
new file mode 100644
index 000000000..bb349ec6d
--- /dev/null
+++ b/contents/stacks_and_queues/code/java/Queue.java
@@ -0,0 +1,71 @@
+import java.util.List;
+import java.util.ArrayList;
+
+public class QueueTest {
+    
+    public static void main(String[] args) {
+	IQueue<Integer> intQueue = new Queue<>();
+
+	intQueue.enqueue(4);
+	intQueue.enqueue(5);
+	intQueue.enqueue(9);
+	
+	System.out.println(intQueue.dequeue());
+	System.out.println(intQueue.size());
+	System.out.println(intQueue.front());
+    }
+
+}
+
+
+interface IQueue<T> {
+
+   /*
+    * 'dequeue' removes the first element from the queue and returns it
+    */
+    T dequeue();
+
+   /*
+    * 'enqueue' adds an element at the end of the queue and returns the new size
+    */
+    int enqueue(T element);
+    
+
+   /*
+    * 'size' returns the size of the queue
+    */
+    int size();
+
+   /*
+    * 'front' returns the first element of the queue without removing it
+    */
+    T front();
+}
+
+
+public class Queue<T> implements  IQueue<T> {
+
+    private List<T> list;
+
+    public Queue() {
+        this.list = new ArrayList<>();
+    }
+
+    public T dequeue() {
+        return this.list.remove(0);
+    }
+
+    public int enqueue(T element) {
+        this.list.add(element);
+        return this.size();
+    }
+
+    public int size() {
+        return this.list.size();
+    }
+
+    public T front() {
+        return this.list.get(0);
+    }
+
+}
diff --git a/contents/stacks_and_queues/code/java/Stack.java b/contents/stacks_and_queues/code/java/Stack.java
new file mode 100644
index 000000000..2d65a0e59
--- /dev/null
+++ b/contents/stacks_and_queues/code/java/Stack.java
@@ -0,0 +1,72 @@
+import java.util.List;
+import java.util.ArrayList;
+
+
+public class StackTest {
+    
+    public static void main(String[] args) {
+	IStack<Integer> intStack = new Stack<>();
+
+	intStack.push(4);
+	intStack.push(5);
+	intStack.push(9);
+
+	System.out.println(intStack.pop());
+	System.out.println(intStack.size());
+	System.out.println(intStack.top());
+    }
+
+}
+
+
+interface IStack<T> {
+   /*
+    * 'pop' removed the last element from the stack and returns it
+    */
+    T pop();
+
+   /*
+    * 'push' adds an element to at the end of the stack and returns the new size
+    */
+    int push(T element);
+
+   /*
+    * 'size' returns the length of the stack
+    */
+    int size();
+
+   /*
+    * 'top' returns the first element of the stack
+    */
+    T top();
+}
+
+
+public class Stack<T> implements IStack<T> {
+    
+    private List<T> list;
+
+    public Stack() {
+        this.list = new ArrayList<>();
+    }
+
+    public T pop() {
+        return this.list.remove(this.size() - 1);
+    }
+
+    public int push(T element) {
+        this.list.add(element);
+        return this.size();
+    }
+
+    public int size() {
+        return this.list.size();
+    }
+
+    public T top() {
+        return this.list.get(this.size() - 1);
+    }
+
+}
+
+
diff --git a/contents/stacks_and_queues/stacks_and_queues.md b/contents/stacks_and_queues/stacks_and_queues.md
index 11c7088f7..89a77be9a 100644
--- a/contents/stacks_and_queues/stacks_and_queues.md
+++ b/contents/stacks_and_queues/stacks_and_queues.md
@@ -18,12 +18,16 @@ Here is a simple implementation of a stack:
 {% method %}
 {% sample lang="ts" %}
 [import, lang:"typescript"](code/typescript/stack.ts)
+{% sample lang="java" %}
+[import, lang:"java"](code/java/Stack.java)
 {% endmethod %}
 
 Here is a simple implementation of a queue:
 {% method %}
 {% sample lang="ts" %}
 [import, lang:"typescript"](code/typescript/queue.ts)
+{% sample lang="java" %}
+[import, lang:"java" ](code/java/Queue.java)
 {% endmethod %}