16.01 ArrayList存储字符串并遍历

ArrayList类概述:底层数据结构是数组,查询快,增删慢,线程不安全,效率高

ArrayList类是List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。

例:

 public class Practice
{
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add("hello");
al.add("world");
al.add("java"); Iterator it = al.iterator();
while(it.hasNext())
{
String s = (String)it.next();
System.out.println(s);
}
}
}

16.02 ArrayList存储自定义对象并遍历

例:

 public class Practice
{
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add(new Student("小明",23));
al.add(new Student("小红",15));
al.add(new Student("旺财",16));
al.add(new Student("小强",21));
al.add(new Student("张三",23)); Iterator it = al.iterator();
while(it.hasNext())
{
Student s = (Student)it.next();
System.out.println(s.getName()+":"+s.getAge());
}
}
}

16.03 Vector的特有功能

Vector类概述:底层数据结构是数组,查询快,增删慢,线程安全,效率低

Vector类特有功能

1.  public void addElement(E obj):   

将指定的组件添加到此向量的末尾,将其大小增加 1。  该方法被add()替代

2.  public E elementAt(int index):   

返回指定索引处的组件。    该方法被get()替代

3.  public Enumeration<E> elements():     

返回此向量的组件的枚举。    该方法被Iterator iterator()替代

 

补充知识:JDK升级的原因,安全、效率、简化书写

16.04 LinkedList的特有功能

LinkedList类概述:底层数据结构是链表,查询慢,增删快,线程不安全,效率高

LinkedList类特有功能

1.  public void addFirst(E e):将指定元素插入此列表的开头。

2.  public void addLast(E e):将指定元素添加到此列表的结尾。

3.  public E getFirst():返回此列表的第一个元素。

4.  public E getLast():返回此列表的最后一个元素。

5.  public E removeFirst():移除并返回此列表的第一个元素。

6.  public E removeLast():移除并返回此列表的最后一个元素。

16.05 去除ArrayList集合中的重复字符串元素案例1(两个集合)

去除ArrayList集合中字符串的重复值(字符串的内容相同)

思路:创建两个集合,遍历旧集合获取每一个元素,查看遍历到的元素在新集合中是否存在,存在不操作,不存在存入新集合

 public class Practice
{
public static void main(String[] args)
{
ArrayList al = new ArrayList(); al.add("java");
al.add("hello");
al.add("java");
al.add("world");
al.add("hello");
al.add("java");
//创建新集合
ArrayList newArray = new ArrayList(); Iterator it = al.iterator();
while(it.hasNext())
{
String s = (String)it.next();
if(!newArray.contains(s))
newArray.add(s);
}
//遍历新集合
Iterator newit = newArray.iterator();
while(newit.hasNext())
{
String s = (String)newit.next();
System.out.println(s);
}
}
}

16.06 去除ArrayList集合中的重复字符串元素案例2(单个集合)

去除ArrayList集合中字符串的重复值(字符串的内容相同),要求不能创建新集合

 public class Practice
{
public static void main(String[] args)
{
ArrayList al = new ArrayList(); al.add("java");
al.add("hello");
al.add("java");
al.add("world");
al.add("world");
al.add("world");
al.add("hello");
al.add("java"); for (int i = 0; i < al.size()-1; i++)
{
for (int j = i + 1; j < al.size(); j++)
{
if(al.get(i).equals(al.get(j)))
{
al.remove(j);
j--;
}
}
} Iterator it = al.iterator();
while(it.hasNext())
{
String s = (String)it.next();
System.out.println(s);
}
}
}

16.07 去除ArrayList集合中的重复自定义对象元素案例

去除ArrayList集合中自定义对象的重复值(对象的成员变量值都相同)

 public class Practice
{
public static void main(String[] args)
{
ArrayList al1 = new ArrayList(); al1.add(new Student("小明",23));
al1.add(new Student("小明",23));
al1.add(new Student("小红",15));
al1.add(new Student("旺财",16));
al1.add(new Student("小明",18));
al1.add(new Student("旺财",16));
al1.add(new Student("小强",21)); ArrayList al2 = new ArrayList();
//遍历旧集合
Iterator it = al1.iterator();
while(it.hasNext())
{
Student s = (Student)it.next();
//contains()方法底层依赖的是equals()方法
//Object的equals()方法默认比较的是地址值
//需重写equals()方法
if(!al2.contains(s))
al2.add(s);
}
//遍历新集合
Iterator it2 = al2.iterator();
while(it2.hasNext())
{
Student s = (Student)it2.next();
System.out.println(s.getName()+":"+s.getAge());
}
}
}

运行结果:

小明:23
小红:15
旺财:16
小明:18
小强:21

16.08 用LinkedList实现栈结构的集合代码

LinkedList list = new LinkedList();
list.addFirst("hello");
list.addFirst("world");
list.addFirst("java");
Iterator it = list.iterator();
while(it.hasNext())
{
System.out.println(it.next());
}

16.09 用LinkedList模拟栈数据结构的集合并测试案例

自己定义一个集合类,底层可以使用LinkedList

public class MyStack
{
private LinkedList list;
public MyStack()
{
list = new LinkedList();
}
//添加方法
public void add(Object obj)
{
list.addFirst(obj);
}
//获取方法
public Object get()
{
return list.removeFirst();
}
//判断是否为空方法
public boolean isEmpty()
{
return list.isEmpty();
}
} 测试类:
public class Practice
{
public static void main(String[] args)
{
MyStack ms = new MyStack(); ms.add("hello");
ms.add("world");
ms.add("java"); while(!ms.isEmpty())
{
System.out.println(ms.get());
}
}
}

16.10 泛型概述和基本使用

例:

 public class Practice
{
public static void main(String[] args)
{
ArrayList al = new ArrayList();
al.add("hello");
al.add("world");
al.add("java");//String
al.add(3);//Integer Iterator it = al.iterator();
while(it.hasNext())
{
//ClassCastException
String s = (String)it.next();
System.out.println(s);
}
}
}

上面的代码会报错,因为存储在al集合中的元素有String及Integer类型,在遍历的时候都当做String类型处理,所以报错。如果在创建对象的时候就明确元素的数据类型就不会出现问题了,在Java中这种技术成为泛型。

泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。参数化类型,把类型当作参数一样的传递。

格式:<数据类型>:此处的数据类型只能是引用类型

例:

 public class Practice
{
public static void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();
al.add("hello");
al.add("world");
al.add("java"); Iterator<String> it = al.iterator();
while(it.hasNext())
{
String s = it.next();
System.out.println(s);
}
}
}

好处:

1:把运行时期的问题提前到了编译期间

2:避免了强制类型转换

3:优化了程序设计,解决了黄色警告线

16.11 ArrayList存储字符串并遍历泛型版

 public class Practice
{
public static void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();
al.add("hello");
al.add("world");
al.add("java"); Iterator<String> it = al.iterator();
while(it.hasNext())
{
String s = it.next();
System.out.println(s);
}
System.out.println("-----");
for (int i = 0; i < al.size(); i++)
{
String s = al.get(i);
System.out.println(s);
}
}
}

16.12 ArrayList存储自定义对象并遍历泛型版

 public class Practice
{
public static void main(String[] args)
{
//泛型推断
// ArrayList<Student> al = new ArrayList<>();
ArrayList<Student> al = new ArrayList<Student>(); al.add(new Student("小明",23));
al.add(new Student("小红",15));
al.add(new Student("旺财",16));
al.add(new Student("小强",21)); Iterator<Student> it = al.iterator();
while(it.hasNext())
{
Student s = it.next();
System.out.println(s.getName()+":"+s.getAge());
}
}
}

16.13 通过Object转型问题引入泛型

早期的时候,我们使用Object来代表任意的类型。

向上转型是没有任何问题的,但是在向下转型的时候其实隐含了类型转换的问题。

也就是说这样的程序其实并不是安全的。所以Java在JDK5后引入了泛型,提高程序的安全性。

16.14 泛型类的概述及使用

泛型类:把泛型定义在类上

格式:public class 类名<泛型类型1,...>

注意:泛型类型必须是引用类型

例:

 public class ObjectTool<R>
{
private R obj; public R getObj()
{
return obj;
} public void setObj(R obj)
{
this.obj = obj;
}
}

测试:

ObjectTool<String> ot = new ObjectTool<String>();
ot.setObj("hello");
System.out.println(ot.getObj());

16.15 泛型方法的概述和使用

泛型方法:把泛型定义在方法上

格式:public <泛型类型> 返回类型方法名(泛型类型 ...)

例:

 //泛型方法,参数类型与类的类型一致,类上的是什么类型,方法的参数类型就是什么类型
public void show(R r)
{
System.out.println(r);
}
//泛型方法,参数类型与类的类型不一致,类上的类型与方法的参数类型无关
//该方法可以接受任意类型
public <T> void method(T t)
{
System.out.println(t);
}

测试:

ObjectTool<String> ot1 = new ObjectTool<String>();
ObjectTool<Integer> ot2 = new ObjectTool<Integer>();
ObjectTool<Boolean> ot3 = new ObjectTool<Boolean>();
ot1.show("hello");//类上的是什么类型,方法的参数类型就是什么类型
ot2.show(25);
ot3.show(true);
System.out.println("----");
//类上的类型与方法的参数类型无关
ot1.method("hello");
ot1.method(23);
ot1.method(true);

16.16 泛型接口的概述和使用

泛型接口:把泛型定义在接口上

格式:public  interface 接口名<泛型类型1...>

//泛型接口
public interface Inter<T>
{
public abstract void show(T t);
}
//实现类第一种情况:已经知道是什么类型的
public class InterImpl implements Inter<String>
{
@Override
public void show(String t)
{
System.out.println(t);
}
}
//第一种情况测试:
public class InterDemo
{
public static void main(String[] args)
{
Inter<String> i = new InterImpl();
i.show("hello");
}
}
//实现类第二种情况:还不知道是什么类型的
public class InterImpl<T> implements Inter<T>
{
@Override
public void show(T t)
{
System.out.println(t);
}
}
//第二种情况测试:
public class InterDemo
{
public static void main(String[] args)
{
Inter<String> i1 = new InterImpl<String>();
Inter<Integer> i2 = new InterImpl<Integer>();
i1.show("hello");
i2.show(23);
}
}

16.17 泛型高级之通配符

泛型通配符<?>:     任意类型,如果没有明确,那么就是Object以及任意的Java类了

? extends E:   向下限定,E及其子类

? super E:   向上限定,E及其父类

例:

public class Practice
{
public static void main(String[] args)
{
// 泛型如果明确的写的时候,前后必须一致
Collection<Object> c1 = new ArrayList<Object>();
// Collection<Object> c2 = new ArrayList<Animal>();//错误
// Collection<Object> c3 = new ArrayList<Dog>();//错误
// Collection<Object> c4 = new ArrayList<Cat>();//错误 // ? 表示任意的类型都是可以的
Collection<?> c5 = new ArrayList<Object>();
Collection<?> c6 = new ArrayList<Animal>();
Collection<?> c7 = new ArrayList<Dog>();
Collection<?> c8 = new ArrayList<Cat>(); // ? extends E:向下限定,E及其子类
// Animal及Animal的子类
// Collection<? extends Animal> c9 = new ArrayList<Object>();//错误
Collection<? extends Animal> c10 = new ArrayList<Animal>();
Collection<? extends Animal> c11 = new ArrayList<Dog>();
Collection<? extends Animal> c12 = new ArrayList<Cat>(); // ? super E:向上限定,E及其父类
// Animal及Animal的父类
Collection<? super Animal> c13 = new ArrayList<Object>();
Collection<? super Animal> c14 = new ArrayList<Animal>();
// Collection<? super Animal> c15 = new ArrayList<Dog>();//错误
// Collection<? super Animal> c16 = new ArrayList<Cat>();//错误
}
}
class Animal
{}
class Dog extends Animal
{}
class Cat extends Animal
{}

16.18 增强for的概述和使用

JDK5的新特性:自动拆装箱,泛型,增强for,静态导入,可变参数,枚举

增强for概述:简化数组和Collection集合的遍历

格式:

for(元素数据类型变量 : 数组或者Collection集合)

{使用变量即可,该变量就是元素}

例:

int[] arr = {11,22,33,44,55};
//增强for
for(int x : arr)
{
System.out.println(x);
}

好处:简化遍历

注意事项:增强for的目标要判断是否为null

16.19 ArrayList存储字符串并遍历增强for版

 public class Practice
{
public static void main(String[] args)
{
ArrayList<String> al = new ArrayList<String>();
al.add("hello");
al.add("world");
al.add("java"); for(String str : al)
{
System.out.println(str);
}
}
}

16.20 ArrayList存储自定义对象并遍历增强for版

 public class Practice
{
public static void main(String[] args)
{
ArrayList<Student> al = new ArrayList<Student>(); al.add(new Student("小明",23));
al.add(new Student("小红",15));
al.add(new Student("旺财",16));
al.add(new Student("小强",21)); for(Student s : al)
{
System.out.println(s.getName()+":"+s.getAge());
}
}
}

16.21 静态导入的概述和使用

格式:import static 包名….类名.方法名;可以直接导入到方法的级别

例:

 import static java.lang.Math.abs;
import static java.lang.Math.max;
import static java.lang.Math.pow; public class Practice
{
public static void main(String[] args)
{
System.out.println(abs(-10));
System.out.println(max(20,30));
System.out.println(pow(2,3));
}
}

注意事项:

1.方法必须是静态的

2.如果有多个同名的静态方法,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。

16.22 可变参数的概述和使用

可变参数概述:定义方法的时候不知道该定义多少个参数

格式:修饰符返回值类型方法名(数据类型…  变量名){}

例:

 public class Practice
{
public static void main(String[] args)
{
int result1 = sum(11,22,33);
int result2 = sum(11,22,33,44);
int result3 = sum(11,22,33,44,55);
System.out.println(result1);
System.out.println(result2);
System.out.println(result3);
}
//可变参数,其实就是一个数组
public static int sum(int... a)
{
int result = 0;
for(int x : a)
{
result += x;
}
return result;
}
}

注意:

1.这里的变量其实是一个数组

2.如果一个方法有可变参数,并且有多个参数,那么,可变参数必须是最后一个

16.23 Arrays工具类的asList()方法的使用(数组转集合)

Arrays工具类中的一个方法:public static <T> List<T> asList(T... a)

例:

 public class Practice
{
public static void main(String[] args)
{
String[] strArray = {"hello","world","java"};
List<String> list = Arrays.asList(strArray);
for(String s : list)
{
System.out.println(s);
}
System.out.println("-----");
//可变参数
List<String> list2 = Arrays.asList("hello","world");
for(String s : list2)
{
System.out.println(s);
}
}
}

运行结果:

hello
world
java
-----
hello
World

注意事项:虽然可以把数组转成集合,但是集合的长度不能改变。

16.24 集合嵌套存储和遍历元素的案例代码实现

集合的嵌套遍历ArrayList嵌套ArrayList

 public class Practice
{
public static void main(String[] args)
{
// 创建大集合
ArrayList<ArrayList<Student>> bigArrayList = new ArrayList<ArrayList<Student>>(); //创建第一个集合
ArrayList<Student> al1 = new ArrayList();
al1.add(new Student("小明",23));
al1.add(new Student("小红",12));
al1.add(new Student("小强",26));
al1.add(new Student("旺财",14));
//第一个集合添加到大集合
bigArrayList.add(al1); //创建第二个集合
ArrayList<Student> al2 = new ArrayList();
al1.add(new Student("唐僧",40));
al1.add(new Student("孙悟空",28));
al1.add(new Student("猪八戒",29));
al1.add(new Student("沙僧",27));
//第二个集合添加到大集合
bigArrayList.add(al2); //创建第三个集合
ArrayList<Student> al3 = new ArrayList();
al1.add(new Student("宋江",40));
al1.add(new Student("吴用",35));
al1.add(new Student("高俅",30));
al1.add(new Student("李师师",22));
//第三个集合添加到大集合
bigArrayList.add(al3); // 遍历集合
for (ArrayList<Student> array : bigArrayList)
{
for (Student s : array)
{
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
}

16.25 产生10个1-20之间的随机数要求随机数不能重复案例

 public class Practice
{
public static void main(String[] args)
{
// 创建产生随机数的对象
Random r = new Random(); // 创建一个存储随机数的集合。
ArrayList<Integer> array = new ArrayList<Integer>(); // 定义一个统计变量。从0开始。
int count = 0; // 判断统计遍历是否小于10
while (count < 10)
{
//先产生一个随机数
int number = r.nextInt(20) + 1; //判断该随机数在集合中是否存在。
if(!array.contains(number))
{
//如果不存在:就添加,统计变量++。
array.add(number);
count++;
}
} //遍历集合
for(Integer i : array)
{
System.out.println(i);
}
}
}

16.26 键盘录入多个数据在控制台输出最大值案例

 public class Practice
{
public static void main(String[] args)
{
// 创建键盘录入数据对象
Scanner sc = new Scanner(System.in); // 键盘录入多个数据,不知道多少个,所以用集合存储
ArrayList<Integer> array = new ArrayList<Integer>(); // 以0结束只要键盘录入的数据是0,我就不继续录入数据了
//定义一个记录变量
int count = 1;
while (true)
{
System.out.println("请输入第"+(count++)+"个数据");
int number = sc.nextInt();
if (number != 0)
{
array.add(number);
}
else
break;
} // 把集合转成数组
// public <T> T[] toArray(T[] a)
Integer[] i = new Integer[array.size()];
// Integer[] ii = array.toArray(i);
array.toArray(i);
System.out.println("排序前的数组是:" + arrayToString(i));
// 对数组排序
// public static void sort(Object[] a)
Arrays.sort(i); // 获取该数组中的最大索引的值
System.out.println("排序后的数组是:" + arrayToString(i) + "\r\n"
+"最大值是:"+ i[i.length - 1]);
} //遍历数组的方法
public static String arrayToString(Integer[] i)
{
StringBuilder sb = new StringBuilder(); sb.append("[");
for (int x = 0; x < i.length; x++)
{
if (x == i.length - 1)
{
sb.append(i[x]);
}
else
{
sb.append(i[x]).append(", ");
}
}
sb.append("]");
return sb.toString();
}
}

运行结果:

请输入第1个数据
25
请输入第2个数据
15
请输入第3个数据
45
请输入第4个数据
56
请输入第5个数据
58
请输入第6个数据
48
请输入第7个数据
0
排序前的数组是:[25, 15, 45, 56, 58, 48]
排序后的数组是:[15, 25, 45, 48, 56, 58]
最大值是:58

JavaSE学习总结第16天_集合框架2的更多相关文章

  1. JavaSE学习总结第15天_集合框架1

      15.01 对象数组的概述和使用 public class Student { // 成员变量 private String name; private int age; // 构造方法 publ ...

  2. JavaSE学习总结第17天_集合框架3

      17.01 ArrayList集合的toString()方法源码解析 代码: Collection c = new ArrayList(); c.add("hello"); c ...

  3. JavaSE学习总结第18天_集合框架4

      18.01 Map集合概述和特点 Map接口概述:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值 Map接口和Collection接口的不同 1.Map是双列的,Coll ...

  4. javaSE学习笔记(16)---网络编程

    javaSE学习笔记(16)---网络编程 基本概念 如今,计算机已经成为人们学习.工作.生活必不可少的工具.我们利用计算机可以和亲朋好友网上聊天,也可以玩网游.发邮件等等,这些功能实现都离不开计算机 ...

  5. JavaSE学习总结第27天_反射 & 设计模式 & JDK5、7、8新特性

      27.01  反射_类的加载概述和加载时机 类的加载:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载:就是指将class文件读 ...

  6. Java 学习(16):集合框架

    Java 集合框架 早在Java 2中之前,Java就提供了特设类.比如:Dictionary, Vector, Stack,  Properties 这些类用来存储和操作对象组. 虽然这些类都非常有 ...

  7. Java基础学习(四)-- 接口、集合框架、Collection、泛型详解

    接口 一.接口的基本概念 关键字为:Interface,在JAVA编程语言中是一个抽象类型,是抽象方法的集合.也是使用.java文件编写.   二.接口声明 命名规范:与类名的命名规范相同,通常情况下 ...

  8. Java之旅_高级教_集合框架

    摘自:http://www.runoob.com/java/java-collections.html Java 集合框架 早在Java2之前,java 就提供了特设类.比如:Dictionary,V ...

  9. Java学习日记基础篇(九) —— 集合框架,泛型,异常

    集合框架 有事我们会需要一个能够动态的调整大小的数组,比如说要添加新员工但是数组已经满了,并且数组的大小是在定义的时候定死的,所以我们就需要一个能够动态调整大小的数组或者用链表解决,而java中提供了 ...

随机推荐

  1. SQL 设计心得、逗号分隔列表

    第一: 在开始编码前.主要关注数据库里要保存什么样的数据,以级最佳的数据组织方式和内在关联方式. 第二: 使用你所知的数据库特性尽可能高效的实现数据管理.如正确的索引.数据库类型.高效的select! ...

  2. SQL Server 内存不足引起的并发症

    第一:cpu 1.内存不足就会有频繁的页面调入调出.这个过程是要有cpu的参与的.所以这个要影响cpu! 2.内存不足可能会引有用起执行计划被清除.当起次要执行时.这个就要重编译一次!

  3. oracle 11g RAC Grid Infrastructure

    grid infrastructure 软件介质下载: http://www.oracle.com/technetwork/database/database-technologies/cluster ...

  4. Quick Tip: Outline Elements on Hover

    How to get the xpath by clicking an html element How to get the xpath by clicking an html element Qu ...

  5. poj 2480 (欧拉函数应用)

    点击打开链接 //求SUM(gcd(i,n), 1<=i<=n) /* g(n)=gcd(i,n),根据积性定义g(mn)=g(m)*g(n)(gcd(m,n)==1) 所以gcd(i,n ...

  6. linux之线程之互斥

    线程概述: 其实在Linux中,新建的线程并不是在原先的进程中,而是系统通过一个系统调用clone().该系统copy了一个和原先进程完全一样的进程,并在这 个进程中执行线程函数.不过这个copy过程 ...

  7. ASP.NET性能监视参数详解

    性能监视器- Performance Monitor 性能监视器是Windows自带的系统资源和性能监视工具. 性能监视器能够量化地提供CPU使用率, 内存分配状况, 异常派发情况, 线程调度频率等信 ...

  8. 通过配置Tomcat,让Android真机通过局域网访问PC的文件

    在 Tomcat 根目录,找到conf\server.xml文件. 1.打开server.xml查找修改端口为8080端口: <Connector port="8080" p ...

  9. HTML静态网页(框架)

    1.frameset frameset最外层,使用时需要去除body改用frameset. <frameset  rows="100,*" frameborder=" ...

  10. 帝国cms分页样式修改文件-注意事项

    帝国cms分页样式主要有:内容页分页样式.列表页分页样式以及默认搜索模板使用的搜索样式等几种. 要改这些样式其实也很简单,在网站目录中找到相应的.css文件修改empages属性就行了,但是这样比较麻 ...