Final Exam: Lead Developer will test your knowledge and application of the topics presented throughout the Lead Developer track of the Skillsoft Aspire Apprentice Developer to Journeyman Developer Journey.
analyze algorithms with logarithmic time complexity
analyze algorithms with quadratic time complexity
analyze compiled bytecode to see how Java uses type erasure to ensure type safety and prevent code bloat
apply default values to an element in annotation and also experiment with unnamed elements
apply terminal operations on predicates
apply the @Override annotation to detect typographical errors in method names at compile-time rather than at run-time
change the target policy to control exactly what code elements an annotation can be applied to
count nodes and delete nodes in a circular linked list
create a HashSet object and invoke multiple methods on it, and also correctly override the .hashCode and .equals method of the contained class
create a TreeSet and sort it using various custom comparators
define a method, override it, and then mark that overridden version with the @Override annotation
delete a node from a linked list and rewire the list
demonstrate that custom objects can be keys or values in maps, but that in order to ensure that there are no duplicates you have to override the .hashCode and .equals methods of those contained objects correctly
demonstrate that predicates can be used to transform one stream object into another
demonstrate that the @SafeVarargs annotation is purely indicative and does not perform any run time or compile checks
demonstrate various relationships between base and derived classes in the presence of type parameters
dequeue elements in a queue implemented as a circular queue
dequeue elements in a queue implemented using arrays
describe how different implementations of the Set interface differ in their notions of set order
describe how the .get, .set, .add, .indexof, and .lastindexof methods work
describe how the overridden version of .equals can be used to control list equality operations
describe how varargs are defined and used
describe how you can create a custom comparator
describe how you can iterate over lists using ListIterator
describe how you can use the .copy function to take values from one list and put them in another
describe important methods of the List interface and how the .addall, .removeall, and .retainall methods work
describes the is-a relationship of an ArrayList with Collection, Iterable, and List
describe the two limitations of an array
describe when you can use the .sublist method to get a part of a list
differentiate between ArrayLists and LinkedLists and the use cases where they are suitable
differentiate between bounded and unbounded type parameters
differentiate between methods used to compute set union, difference, intersection, and equality operations
enqueue elements in a queue implemented as a circular queue
enqueue elements in a queue implemented using arrays
enumerate different scenarios in which the @SuppressWarnings annotation can be applied
incorporate constraints, known as bounds, on type parameters
insert a new node at the head, count the number of nodes in a linked list
insert a new node at the tail of the linked list
pop elements from and peek into a stack implemented using linked lists
pop elements from a stack implemented using arrays
push new elements on to a stack implemented using linked list
push new elements on to the stack implemented using arrays
recognize different aspects of specifying and using type parameters
recognize exactly what counts as a functional interface and what does not
recognize how maps work and that they are very similar to their set counterparts
recognize how the @Deprecated annotation can be used to flag the instantiation of objects of deprecated classes at compile-time
recognize how the Iterable and Iterator interfaces can be accessed using loops to avoid run-time errors from going over the limits of a list
recognize how type parameters can be applied not only to classes, but also to specific methods inside classes
recognize how type parameters may exist only in the base class, or only in the derived class, or in both
recognize how using type parameters can ensure both type safety and code reuse
recognize the different types of sets and how they all extend the Set, Collection, and Iterable interfaces
recognize use-cases where a base class specifies one type parameter and the derived class specifies multiple type parameters
recognize what streams are and some of the methods you can invoke on them
search for a node with specific data in a linked list
traverse a doubly linked list from the last element to the first
use the built-in classes in Java for queues and stacks
use upper bounded wildcards to specify that a type parameter must be a sub-class of a certain type