AP CSA Practice Test 2
A full-length AP Computer Science A multiple-choice practice test: 42 questions, answered one at a time with instant feedback, a final score, and a breakdown of the essential knowledge you missed.
This is a full-length practice test for the multiple-choice section of the AP Computer Science A exam: 42 questions. On the real exam you get 90 minutes to answer 42 questions, which works out to a little over two minutes each. Set a timer for 90 minutes if you want to practice under exam conditions, and keep the Java Quick Reference handy, since the exam provides it.
Questions appear one at a time, in order. Pick an answer, press Check answer, read why each choice is right or wrong, then move on. After the last question you'll see your score as a percentage and a table showing how many questions you missed for each essential knowledge (EKS) statement, so you know what to study next.
Your answers are saved in this browser as you go, so you can close the page and pick up where you left off. The numbered boxes above each question let you go back and review any question you've already answered. Use Start over to clear your answers and begin again. Nothing is sent to a server.
What this test covers
| Unit | Questions |
|---|---|
| Unit 1: Using Objects and Methods | 10 |
| Unit 2: Selection and Iteration | 10 |
| Unit 3: Class Creation | 8 |
| Unit 4: Data Collections | 14 |
Take the test
Loading questions…
Essential knowledge for this test
These are the essential knowledge (EKS) statements from the AP Computer Science A Course and Exam Description that the questions on this test assess, grouped by topic and learning objective. The tables under each question and in your results link here.
Topic 1.2: Variables and Data Types
1.2.A — Identify the most appropriate data type category for a particular specification.
- 1.2.A.1 A data type is a set of values and a corresponding set of operations on those values. Data types can be categorized as either primitive or reference.
- 1.2.A.2 The primitive data types used in this course define the set of values and corresponding operations on those values for numbers and Boolean values.
- 1.2.A.3 A reference type is used to define objects that are not primitive types.
1.2.B — Develop code to declare variables to store numbers and Boolean values.
- 1.2.B.1 The three primitive data types used in this course are int, double, and boolean. An int value is an integer. A double value is a real number. A boolean value is either true or false.
- 1.2.B.2 A variable is a storage location that holds a value, which can change while the program is running. Every variable has a name and an associated data type. A variable of a primitive type holds a primitive value from that type.
Topic 1.3: Expressions and Output
1.3.C — Develop code for arithmetic expressions and determine the result of these expressions.
- 1.3.C.3 When dividing numeric values that are both int values, the result is only the integer portion of the quotient. When dividing numeric values that use at least one double value, the result is the quotient.
- 1.3.C.4 The remainder operator % is used to compute the remainder when one number a is divided by another number b.
Topic 1.4: Assignment Statements and Input
1.4.A — Develop code for assignment statements with expressions and determine the value that is stored in the variable as a result of these statements.
- 1.4.A.2 The assignment operator = allows a program to initialize or change the value stored in a variable. The value of the expression on the right is stored in the variable on the left.
- 1.4.A.3 During execution, an expression is evaluated to produce a single value. The value of an expression has a type based on the evaluation of the expression.
1.4.B — Develop code to read input.
- 1.4.B.1 Input can come in a variety of forms, such as tactile, audio, visual, or text. The Scanner class is one way to obtain text input from the keyboard.
Topic 1.5: Casting and Range of Variables
1.5.A — Develop code to cast primitive values to different primitive types in arithmetic expressions and determine the value that is produced as a result.
- 1.5.A.1 The casting operators (int) and (double) can be used to convert from a double value to an int value (or vice versa).
- 1.5.A.3 Some code causes int values to be automatically cast (widened) to double values.
1.5.B — Describe conditions when an integer expression evaluates to a value out of range.
- 1.5.B.1 The constant Integer.MAX_VALUE holds the value of the largest possible int value. The constant Integer.MIN_VALUE holds the value of the smallest possible int value.
- 1.5.B.2 Integer values in Java are represented by values of type int, which are stored using a finite amount (4 bytes) of memory. Therefore, an int value must be in the range from Integer.MIN_VALUE to Integer.MAX_VALUE inclusive.
- 1.5.B.3 If an expression would evaluate to an int value outside of the allowed range, an integer overflow occurs. The result is an int value in the allowed range but not necessarily the value expected.
1.5.C — Describe conditions that limit accuracy of expressions.
- 1.5.C.1 Computers allot a specified amount of memory to store data based on the data type. If an expression would evaluate to a double that is more precise than can be stored in the allotted amount of memory, a round-off error occurs. The result will be rounded to the representable value. To avoid rounding errors that naturally occur, use int values.
Topic 1.6: Compound Assignment Operators
1.6.A — Develop code for assignment statements with compound assignment operators and determine the value that is stored in the variable as a result.
- 1.6.A.1 Compound assignment operators +=, −=, *=, /=, and %= can be used in place of the assignment operator in numeric expressions. A compound assignment operator performs the indicated arithmetic operation between the value on the left and the value on the right and then assigns the result to the variable on the left.
- 1.6.A.2 The post-increment operator ++ and post-decrement operator -- are used to add 1 or subtract 1 from the stored value of a numeric variable. The new value is assigned to the variable.
Topic 1.8: Documentation with Comments
1.8.A — Describe the functionality and use of code through comments.
- 1.8.A.1 Comments are written for both the original programmer and other programmers to understand the code and its functionality, but are ignored by the compiler and are not executed when the program is run. Three types of comments in Java include /* */, which generates a block of comments; //, which generates a comment on one line; and /** */, which are Javadoc comments and are used to create API documentation.
- 1.8.A.2 A precondition is a condition that must be true just prior to the execution of a method in order for it to behave as expected. There is no expectation that the method will check to ensure preconditions are satisfied.
- 1.8.A.3 A postcondition is a condition that must always be true after the execution of a method. Postconditions describe the outcome of the execution in terms of what is being returned or the current value of the attributes of an object.
Topic 1.9: Method Signatures
1.9.A — Identify the correct method to call based on documentation and method signatures.
- 1.9.A.2 A parameter is a variable declared in the header of a method or constructor and can be used inside the body of the method. This allows values or arguments to be passed and used by a method or constructor. A method signature for a method with parameters consists of the method name and the ordered list of parameter types. A method signature for a method without parameters consists of the method name and an empty parameter list.
1.9.B — Describe how to call methods.
- 1.9.B.3 An argument is a value that is passed into a method when the method is called. The arguments passed to a method must be compatible in number and order with the types identified in the parameter list of the method signature. When calling methods, arguments are passed using call by value. Call by value initializes the parameters with copies of the arguments.
- 1.9.B.4 Methods are said to be overloaded when there are multiple methods with the same name but different signatures.
Topic 1.10: Calling Class Methods
1.10.A — Develop code to call class methods and determine the result of those calls.
- 1.10.A.2 Class methods are typically called using the class name along with the dot operator. When the method call occurs in the defining class, the use of the class name is optional in the call.
Topic 1.11: Math Class
1.11.A — Develop code to write expressions that incorporate calls to built-in mathematical libraries and determine the value that is produced as a result.
- 1.11.A.1 The Math class is part of the java.lang package. Classes in the java.lang package are available by default.
Topic 1.12: Objects: Instances of Classes
1.12.A — Explain the relationship between a class and an object.
- 1.12.A.1 An object is a specific instance of a class with defined attributes. A class is the formal implementation, or blueprint, of the attributes and behaviors of an object.
- 1.12.A.3 All classes in Java are subclasses of the Object class.
1.12.B — Develop code to declare variables to store reference types.
- 1.12.B.1 A variable of a reference type holds an object reference, which can be thought of as the memory address of that object.
Topic 1.13: Object Creation and Storage (Instantiation)
1.13.B — Develop code to declare variables of the correct types to hold object references.
- 1.13.B.1 A variable of a reference type holds an object reference or, if there is no object, null.
1.13.C — Develop code to create an object by calling a constructor.
- 1.13.C.1 An object is typically created using the keyword new followed by a call to one of the class’s constructors.
- 1.13.C.2 Parameters allow constructors to accept values to establish the initial values of the attributes of the object.
Topic 1.14: Calling Instance Methods
1.14.A — Develop code to call instance methods and determine the result of these calls.
- 1.14.A.1 Instance methods are called on objects of the class. The dot operator is used along with the object name to call instance methods.
- 1.14.A.2 A method call on a null reference will result in a NullPointerException.
Topic 1.15: String Manipulation
1.15.A — Develop code to create string objects and determine the result of creating and combining strings.
- 1.15.A.2 The String class is part of the java.lang package. Classes in the java.lang package are available by default.
- 1.15.A.5 A String object can be concatenated with any object, which implicitly calls the object’s toString method (a behavior that is guaranteed to exist by the inheritance relationship every class has with the Object class). An object’s toString method returns a string value representing the object. Subclasses of Object often override the toString method with class-specific implementation. Method overriding occurs when a public method in a subclass has the same method signature as a public method in the superclass, but the behavior of the method is specific to the subclass.
1.15.B — Develop code to call methods on string objects and determine the result of calling these methods.
- 1.15.B.1 A String object has index values from 0 to one less than the length of the string. Attempting to access indices outside this range will result in a StringIndexOutOfBoundsException.
-
1.15.B.2 The following String methods—including what they do and when they are used—are part of the Java Quick Reference:
- int length() returns the number of characters in a String object.
- String substring(int from, int to) returns the substring beginning at index from and ending at index to - 1.
- String substring(int from) returns substring(from, length()).
- int indexOf(String str) returns the index of the first occurrence of str; returns -1 if not found.
- boolean equals(Object other) returns true if this corresponds to the same sequence of characters as other; returns false otherwise.
- int compareTo(String other) returns a value < 0 if this is less than other; returns zero if this is equal to other; returns a value > 0 if this is greater than other. Strings are ordered based upon the alphabet.
Topic 2.1: Algorithms with Selection and Repetition
2.1.A — Represent patterns and algorithms that involve selection and repetition found in everyday life using written language or diagrams.
- 2.1.A.1 The building blocks of algorithms include sequencing, selection, and repetition.
- 2.1.A.2 Algorithms can contain selection, through decision making, and repetition, via looping.
- 2.1.A.3 Selection occurs when a choice of how the execution of an algorithm will proceed is based on a true or false decision.
- 2.1.A.4 Repetition is when a process repeats itself until a desired outcome is reached.
- 2.1.A.5 The order in which sequencing, selection, and repetition are used contributes to the outcome of the algorithm.
Topic 2.2: Boolean Expressions
2.2.A — Develop code to create Boolean expressions with relational operators and determine the result of these expressions.
- 2.2.A.1 Values can be compared using the relational operators == and != to determine whether the values are the same. With primitive types, this compares the actual primitive values. With reference types, this compares the object references.
Topic 2.3: if Statements
2.3.A — Develop code to represent branching logical processes by using selection statements and determine the result of these processes.
- 2.3.A.4 A two-way selection (if-else statement) is used when there are two segments of code—one to be executed when the Boolean expression is true and another segment for when the Boolean expression is false. In this case, the body of the if is executed when the Boolean expression is true, and the body of the else is executed when the Boolean expression is false.
Topic 2.4: Nested if Statements
2.4.A — Develop code to represent nested branching logical processes and determine the result of these processes.
- 2.4.A.3 A multiway selection (if-else-if) is used when there are a series of expressions with different segments of code for each condition. Multiway selection is performed such that no more than one segment of code is executed based on the first expression that evaluates to true. If no expression evaluates to true and there is a trailing else statement, then the body of the else is executed.
Topic 2.5: Compound Boolean Expressions
2.5.A — Develop code to represent compound Boolean expressions and determine the result of these expressions.
- 2.5.A.1 Logical operators ! (not), && (and), and || (or) are used with Boolean expressions. The expression !a evaluates to true if a is false and evaluates to false otherwise. The expression a && b evaluates to true if both a and b are true and evaluates to false otherwise. The expression a || b evaluates to true if a is true, b is true, or both, and evaluates to false otherwise. The order of precedence for evaluating logical operators is ! (not), && (and), then || (or). An expression involving logical operators evaluates to a Boolean value.
Topic 2.6: Comparing Boolean Expressions
2.6.A — Compare equivalent Boolean expressions.
- 2.6.A.1 Two Boolean expressions are equivalent if they evaluate to the same value in all cases. Truth tables can be used to prove Boolean expressions are equivalent.
- 2.6.A.2 De Morgan’s law can be applied to Boolean expressions to create equivalent Boolean expressions. Under De Morgan’s law, the Boolean expression !(a && b) is equivalent to !a || !b and the Boolean expression !(a || b) is equivalent to !a && !b.
2.6.B — Develop code to compare object references using Boolean expressions and determine the result of these expressions.
- 2.6.B.1 Two different variables can hold references to the same object. Object references can be compared using == and !=.
- 2.6.B.2 An object reference can be compared with null, using == or !=, to determine if the reference actually references an object.
- 2.6.B.3 Classes often define their own equals method, which can be used to specify the criteria for equivalency for two objects of the class. The equivalency of two objects is most often determined using attributes from the two objects.
Topic 2.7: while Loops
2.7.A — Identify when an iterative process is required to achieve a desired result.
- 2.7.A.1 Iteration is a form of repetition. Iteration statements change the flow of control by repeating a segment of code zero or more times as long as the Boolean expression controlling the loop evaluates to true.
- 2.7.A.4 Off by one errors occur when the iteration statement loops one time too many or one time too few.
2.7.B — Develop code to represent iterative processes using while loops and determine the result of these processes.
- 2.7.B.1 A while loop is a type of iterative statement. In while loops, the Boolean expression is evaluated before each iteration of the loop body, including the first. When the expression evaluates to true, the loop body is executed. This continues until the Boolean expression evaluates to false, whereupon the iteration terminates.
Topic 2.8: for Loops
2.8.A — Develop code to represent iterative processes using for loops and determine the result of these processes.
- 2.8.A.2 In a for loop, the initialization statement is only executed once before the first Boolean expression evaluation. The variable being initialized is referred to as a loop control variable. The Boolean expression is evaluated immediately after the loop control variable is initialized and then following each execution of the increment statement until it is false. In each iteration, the update is executed after the entire loop body is executed and before the Boolean expression is evaluated again.
- 2.8.A.3 A for loop can be rewritten into an equivalent while loop (and vice versa).
Topic 2.9: Implementing Selection and Iteration Algorithms
2.9.A — Develop code for standard and original algorithms (without data structures) and determine the result of these algorithms.
-
2.9.A.1 There are standard algorithms to:
- identify if an integer is or is not evenly divisible by another integer
- identify the individual digits in an integer
- determine the frequency with which a specific criterion is met
- determine a minimum or maximum value
- compute a sum or average
Topic 2.10: Implementing String Algorithms
2.10.A — Develop code for standard and original algorithms that involve strings and determine the result of these algorithms.
-
2.10.A.1 There are standard string algorithms to:
- find if one or more substrings have a particular property
- determine the number of substrings that meet specific criteria
- create a new string with the characters reversed
Topic 2.11: Nested Iteration
2.11.A — Develop code to represent nested iterative processes and determine the result of these processes.
- 2.11.A.1 Nested iteration statements are iteration statements that appear in the body of another iteration statement. When a loop is nested inside another loop, the inner loop must complete all its iterations before the outer loop can continue to its next iteration.
Topic 2.12: Informal Run-Time Analysis
2.12.A — Calculate statement execution counts and informal run-time comparison of iterative statements.
- 2.12.A.1 A statement execution count indicates the number of times a statement is executed by the program. Statement execution counts are often calculated informally through tracing and analysis of the iterative statements.
Topic 3.1: Abstraction and Program Design
3.1.A — Represent the design of a program by using natural language or creating diagrams that indicate the classes in the program and the data and procedural abstractions found in each class by including all attributes and behaviors.
- 3.1.A.3 An attribute is a type of data abstraction that is defined in a class outside any method or constructor. An instance variable is an attribute whose value is unique to each instance of the class. A class variable is an attribute shared by all instances of the class.
- 3.1.A.4 Procedural abstraction provides a name for a process and allows a method to be used only knowing what it does, not how it does it. Through method decomposition, a programmer breaks down larger behaviors of the class into smaller behaviors by creating methods to represent each individual smaller behavior. A procedural abstraction may extract shared features to generalize functionality instead of duplicating code. This allows for code reuse, which helps manage complexity.
- 3.1.A.5 Using parameters allows procedures to be generalized, enabling the procedures to be reused with a range of input values or arguments.
- 3.1.A.6 Using procedural abstraction in a program allows programmers to change the internals of a method (to make it faster, more efficient, use less storage, etc.) without needing to notify method users of the change as long as the method signature and what the method does is preserved.
- 3.1.A.7 Prior to implementing a class, it is helpful to take time to design each class including its attributes and behaviors. This design can be represented using natural language or diagrams.
Topic 3.2: Impact of Program Design
3.2.A — Explain the social and ethical implications of computing systems.
- 3.2.A.1 System reliability refers to the program being able to perform its tasks as expected under stated conditions without failure. Programmers should make an effort to maximize system reliability by testing the program with a variety of conditions.
- 3.2.A.2 The creation of programs has impacts on society, the economy, and culture. These impacts can be both beneficial and harmful. Programs meant to fill a need or solve a problem can have unintended harmful effects beyond their intended use.
- 3.2.A.3 Legal issues and intellectual property concerns arise when creating programs. Programmers often reuse code written by others and published as open source and free to use. Incorporation of code that is not published as open source requires the programmer to obtain permission and often purchase the code before integrating it into their program.
Topic 3.3: Anatomy of a Class
3.3.A — Develop code to designate access and visibility constraints to classes, data, constructors, and methods.
- 3.3.A.1 Data encapsulation is a technique in which the implementation details of a class are kept hidden from external classes. The keywords public and private affect the access of classes, data, constructors, and methods. The keyword private restricts access to the declaring class, while the keyword public allows access from classes outside the declaring class.
- 3.3.A.2 In this course, classes are always designated public and are declared with the keyword class.
- 3.3.A.3 In this course, constructors are always designated public.
- 3.3.A.5 Access to attributes should be kept internal to the class in order to accomplish encapsulation. Therefore, it is good programming practice to designate the instance variables for these attributes as private unless the class specification states otherwise.
- 3.3.A.6 Access to behaviors can be internal or external to the class. Methods designated as public can be accessed internally or externally to a class, whereas methods designated as private can only be accessed internally to the class.
Topic 3.4: Constructors
3.4.A — Develop code to declare instance variables for the attributes to be initialized in the body of the constructors of a class.
- 3.4.A.2 A constructor is used to set the initial state of an object, which should include initial values for all instance variables. When a constructor is called, memory is allocated for the object and the associated object reference is returned. Constructor parameters, if specified, provide data to initialize instance variables.
- 3.4.A.4 When no constructor is written, Java provides a no-parameter constructor, and the instance variables are set to default values according to the data type of the attribute. This constructor is called the default constructor.
Topic 3.5: Methods: How to Write Them
3.5.A — Develop code to define behaviors of an object through methods written in a class using primitive values and determine the result of calling these methods.
- 3.5.A.5 An accessor method allows objects of other classes to obtain a copy of the value of instance variables or class variables. An accessor method is a non-void method.
Topic 3.6: Methods: Passing and Returning References of an Object
3.6.A — Develop code to define behaviors of an object through methods written in a class using object references and determine the result of calling these methods.
- 3.6.A.1 When an argument is an object reference, the parameter is initialized with a copy of that reference; it does not create a new independent copy of the object. If the parameter refers to a mutable object, the method or constructor can use this reference to alter the state of the object. It is good programming practice to not modify mutable objects that are passed as parameters unless required in the specification.
- 3.6.A.2 When the return expression evaluates to an object reference, the reference is returned, not a reference to a new copy of the object.
- 3.6.A.3 Methods cannot access the private data and methods of a parameter that holds a reference to an object unless the parameter is the same type as the method’s enclosing class.
Topic 3.7: Class Variables and Methods
3.7.A — Develop code to define behaviors of a class through class methods.
- 3.7.A.1 Class methods cannot access or change the values of instance variables or call instance methods without being passed an instance of the class via a parameter.
- 3.7.A.2 Class methods can access or change the values of class variables and can call other class methods.
3.7.B — Develop code to declare the class variables that belong to the class.
- 3.7.B.1 Class variables belong to the class, with all objects of a class sharing a single copy of the class variable. Class variables are designated with the static keyword before the variable type.
- 3.7.B.2 Class variables that are designated public are accessed outside of the class by using the class name and the dot operator, since they are associated with a class, not objects of a class.
- 3.7.B.3 When a variable is declared final, its value cannot be modified.
Topic 3.8: Scope and Access
3.8.A — Explain where variables can be used in the code.
- 3.8.A.1 Local variables are variables declared in the headers or bodies of blocks of code. Local variables can only be accessed in the block in which they are declared. Since constructors and methods are blocks of code, parameters to constructors or methods are also considered local variables. These variables may only be used within the constructor or method and cannot be declared to be public or private.
- 3.8.A.2 When there is a local variable or parameter with the same name as an instance variable, the variable name will refer to the local variable instead of the instance variable within the body of the constructor or method.
Topic 3.9: this Keyword
3.9.A — Develop code for expressions that are self-referencing and determine the result of these expressions.
- 3.9.A.3 Class methods do not have a this reference.
Topic 4.1: Ethical and Social Issues Around Data Collection
4.1.B — Explain the importance of recognizing data quality and potential issues when using a data set.
- 4.1.B.2 Programmers should be aware of the data set collection method and the potential for bias when using this method before using the data to extrapolate new information or drawing conclusions.
- 4.1.B.3 Some data sets are incomplete or contain inaccurate data. Using such data in the development or use of a program can cause the program to work incorrectly or inefficiently.
4.1.C — Identify an appropriate data set to use in order to solve a problem or answer a specific question.
- 4.1.C.1 Contents of a data set might be related to a specific question or topic and might not be appropriate to give correct answers or extrapolate information for a different question or topic.
Topic 4.3: Array Creation and Access
4.3.A — Develop code used to represent collections of related data using one- dimensional (1D) array objects.
- 4.3.A.3 When an array is created using the keyword new, all of its elements are initialized to the default values for the element data type. The default value for int is 0, for double is 0.0, for boolean is false, and for a reference type is null.
- 4.3.A.4 Initializer lists can be used to create and initialize arrays.
- 4.3.A.5 Square brackets [] are used to access and modify an element in a 1D array using an index.
- 4.3.A.6 The valid index values for an array are 0 through one less than the length of the array, inclusive. Using an index value outside of this range will result in an ArrayIndexOutOfBoundsException.
Topic 4.4: Array Traversals
4.4.A — Develop code used to traverse the elements in a 1D array and determine the result of these traversals.
- 4.4.A.1 Traversing an array is when repetition statements are used to access all or an ordered sequence of elements in an array.
- 4.4.A.2 Traversing an array with an indexed for loop or while loop requires elements to be accessed using their indices.
- 4.4.A.6 Code written using an enhanced for loop to traverse elements in an array can be rewritten using an indexed for loop or a while loop.
Topic 4.5: Implementing Array Algorithms
4.5.A — Develop code for standard and original algorithms for a particular context or specification that involves arrays and determine the result of these algorithms.
-
4.5.A.1 There are standard algorithms that utilize array traversals to:
- determine a minimum or maximum value
- compute a sum or average
- determine if at least one element has a particular property
- determine if all elements have a particular property
- determine the number of elements having a particular property
- access all consecutive pairs of elements
- determine the presence or absence of duplicate elements
- shift or rotate elements left or right
- reverse the order of the elements
Topic 4.6: Using Text Files
4.6.A — Develop code to read data from a text file.
- 4.6.A.1 A file is storage for data that persists when the program is not running. The data in a file can be retrieved during program execution.
-
4.6.A.3 A file can be opened by creating a File object, using the name of the file as the argument of the constructor.
- File(String str) is the File constructor that accepts a String file name to open for reading, where str is the pathname for the file.
- 4.6.A.4 When using the File class, it is required to indicate what to do if the file with the provided name cannot be opened. One way to accomplish this is to add throws IOException to the header of the method that uses the file. If the file name is invalid, the program will terminate.
- 4.6.A.5 The File and IOException classes are part of the java.io package. An import statement must be used to make these classes available for use in the program.
-
4.6.A.8 The following additional String method— including what it does and when it is used—is part of the Java Quick Reference:
- String[] split(String del) returns a String array where each element is a substring of this String, which has been split around matches of the given expression del.
Topic 4.7: Wrapper Classes
4.7.A — Develop code to use Integer and Double objects from their primitive counterparts and determine the result of using these objects.
-
4.7.A.2 Autoboxing is the automatic conversion that the Java compiler makes between primitive types and their corresponding object wrapper classes. This includes converting an int to an Integer and a double to a Double. The Java compiler applies autoboxing when a primitive value is:
- passed as a parameter to a method that expects an object of the corresponding wrapper class
- assigned to a variable of the corresponding wrapper class
-
4.7.A.5 The following class Double method— including what it does and when it is used—is part of the Java Quick Reference:
- static double parseDouble(String s) returns the String argument as a double.
Topic 4.8: ArrayList Methods
4.8.A — Develop code for collections of related objects using ArrayList objects and determine the result of calling methods on these objects.
- 4.8.A.3 Java allows the generic type ArrayList<E>, where the type parameter E specifies the type of the elements. When ArrayList<E> is specified, the types of the reference parameters and return type when using the ArrayList methods are type E. ArrayList<E> is preferred over ArrayList. For example, ArrayList<String> names = new ArrayList<String>(); allows the compiler to find errors that would otherwise be found at run-time.
-
4.8.A.5 The following ArrayList methods— including what they do and when they are used—are part of the Java Quick Reference:
- int size() returns the number of elements in the list.
- boolean add(E obj) appends obj to end of list; returns true.
- void add(int index, E obj) inserts obj at position index (0 <= index <= size), moving elements at position index and higher to the right (adds 1 to their indices) and adds 1 to size.
- E get(int index) returns the element at position index in the list.
- E set(int index, E obj) replaces the element at position index with obj; returns the element formerly at position index.
- E remove(int index) removes element from position index, moving elements at position index + 1 and higher to the left (subtracts 1 from their indices) and subtracts 1 from size; returns the element formerly at position index.
Topic 4.9: ArrayList Traversals
4.9.A — Develop code used to traverse the elements of an ArrayList and determine the results of these traversals.
- 4.9.A.1 Traversing an ArrayList is when iteration or recursive statements are used to access all or an ordered sequence of the elements in an ArrayList.
- 4.9.A.2 Deleting elements during a traversal of an ArrayList requires the use of special techniques to avoid skipping elements.
- 4.9.A.4 Changing the size of an ArrayList while traversing it using an enhanced for loop can result in a ConcurrentModificationException. Therefore, when using an enhanced for loop to traverse an ArrayList, you should not add or remove elements.
Topic 4.10: Implementing ArrayList Algorithms
4.10.A — Develop code for standard and original algorithms for a particular context or specification that involve ArrayList objects and determine the result of these algorithms.
-
4.10.A.1 There are standard ArrayList algorithms that utilize traversals to:
- determine a minimum or maximum value
- compute a sum or average
- determine if at least one element has a particular property
- determine if all elements have a particular property
- determine the number of elements having a particular property
- access all consecutive pairs of elements
- determine the presence or absence of duplicate elements
- shift or rotate elements left or right
- reverse the order of the elements
- insert elements
- delete elements
- 4.10.A.2 Some algorithms require multiple String, array, or ArrayList objects to be traversed simultaneously.
Topic 4.11: 2D Array Creation and Access
4.11.A — Develop code used to represent collections of related data using two- dimensional (2D) array objects.
- 4.11.A.3 The initializer list used to create and initialize a 2D array consists of initializer lists that represent 1D arrays; for example, int[][] arr2D = { {1, 2, 3}, {4, 5, 6} };.
- 4.11.A.4 The square brackets [row][col] are used to access and modify an element in a 2D array. For the purposes of the exam, when accessing the element at arr[first][second], the first index is used for rows, the second index is used for columns.
- 4.11.A.6 The number of rows contained in a 2D array can be accessed through the length attribute. The valid row index values for a 2D array are 0 through one less than the number of rows or the length of the array, inclusive. The number of columns contained in a 2D array can be accessed through the length attribute of one of the rows. The valid column index values for a 2D array are 0 through one less than the number of columns or the length of any given row of the array, inclusive. For example, given a 2D array named values, the number of rows is values.length and the number of columns is values[0].length. Using an index value outside of these ranges will result in an ArrayIndexOutOfBoundsException.
Topic 4.12: 2D Array Traversals
4.12.A — Develop code used to traverse the elements in a 2D array and determine the result of these traversals.
- 4.12.A.1 Nested iteration statements are used to traverse and access all or an ordered sequence of elements in a 2D array. Since 2D arrays are stored as arrays of arrays, the way 2D arrays are traversed using for loops and enhanced for loops is similar to 1D array objects. Nested iteration statements can be written to traverse the 2D array in row-major order, column-major order, or a uniquely defined order. Row-major order refers to an ordering of 2D array elements where traversal occurs across each row, whereas column-major order traversal occurs down each column.
Topic 4.13: Implementing 2D Array Algorithms
4.13.A — Develop code for standard and original algorithms for a particular context or specification that involves 2D arrays and determine the result of these algorithms.
-
4.13.A.1 There are standard algorithms that utilize 2D array traversals to:
- determine a minimum or maximum value of all the elements or for a designated row, column, or other subsection
- compute a sum or average of all the elements or for a designated row, column, or other subsection
- determine if at least one element has a particular property in the entire 2D array or for a designated row, column, or other subsection
- determine if all elements of the 2D array or a designated row, column, or other subsection have a particular property
- determine the number of elements in the 2D array or in a designated row, column, or other subsection having a particular property
- access all consecutive pairs of elements
- determine the presence or absence of duplicate elements in the 2D array or in a designated row, column, or other subsection
- shift or rotate elements in a row left or right or in a column up or down
- reverse the order of the elements in a row or column
Topic 4.15: Sorting Algorithms
4.15.A — Determine the result of executing each step of sorting algorithms to sort the elements of a collection.
- 4.15.A.1 Selection sort and insertion sort are iterative sorting algorithms that can be used to sort elements in an array or ArrayList.
- 4.15.A.2 Selection sort repeatedly selects the smallest (or largest) element from the unsorted portion of the list and swaps it into its correct (and final) position in the sorted portion of the list.
Topic 4.16: Recursion
4.16.A — Determine the result of calling recursive methods.
- 4.16.A.1 A recursive method is a method that calls itself. Recursive methods contain at least one base case, which halts the recursion, and at least one recursive call. Recursion is another form of repetition.
Topic 4.17: Recursive Searching and Sorting
4.17.B — Determine the result of each iteration of a binary search algorithm used to search for information in a collection.
- 4.17.B.1 Data must be in sorted order to use the binary search algorithm. Binary search starts at the middle of a sorted array or ArrayList and eliminates half of the array or ArrayList in each recursive call until the desired value is found or all elements have been eliminated.
- 4.17.B.2 Binary search is typically more efficient than linear search.
- 4.17.B.3 The binary search algorithm can be written either iteratively or recursively.
4.17.C — Determine the result of each iteration of the merge sort algorithm when used to sort a collection.
- 4.17.C.1 Merge sort is a recursive sorting algorithm that can be used to sort elements in an array or ArrayList.
- 4.17.C.2 Merge sort repeatedly divides an array into smaller subarrays until each subarray is one element and then recursively merges the sorted subarrays back together in sorted order to form the final sorted array.