集合第二部分 List
List的3个儿子存储字符串和自定义对象并遍历代码演示
1.List的3个儿子(掌握)
(1)List
|--ArrayList
底层数据结构是数组,查询快,增删慢.
线程不安全,效率高
|--Vector
底层数据结构是数组,查询快,增删慢.
线程安全,效率低
|--LinkedList
底层数据结构是链表,查询慢,增删快.
线程不安全,效率高
刘意老师总结:什么时候用谁?
线程安全:
是:Vector
否:ArrayList,LinkedList
查询多:ArrayList
增删多:LinkedList
如果你什么都不懂,就用ArrayList。
加入泛型,并遍历。
(2)ArrayList存储字符串和自定义对象并遍历。
//自定义类Student
class Student
{
//姓名
private String name;
//年龄
private int age;
//无参构造
public Student(){
}
//带参构造
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
import java.util.*;
/*
*需求:ArrayList存储字符串和自定义对象并遍历,加入泛型,并遍历
*/
class ArrayListTest
{
public static void main(String[] args)
{
//创建集合对象并使用泛型
ArrayList<Student> array = new ArrayList<Student>();
//创建元素对象并给值
Student stu1 = new Student("zhangsan",20);
Student stu2 = new Student("lisi",25);
Student stu3 = new Student("wangwu",26);
//把元素对象传给集合对象
array.add(stu1);
array.add(stu2);
array.add(stu3);
//遍历集合 三种方式
//方法一:迭代器 while
Iterator<Student> it = array.iterator();
while(it.hasNext()){
//因为使用了泛型所以不用强转
Student s = it.next();
System.out.println(s.getName()+"------"+s.getAge());
}
System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
//方法二:一般for循环遍历
for(int i = 0 ; i < array.size() ; i++){
Student s = array.get(i);
System.out.println(s.getName()+"--------"+s.getAge());
}
System.out.println("^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^");
//方法三:加强for循环遍历,好处减少代码量
for(Student s : array){
System.out.println(s.getName()+"--------"+s.getAge());
}
}
}
import java.util.*;
class ArrayTest2
{
public static void main(String[] args)
{
//创建集合对象并使用泛型
ArrayList<String> array = new ArrayList<String>();
//给集合对象赋值
array.add("hello");
array.add("world");
array.add("java");
//遍历集合 三种方法
//方法一:迭代器 while
Iterator<String> it = array.iterator();
while(it.hasNext()){
//因为使用了泛型所以不需要不需要强制转换数据类型
String s = it.next();
System.out.println(s);
}
System.out.println("----------------------------------");
//方法二:使用一般for循环迭代集合
for(int i = 0; i < array.size(); i++){
String s = array.get(i);
System.out.println(s);
}
System.out.println("----------------------------------");
//方法三:使用增强for
for(String s:array){
System.out.println(s);
}
}
}
</pre><strong> (3)LinkedList存储字符串和自定义对象并遍历。</strong><pre name="code" class="html">import java.util.*;
class LinkedListTest2
{
public static void main(String[] args)
{
//创建集合对象并使用泛型
LinkedList<String> link = new LinkedList<String>();
//集合对象调add方法并赋值
link.add("hello");
link.add("world");
link.add("java");
//遍历集合---有3种方法
//方法一:迭代器
Iterator<String> it = link.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
System.out.println("-----------------------------");
//方法二:普通for循环
for(int i = 0;i < link.size();i++){
String s = link.get(i);
System.out.println(s);
}
System.out.println("-----------------------------");
//方法三:增强for循环
for(String s : link){
System.out.println(s);
}
}
}
//自定义类Student
class Student
{
//姓名
private String name;
//年龄
private int age;
//无参构造
public Student(){
}
//带参构造
public Student(String name,int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public int getAge(){
return age;
}
public void setAge(int age){
this.age = age;
}
}
import java.util.*;
class LinkedListTest3
{
public static void main(String[] args)
{
//创建集合对象并使用泛型
LinkedList<Student> link = new LinkedList<Student>();
//创建元素对象并赋值
Student stu1 = new Student("zhangsan",20);
Student stu2 = new Student("lisi",25);
Student stu3 = new Student("wangwu",26);
//把元素对象添加进集合对象中
link.add(stu1);
link.add(stu2);
link.add(stu3);
//循环遍历 三种方式
//方法一:迭代
//构建迭代器
Iterator<Student> it = link.iterator();
while(it.hasNext()){
Student s = it.next();
System.out.println(s.getName()+"**********"+s.getAge());
}
System.out.println("------------------");
//方法二:普通for循环
for(int i = 0;i < link.size();i++){
Student s = link.get(i);
System.out.println(s.getName()+"*********"+s.getAge());
}
System.out.println("------------------");
//方法三:增强for循环
for(Student s:link){
System.out.println(s.getName()+"**********"+s.getAge());
}
}
}
用LinkedList模拟栈数据结构。(面试题)
package cn.itcast.homework;
import java.util.LinkedList;
//模拟数据结构栈
public class MyStack {
private LinkedList link;
public MyStack(){
link = new LinkedList();
}
//添加
public void add(Object obj){
link.addFirst(obj);
}
//获取
public Object get(){
return link.removeFirst();
}
//判断
public boolean isEmpty(){
return link.isEmpty();
}
}
package cn.itcast.homework;
//操作MyStack
public class MyStackTest {
/**
* @param args
*/
public static void main(String[] args) {
MyStack m = new MyStack();
m.add("hello");
m.add("java");
m.add("world");
while(!m.isEmpty()){
String s = (String)m.get();
System.out.println(s);
}
}
}
(4)Vector存储字符串和自定义对象并遍历。`
import java.util.*;
class VectorTest
{
public static void main(String[] args)
{
//创建集合对象
Vector<String> v = new Vector<String>();
//调用集合对象的add方法赋值
v.add("hello");
v.add("world");
v.add("java");
//遍历----三种方法
//方法一:迭代器
Iterator<String> it = v.iterator();
while(it.hasNext()){
String s = it.next();
System.out.println(s);
}
System.out.println("---------------------");
//方法二:一般for
for(int i = 0;i < v.size();i++){
String s = v.get(i);
System.out.println(s);
}
System.out.println("---------------------");
//方法三:增强for
for(String s:v){
System.out.println(s);
}
}
}
import java.util.*;
class VectorTest2
{
public static void main(String[] args)
{
//创建集合对象并使用泛型
Vector<Student> v = new Vector<Student>();
//创建元素对象并赋值
Student stu1 = new Student("zhangsan",20);
Student stu2 = new Student("lisi",25);
Student stu3 = new Student("wangwu",24);
//把元素对象添加进集合对象中
v.add(stu1);
v.add(stu2);
v.add(stu3);
//遍历集合---三种方法
//方法一:迭代器
Iterator<Student> it = v.iterator();
while(it.hasNext()){
Student s = it.next();
System.out.println(s.getName()+"*****"+s.getAge());
}
System.out.println("---------------------------");
//方法二:一般for循环遍历
for(int i = 0;i < v.size();i++){
Student s = v.get(i);
System.out.println(s.getName()+"*****"+s.getAge());
}
System.out.println("---------------------------");
//方法三:增强for循环遍历
for(Student s:v){
System.out.println(s.getName()+"*****"+s.getAge());
}
}
}
(5)遍历的方式:
A:迭代器
B:增强for
C:普通for
增强for是用来替代迭代器的。
如果仅仅是遍历,就用A或者B。
如果遍历的时候,需要获取索引就用C。
2.泛型(了解)
(1)一种特殊的数据类型,在实例化类的时候,或者调用方法的时候才明确数据的类型。
(2)格式:
<数据类型>
(3)好处:
A:将运行期间的异常提前到了编译期间
B:避免了强制类型转换
C:优化了程序设计
(4)在哪里用?
自己看API,发现类或者接口后面有<>,最好用泛型。
一般都是在集合中用。
(5)泛型的分类
A:泛型类
B:泛型方法
C:泛型接口
4:增强for(掌握)
(1)一种简单的遍历数组或者Collection集合的方式。
(2)格式:
for(数组或者Collection集合中的元素类型 变量 : 数组或者Collection集合)
{
使用变量即可.
}
注意:
只适合遍历数据,被他用作目标的对象不能使null.