javaSE第十六天

第十六天????140

1:List的子类(掌握)????140

(1)List的子类特点????140

(2)ArrayList????141

A:没有特有功能需要学习????141

B:案例????141

a:ArrayList存储字符串并遍历????141

b:ArrayList存储自定义对象并遍历????142

(3)Vector????143

A:有特有功能????143

B:案例????143

a:Vector存储字符串并遍历(与ArrayList案例代码相似)????143

b:Vector存储自定义对象并遍历(与ArrayList案例代码相似)????143

c:Vector的方法演示????143

(4)LinkedList????144

A:有特有功能????144

B:案例????145

a:LinkedList存储字符串并遍历(与ArrayList案例代码相似)????145

b:LinkedList存储自定义对象并遍历(与ArrayList案例代码相似)????145

c:LinkedList方法演示????145

(5)案例:????146

A:去除集合中的多个字符串的重复元素????146

B:去除集合中的多个自定义对象的重复元素????148

C:用LinkedList模拟一个栈数据结构的集合类,并测试。(重点理解)????149

2:泛型(掌握)????151

(1)泛型概述????151

(2)格式:????151

(3)好处:????151

(4)泛型介绍的代码演示????151

(5)泛型的前世今生????152

A:泛型的由来????152

B:泛型类????153

C:泛型方法????153

D:泛型接口????154

E:泛型高级通配符????155

F:案例????157

(6)泛型的应用场景????158

3:增强for循环(掌握)????158

(1)是for循环的一种????158

(2)格式:????158

(3)好处:????159

(4)弊端????159

(5)增强for代码演示????159

4:静态导入(了解)????160

5:可变参数(掌握)????162

(1)应用场景????162

(2)格式????162

(3)Arrays工具类的一个方法????162

asList()把数组转成集合。????162

(4)代码演示????163

6:练习(掌握)????164

A:集合的嵌套遍历????164

B:产生10个1-20之间的随机数,要求随机数不能重复????166

C:键盘录入多个数据,以0结束,并在控制台输出最大值????167

7:要掌握的代码????168

?

?

第十六天

1:List的子类(掌握)
????(1)List的子类特点

????????ArrayList:

????????????底层数据结构是数组,查询快,增删慢

????????????线程不安全,效率高,允许添加null值

????????Vector:

????????????底层数据结构是数组,查询快,增删慢

????????????线程安全,效率低

????????LinkedList:

????????????底层数据结构是链表,查询慢,增删快

????????????线程不安全,效率高,允许添加null值

????(2)ArrayList

????????A:没有特有功能需要学习

说明:ArrayList中允许插入null值,而且可以插入多个,最终集合中存储着所有

????????????????你插入的null

????????B:案例

????????????a:ArrayList存储字符串并遍历

????????????


import java.util.ArrayList;

import java.util.Iterator;

?

/*

* List的子类特点:

* ????????ArrayList:

* ????????????底层数据结构是数组,查询快,增删慢

* ????????????线程不安全,效率高

* ????????Vector:

* ????????????底层数据结构是数组,查询快,增删慢

* ????????????线程安全,效率低

* ????????LinkedList:

* ???????????? 底层数据结构是链表,查询慢,增删快

* ????????????线程不安全,效率高

*

* 案例:

* ????????使用List的任何子类存储字符串或者存储自定义对象并遍历。

*

* ArrayList的使用。????

* ????????存储字符串并遍历

*/

class ArrayListDemo {

????public?static?void main(String[] args) {

????????// 创建集合对象

????????ArrayList?array = new?ArrayList();

?

????????// 创建元素对象,并添加元素

????????array.add("hello");

????????array.add("world");

????????array.add("java");

?

????????// 遍历

????????Iterator?it = array.iterator();

????????while (it.hasNext()) {

????????????String s = (String) it.next();

????????????System.out.println(s);

????????}

?

????????System.out.println("-----------");

?

????????for (int?x = 0; x < array.size(); x++) {

????????????String s = (String) array.get(x);

????????????System.out.println(s);

????????}

????}

}

?

????????????b:ArrayList存储自定义对象并遍历


import java.util.ArrayList;

import java.util.Iterator;

?

/*

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

*/

class ArrayListDemo2 {

????public?static?void main(String[] args) {

????????// 创建集合对象

????????ArrayList?array = new?ArrayList();

?

????????// 创建学生对象

????????Student s1 = new Student("武松", 30);

????????Student s2 = new Student("鲁智深", 40);

????????Student s3 = new Student("林冲", 36);

????????Student s4 = new Student("杨志", 38);

?

????????// 添加元素

????????array.add(s1);

????????array.add(s2);

????????array.add(s3);

????????array.add(s4);

?

????????// 遍历

????????Iterator?it = array.iterator();

????????while (it.hasNext()) {

????????????Student s = (Student) it.next();

????????????System.out.println(s.getName() + "---" + s.getAge());

????????}

?

????????System.out.println("----------------");

?

????????for (int?x = 0; x < array.size(); x++) {

????????????// ClassCastException 注意,千万要搞清楚类型

????????????// String s = (String) array.get(x);

????????????// System.out.println(s);

?

????????????Student s = (Student) array.get(x);

????????????System.out.println(s.getName() + "---" + s.getAge());

????????}

????}

}

?

????(3)Vector

????????A:有特有功能

????????????a:添加

????????????????public
synchronized
void addElement(E obj)????????--????被add()替代

向集合中添加一个元素

????????????b:获取

????????????????public
synchronized E elementAt(int
index)????????--????被get()替代

????????????????获取指定位置的元素

????????????????public Enumeration<E> elements()????-- 被iterator()替代

????????????????返回集合中所有的元素

????????B:案例

????????????a:Vector存储字符串并遍历(与ArrayList案例代码相似)

????????????b:Vector存储自定义对象并遍历(与ArrayList案例代码相似)

c:Vector的方法演示


import java.util.Enumeration;

import?java.util.Vector;

?

/*

* Vector的特有功能:

* 1:添加功能

* ????????public void addElement(Object obj)????????--????add()

* 2:获取功能

* ????????public Object elementAt(int index)????????-- get()

* ????????public Enumeration elements()????????????--????Iterator iterator()

* ????????????????boolean hasMoreElements()????????????????hasNext()

* ????????????????Object nextElement()????????????????????next()

*

* JDK升级的原因:

* ????????A:安全

* ????????B:效率

* ????????C:简化书写

*/

class VectorDemo {

????public?static?void main(String[] args) {

????????// 创建集合对象

????????Vector?v = new?Vector();

?

????????// 添加功能

????????v.addElement("hello");

????????v.addElement("world");

????????v.addElement("java");

?

????????// 遍历

????????for (int?x = 0; x < v.size(); x++) {

????????????String s = (String) v.elementAt(x);

????????????System.out.println(s);

????????}

?

????????System.out.println("------------------");

?

????????Enumeration?en = v.elements(); // 返回的是实现类的对象

????????while (en.hasMoreElements()) {

????????????String s = (String) en.nextElement();

????????????System.out.println(s);

????????}

????}

}

?

????(4)LinkedList

????????说明:LinkedList允许插入null值,而且可以插入多个null值,最终集合中存储着你插入的所有null值

????????A:有特有功能????

????????????a:添加

????????????????public
void addFirst(E e):在集合的头部添加一个元素

????????????????public
void addLast(E e):在集合的尾部添加一个元素

????????????b:删除

????????????????public E removeFirst():删除集合中第一个元素,并返回被删除的元素

????????????????public E removeLast():删除集合中最后一个元素,并返回被删除的元素

????????????c:获取

????????????????public E getFirst():获取集合中的第一个元素

????????????????public E getLast():获取集合中的最后一个元素

????????B:案例

????????????a:LinkedList存储字符串并遍历(与ArrayList案例代码相似)

????????????b:LinkedList存储自定义对象并遍历(与ArrayList案例代码相似)

c:LinkedList方法演示


import?java.util.LinkedList;

?

/*

* LinkedList的特有功能:

* ????????A:添加功能

* ????????????public void addFirst(Object e) :在集合的头部添加一个元素

* ????????????public void addLast(Object e) :在集合的末尾添加一个元素

* ????????B:获取功能

* ????????????public Object getFirst() :获取集合中的第一个元素

* ????????????public Obejct getLast() :获取集合中的最后一个元素

* ????????C:删除功能

* ????????????public Object removeFirst():删除集合中的第一个元素,并返回被删除的元素

* ????????????public Object removeLast():删除集合中的最后一个元素,并返回被删除的元素

*/

class LinkedListDemo {

????public?static?void main(String[] args) {

????????// 创建集合对象

????????LinkedList?link = new?LinkedList();

?

????????// 添加元素

????????link.add("hello");

????????link.add("world");

????????link.add("java");

?

????????// public void addFirst(Object e) :在集合的头部添加一个元素

????????// link.addFirst("javaee");

????????// public void addLast(Object e) :在集合的末尾添加一个元素

????????// link.addLast("android");

?

????????// public Object getFirst() :获取集合中的第一个元素

????????// System.out.println("getFirst:" + link.getFirst());

????????// public Obejct getLast() :获取集合中的最后一个元素

????????// System.out.println("getLast:" + link.getLast());

?

????????// public Object removeFirst():删除集合中的第一个元素,并返回被删除的元素

????????System.out.println("removeFirst:" + link.removeFirst());

????????// public Object removeLast():删除集合中的最后一个元素,并返回被删除的元素

????????System.out.println("removeLast:" + link.removeLast());

?

????????// 输出对象名

????????System.out.println("link:" + link);

????}

}

?

????(5)案例:

????????A:去除集合中的多个字符串的重复元素

????????????如果字符串的内容相同,即为重复元素

????????????方式一:用新集合存储未重复元素


import java.util.ArrayList;

import java.util.Iterator;

?

/*

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

*

* 分析:

* ????????A:创建集合对象

* ????????B:添加多个字符串元素(包含内容相同的)

* ????????C:创建新集合

* ????????D:遍历旧集合,获取得到每一个元素

* ????????E:拿这个元素到新集合去找,看有没有

* ????????????有:不搭理它

* ????????????没有:就添加到新集合

* ????????F:遍历新集合

*/

class ArrayListDemo {

????public?static?void main(String[] args) {

????????// 创建集合对象

????????ArrayList?array = new?ArrayList();

?

????????// 添加多个字符串元素(包含内容相同的)

????????array.add("hello");

????????array.add("world");

????????array.add("java");

????????array.add("world");

????????array.add("java");

????????array.add("world");

????????array.add("world");

????????array.add("world");

????????array.add("world");

????????array.add("java");

????????array.add("world");

?

????????// 创建新集合

????????ArrayList?newArray = new?ArrayList();

?

????????// 遍历旧集合,获取得到每一个元素

????????Iterator?it = array.iterator();

????????while (it.hasNext()) {

????????????String s = (String) it.next();

?

????????????// 拿这个元素到新集合去找,看有没有

????????????if (!newArray.contains(s)) {

????????????????newArray.add(s);

????????????}

????????}

?

????????// 遍历新集合

????????for (int?x = 0; x < newArray.size(); x++) {

????????????String s = (String) newArray.get(x);

????????????System.out.println(s);

????????}

????}

}

????
?

方式二:在老集合上面进行重复元素的删除


import java.util.ArrayList;

import java.util.Iterator;

?

/*

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

* 要求:不能创建新的集合,就在以前的集合上做。

*/

class ArrayListDemo2 {

????public?static?void main(String[] args) {

????????// 创建集合对象

????????ArrayList?array = new?ArrayList();

?

????????// 添加多个字符串元素(包含内容相同的)

????????array.add("hello");

????????array.add("world");

????????array.add("java");

????????array.add("world");

????????array.add("java");

????????array.add("world");

????????array.add("world");

????????array.add("world");

????????array.add("world");

????????array.add("java");

????????array.add("world");

?

????????// 由选择排序思想引入,我们就可以通过这种思想做这个题目

????????// 拿0索引的依次和后面的比较,有就把后的干掉

????????// 同理,拿1索引...

????????for (int?x = 0; x < array.size() - 1; x++) {

????????????for (int?y = x + 1; y < array.size(); y++) {

????????????????if (array.get(x).equals(array.get(y))) {

????????????????????array.remove(y);

????????????????????//说明:因为如果一个字符串相连重复出现的话,就会造成,

????????????????????//初始字符串与后续相同的字符串进行比较时,相同就删除,

????????????????????//该元素被删除之后,后一个相同的元素,就会顶替被删除元素,

????????????????????//并占有它的索引,所以会导致出现漏网之鱼的情况

????????????????????y--;// 这里是关键点

????????????????}

????????????}

????????}

?

????????// 遍历集合

????????Iterator?it = array.iterator();

????????while (it.hasNext()) {

????????????String s = (String) it.next();

????????????System.out.println(s);

????????}

????}

}

?

????????B:去除集合中的多个自定义对象的重复元素

????????????如果自定义对象的成员变量值都相同,即为重复元素


import java.util.ArrayList;

import java.util.Iterator;

?

/*

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

* 要求:不能创建新的集合,就在以前的集合上做。

*/

class ArrayListDemo2 {

????public?static?void main(String[] args) {

????????// 创建集合对象

????????ArrayList?array = new?ArrayList();

?

????????// 添加多个字符串元素(包含内容相同的)

????????array.add("hello");

????????array.add("world");

????????array.add("java");

????????array.add("world");

????????array.add("java");

????????array.add("world");

????????array.add("world");

????????array.add("world");

????????array.add("world");

????????array.add("java");

????????array.add("world");

?

????????// 由选择排序思想引入,我们就可以通过这种思想做这个题目

????????// 拿0索引的依次和后面的比较,有就把后的干掉

????????// 同理,拿1索引...

????????for (int?x = 0; x < array.size() - 1; x++) {

????????????for (int?y = x + 1; y < array.size(); y++) {

????????????????if (array.get(x).equals(array.get(y))) {

????????????????????array.remove(y);

????????????????????//说明:因为如果一个字符串相连重复出现的话,就会造成,

????????????????????//初始字符串与后续相同的字符串进行比较时,相同就删除,

????????????????????//该元素被删除之后,后一个相同的元素,就会顶替被删除元素,

????????????????????//并占有它的索引,所以会导致出现漏网之鱼的情况

????????????????????y--;// 这里是关键点

????????????????}

????????????}

????????}

?

????????// 遍历集合

????????Iterator?it = array.iterator();

????????while (it.hasNext()) {

????????????String s = (String) it.next();

????????????System.out.println(s);

????????}

????}

}

?

????????C:用LinkedList模拟一个栈数据结构的集合类,并测试。(重点理解)

????????????你要定义一个集合类,只不过内部可以使用LinkedList来实现。


import java.util.LinkedList;

?

/*

*请用LinkedList模拟栈数据结构的集合,并测试

*题目的意思是:

*????????你自己的定义一个集合类,在这个集合类内部可以使用LinkedList模拟。

*/

?

/*

* MyStack的测试

*/

class MyStackDemo {

????public?static?void main(String[] args) {

????????// 创建集合对象

????????MyStack ms = new MyStack();

?

????????// 添加元素

????????ms.add("hello");

????????ms.add("world");

????????ms.add("java");

?

????????// System.out.println(ms.get());

????????// System.out.println(ms.get());

????????// System.out.println(ms.get());

????????// NoSuchElementException

????????// System.out.println(ms.get());

?

????????while (!ms.isEmpty()) {

????????????System.out.println(ms.get());

????????}

????}

}

?

/**

* 自定义的栈集合 模拟了栈先进后出的特点,但是底层任然是调用 LinkedList类的方法

*

* @author
风清扬

* @version V1.0

*/

class MyStack {

????private?LinkedList?link;

?

????public MyStack() {

????????link = new?LinkedList();

????}

?

????public?void add(Object obj) {

????????link.addFirst(obj);

????}

?

????public Object get() {

????????// return link.getFirst();

????????return?link.removeFirst();

????}

?

????public?boolean isEmpty() {

????????return?link.isEmpty();

????}

}

?

2:泛型(掌握)
????(1)泛型概述

????????是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。

????(2)格式:

????????<数据类型>

????????注意:该数据类型只能是引用类型。

????(3)好处:

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

????????B:避免了强制类型转换

????????C:优化了程序设计,解决了黄色警告线问题,让程序更安全

(4)泛型介绍的代码演示

import java.util.ArrayList;

import java.util.Iterator;

?

/*

* ArrayList存储字符串并遍历

*

* 我们按照正常的写法来写这个程序, 结果确出错了。

* 为什么呢?

* ????????因为我们开始存储的时候,存储了String和Integer两种类型的数据。

* ????????而在遍历的时候,我们把它们都当作String类型处理的,做了转换,所以就报错了。

* 但是呢,它在编译期间却没有告诉我们。

* 所以,我就觉得这个设计的不好。

* 回想一下,我们的数组

* ????????String[] strArray = new String[3];

* ????????strArray[0] = "hello";

* ????????strArray[1] = "world";

* ????????strArray[2] = 10;

* 集合也模仿着数组的这种做法,在创建对象的时候明确元素的数据类型。这样就不会在有问题了。

* 而这种技术被称为:泛型。

*

* 泛型:是一种把类型明确的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型。

参数化类型,把类型当作参数一样的传递。

* 格式:

* ????????<数据类型>

* ????????此处的数据类型只能是引用类型。

* 好处:

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

* ????????B:避免了强制类型转换

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

*/

class GenericDemo {

????public?static?void main(String[] args) {

????????// 创建

????????ArrayList<String> array = new ArrayList<String>();

?

????????// 添加元素

????????array.add("hello");

????????array.add("world");

????????array.add("java");

????????// array.add(new Integer(100));

????????// array.add(10); // JDK5以后的自动装箱

????????// 等价于:array.add(Integer.valueOf(10));

?

????????// 遍历

????????Iterator<String> it = array.iterator();

????????while (it.hasNext()) {

????????????// ClassCastException

????????????// String s = (String) it.next();

????????????String s = it.next();

????????????System.out.println(s);

????????}

?

????????// 看下面这个代码

????????// String[] strArray = new String[3];

????????// strArray[0] = "hello";

????????// strArray[1] = "world";

????????// strArray[2] = 10;

????}

}

?

????(5)泛型的前世今生

????????A:泛型的由来

????????????Object类型作为任意类型的时候,在向下转型的时候,会隐含一个转型问题

????????B:泛型类

????????????泛型定义在类上面


?

/*

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

*/

class?ObjectTool<T> {

????private T obj;

?

????public T getObj() {

????????return?obj;

????}

?

????public?void setObj(T obj) {

????????this.obj = obj;

????}

}

?

/*

* 泛型类的测试

*/

class ObjectToolDemo {

????public?static?void main(String[] args) {

?

????????ObjectTool<String> ot = new?ObjectTool<String>();

????????// ot.setObj(new Integer(27)); //这个时候编译期间就过不去

????????ot.setObj(new String("林青霞"));

????????String s = ot.getObj();

????????System.out.println("姓名是:" + s);

?

????????ObjectTool<Integer> ot2 = new?ObjectTool<Integer>();

????????// ot2.setObj(new String("风清扬"));//这个时候编译期间就过不去

????????ot2.setObj(new Integer(27));

????????Integer i = ot2.getObj();

????????System.out.println("年龄是:" + i);

????}

}

?

????????C:泛型方法


/*

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

*/

class ObjectTool {

????public <T> void show(T t) {

????????System.out.println(t);

????}

}

?

/*

* 泛型方法的测试

*/

class ObjectToolDemo {

????public?static?void main(String[] args) {

????????// ObjectTool ot = new ObjectTool();

????????// ot.show("hello");

????????// ot.show(100);

????????// ot.show(true);

?

????????// ObjectTool<String> ot = new ObjectTool<String>();

????????// ot.show("hello");

????????//

????????// ObjectTool<Integer> ot2 = new ObjectTool<Integer>();

????????// ot2.show(100);

????????//

????????// ObjectTool<Boolean> ot3 = new ObjectTool<Boolean>();

????????// ot3.show(true);

?

????????// 如果还听得懂,那就说明泛型类是没有问题的

????????// 但是呢,谁说了我的方法一定要和类的类型的一致呢?

????????// 我要是类上没有泛型的话,方法还能不能接收任意类型的参数了呢?

?

????????// 定义泛型方法后

????????ObjectTool ot = new ObjectTool();

????????ot.show("hello");

????????ot.show(100);

????????ot.show(true);

????}

}

?

????????D:泛型接口


/*

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

*/

interface?Inter<T> {

????public?abstract?void show(T t);

}

?

//实现类在实现接口的时候

//第一种情况:已经知道是什么类型的了(说明;这种情况很罕见)

?

//public class InterImpl implements Inter<String> {

//

//[email protected]

//????public void show(String t) {

//????????System.out.println(t);

//????}

//}

?

//第二种情况:还不知道是什么类型的(说明:这种情况比较常见)

class InterImpl<T> implements?Inter<T> {

?

????@Override

????public?void show(T t) {

????????System.out.println(t);

????}

}

?

class InterDemo {

????public?static?void main(String[] args) {

????????// 第一种情况的测试

????????// Inter<String> i = new InterImpl();

????????// i.show("hello");

?

????????// 第二种情况的测试

????????Inter<String> i = new InterImpl<String>();

????????i.show("hello");

?

????????Inter<Integer> ii = new InterImpl<Integer>();

????????ii.show(100);

????}

}

?

????????E:泛型高级通配符

?????????????:任意类型,如果没有明确,那么就是Object以及任意的java类

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

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


import java.util.ArrayList;

import java.util.Collection;

?

/*

* 泛型高级(通配符)

* ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了

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

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

*/

class GenericDemo {

????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及其子类

????????//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极其父类

????????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 {

}

?

F:案例

1集合存储自定义对象,遍历,要求使用泛型

????????????????????


import java.util.ArrayList;

import java.util.Iterator;

?

/*

* 需求:存储自定义对象并遍历。

*

* A:创建学生类

* B:创建集合对象

* C:创建元素对象

* D:把元素添加到集合

* E:遍历集合

*/

class ArrayListDemo2 {

????public?static?void main(String[] args) {

????????// 创建集合对象

????????// JDK7的新特性:泛型推断。

// 但是我不建议这样使用。

????????// ArrayList<Student> array = new ArrayList<>();

????????

????????ArrayList<Student> array = new ArrayList<Student>();

?

????????// 创建元素对象

????????Student s1 = new Student("曹操", 40); // 后知后觉

????????Student s2 = new Student("蒋干", 30); // 不知不觉

????????Student s3 = new Student("诸葛亮", 26);// 先知先觉

?

????????// 添加元素

????????array.add(s1);

????????array.add(s2);

????????array.add(s3);

?

????????// 遍历

????????Iterator<Student> it = array.iterator();

????????while (it.hasNext()) {

????????????Student s = it.next();

????????????System.out.println(s.getName() + "---" + s.getAge());

????????}

????????System.out.println("------------------");

?

????????for (int?x = 0; x < array.size(); x++) {

????????????Student s = array.get(x);

????????????System.out.println(s.getName() + "---" + s.getAge());

????????}

????}

}

?

????(6)泛型的应用场景

????????一般是在集合中使用。


import java.util.ArrayList;

import java.util.Iterator;

?

/*

* 泛型在哪些地方使用呢?

* ????????看API,如果类,接口,抽象类后面跟的有<E>就说要使用泛型。

????????一般来说就是在集合中使用。

*/

class ArrayListDemo {

????public?static?void main(String[] args) {

????????// 用ArrayList存储字符串元素,并遍历。用泛型改进代码

????????ArrayList<String> array = new ArrayList<String>();

?

????????array.add("hello");

????????array.add("world");

????????array.add("java");

?

????????Iterator<String> it = array.iterator();

????????while (it.hasNext()) {

????????????String s = it.next();

????????????System.out.println(s);

????????}

????????System.out.println("-----------------");

?

????????for (int?x = 0; x < array.size(); x++) {

????????????String s = array.get(x);

????????????System.out.println(s);

????????}

????}

}

?

????

3:增强for循环(掌握)
????(1)是for循环的一种
????(2)格式:

????????for(元素的数据类型 变量名 : 数组或者Collection集合的对象) {

????????????使用该变量即可,该变量其实就是数组或者集合中的元素。

????????}

????(3)好处:

????????简化了数组和集合的遍历

????(4)弊端

????????增强for循环的目标不能为null。建议在使用前,先判断是否为null。

(5)增强for代码演示

????


import java.util.ArrayList;

import java.util.List;

?

/*

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

*

* 增强for:是for循环的一种。

*

* 格式:

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

*????????????使用变量即可,该变量就是元素

* ????}

*

* 好处:简化了数组和集合的遍历。

*

* 弊端: 增强for的目标不能为null。

* 如何解决呢?对增强for的目标先进行不为null的判断,然后在使用。

*/

class ForDemo {

????public?static?void main(String[] args) {

????????// 定义一个int数组

????????int[] arr = { 1, 2, 3, 4, 5 };

????????for (int?x = 0; x < arr.length; x++) {

????????????System.out.println(arr[x]);

????????}

????????System.out.println("---------------");

????????// 增强for

????????for (int?x : arr) {

????????????System.out.println(x);

????????}

????????System.out.println("---------------");

????????// 定义一个字符串数组

????????String[] strArray = { "林青霞", "风清扬", "东方不败", "刘意" };

????????// 增强for

????????for (String s : strArray) {

????????????System.out.println(s);

????????}

????????System.out.println("---------------");

????????// 定义一个集合

????????ArrayList<String> array = new ArrayList<String>();

????????array.add("hello");

????????array.add("world");

????????array.add("java");

????????// 增强for

????????for (String s : array) {

????????????System.out.println(s);

????????}

????????System.out.println("---------------");

?

????????List<String> list = null;

????????// NullPointerException

????????// 这个s是我们从list里面获取出来的,在获取前,它肯定还好做一个判断

????????// 说白了,这就是迭代器的功能

????????if (list != null) {

????????????for (String s : list) {

????????????????System.out.println(s);

????????????}

????????}

?

????????// 增强for其实是用来替代迭代器的

????????//ConcurrentModificationException

????????// for (String s : array) {

????????// if ("world".equals(s)) {

????????// array.add("javaee");

????????// }

????????// }

????????// System.out.println("array:" + array);

????}

}

?

?

?

4:静态导入(了解)

????(1)可以导入到方法级别的导入

????(2)格式:

????????import static 包名....类名.方法名;

????(3)注意事项:

????????A:方法必须是静态的

????????B:如果多个类下有同名的方法,就不好区分了,还得加上前缀。

????????????所以一般我们并不使用静态导入,但是一定要能够看懂。

????


/*

* 静态导入:

* 格式:import static 包名….类名.方法名;

* 可以直接导入到方法的级别

*

* 静态导入的注意事项:

* ????????A:方法必须是静态的

* ????????B:如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀。

????????????由此可见,意义不大,所以一般不用,但是要能看懂。

*/

import?static?java.lang.Math.abs;

import?static java.lang.Math.pow;

import?static java.lang.Math.max;

?

//错误

//import static java.util.ArrayList.add;

?

class StaticImportDemo {

????public?static?void main(String[] args) {

????????// System.out.println(java.lang.Math.abs(-100));

????????// System.out.println(java.lang.Math.pow(2, 3));

????????// System.out.println(java.lang.Math.max(20, 30));

????????// 太复杂,我们就引入到import

?

????????// System.out.println(Math.abs(-100));

????????// System.out.println(Math.pow(2, 3));

????????// System.out.println(Math.max(20, 30));

????????// 太复杂,有更简单

?

//????????System.out.println(abs(-100));

????????System.out.println(java.lang.Math.abs(-100));

????????System.out.println(pow(2, 3));

????????System.out.println(max(20, 30));

????}

????

????public?static?void abs(String s){

????????System.out.println(s);

????}

}

?

5:可变参数(掌握)
(1)应用场景

如果我们在写方法的时候,参数个数不明确,就应该定义可变参数。

(2)格式

????????修饰符 返回值类型 方法名(数据类型... 变量) {}

????????

????????注意:

????????????A:该变量其实是一个数组名

????????????B:如果一个方法有多个参数,并且有可变参数,可变参数必须在最后

(3)Arrays工具类的一个方法

????????asList()把数组转成集合

????????注意:这个集合的长度不能改变。


import java.util.Arrays;

import java.util.List;

?

/*

* 把数组转化成集合,转化之后的集合的长度不能改变。

* public static <T> List<T> asList(T... a):把数组转成集合

*

* 注意事项:

* ????????虽然可以把数组转成集合,但是集合的长度不能改变。

*/

class ArraysDemo {

????public?static?void main(String[] args) {

????????// 定义一个数组

????????// String[] strArray = { "hello", "world", "java" };

????????// List<String> list = Arrays.asList(strArray);

?

????????List<String> list = Arrays.asList("hello", "world", "java");

????????

????????//不支持增加和删除,但可以修改

????????// list.add("javaee");// UnsupportedOperationException

????????// list.remove(1);// UnsupportedOperationException

????????list.set(1, "javaee");

?

????????for (String s : list) {

????????????System.out.println(s);

????????}

????}

}

?

(4)代码演示

/*

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

* 格式:

* ????????修饰符
返回值类型
方法名(数据类型… 变量名){

*

* ????????}

*

* ????????注意:

* ????????????这里的变量其实是一个数组

* ????????????如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个

*/????????????????

class ArgsDemo {

????public?static?void main(String[] args) {

????????// 2个数据求和

????????int?a = 10;

????????int?b = 20;

????????int?result = sum(a, b);

????????System.out.println("result:" + result);

?

????????// 3个数据的求和

????????int?c = 30;

????????result = sum(a, b, c);

????????System.out.println("result:" + result);

?

????????// 4个数据的求和

????????int?d = 30;

????????result = sum(a, b, c, d);

????????System.out.println("result:" + result);

?

????????// 需求:我要写一个求和的功能,到底是几个数据求和呢,

????????//我不太清楚,但是我知道在调用的时候我肯定就知道了

????????// 为了解决这个问题,Java就提供了一个东西:可变参数

????????result = sum(a, b, c, d, 40);

????????System.out.println("result:" + result);

?

????????result = sum(a, b, c, d, 40, 50);

????????System.out.println("result:" + result);

????}

?

????public?static?int sum(int... a) {

????????// System.out.println(a);

????????//return 0;

?

????????int?s = 0;

????????

????????for(int?x : a){

????????????s +=x;

????????}

????????

????????return?s;

????}

?

????// public static int sum(int a, int b, int c, int d) {

????// return a + b + c + d;

????// }

????//

????// public static int sum(int a, int b, int c) {

????// return a + b + c;

????// }

????//

????// public static int sum(int a, int b) {

????// return a + b;

????// }

}

?

6:练习(掌握)
????A:集合的嵌套遍历

import java.util.ArrayList;

?

/*

* 集合的嵌套遍历

* 需求:

* ????????我们班有学生,每一个学生是不是一个对象。所以我们可以使用一个集合表示我们班级的学生。ArrayList<Student>

* ????????但是呢,我们旁边是不是还有班级,每个班级是不是也是一个ArrayList<Student>。

* ????????而我现在有多个ArrayList<Student>。也要用集合存储,怎么办呢?

* ????????就是这个样子的:ArrayList<ArrayList<Student>>

*/

class ArrayListDemo {

????public?static?void main(String[] args) {

????????// 创建大集合

????????ArrayList<ArrayList<Student>> bigArrayList = new ArrayList<ArrayList<Student>>();

?

????????// 创建第一个班级的学生集合

????????ArrayList<Student> firstArrayList = new ArrayList<Student>();

????????// 创建学生

????????Student s1 = new Student("唐僧", 30);

????????Student s2 = new Student("孙悟空", 29);

????????Student s3 = new Student("猪八戒", 28);

????????Student s4 = new Student("沙僧", 27);

????????Student s5 = new Student("白龙马", 26);

????????// 学生进班

????????firstArrayList.add(s1);

????????firstArrayList.add(s2);

????????firstArrayList.add(s3);

????????firstArrayList.add(s4);

????????firstArrayList.add(s5);

????????// 把第一个班级存储到学生系统中

????????bigArrayList.add(firstArrayList);

?

????????// 创建第二个班级的学生集合

????????ArrayList<Student> secondArrayList = new ArrayList<Student>();

????????// 创建学生

????????Student s11 = new Student("诸葛亮", 30);

????????Student s22 = new Student("司马懿", 28);

????????Student s33 = new Student("周瑜", 26);

????????// 学生进班

????????secondArrayList.add(s11);

????????secondArrayList.add(s22);

????????secondArrayList.add(s33);

????????// 把第二个班级存储到学生系统中

????????bigArrayList.add(secondArrayList);

?

????????// 创建第三个班级的学生集合

????????ArrayList<Student> thirdArrayList = new ArrayList<Student>();

????????// 创建学生

????????Student s111 = new Student("宋江", 40);

????????Student s222 = new Student("吴用", 35);

????????Student s333 = new Student("高俅", 30);

????????Student s444 = new Student("李师师", 22);

????????// 学生进班

????????thirdArrayList.add(s111);

????????thirdArrayList.add(s222);

????????thirdArrayList.add(s333);

????????thirdArrayList.add(s444);

????????// 把第三个班级存储到学生系统中

????????bigArrayList.add(thirdArrayList);

?

????????// 遍历集合

????????for (ArrayList<Student> array : bigArrayList) {

????????????for (Student s : array) {

????????????????System.out.println(s.getName() + "---" + s.getAge());

????????????}

????????}

????}

}

?

????B:产生10个1-20之间的随机数,要求随机数不能重复

import java.util.ArrayList;

import java.util.Random;

?

/*

* 获取10个1-20之间的随机数,要求不能重复

*

* 用数组实现,但是数组的长度是固定的,长度不好确定。

* 所以我们使用集合实现。

*

* 分析:

* ????????A:创建产生随机数的对象

* ????????B:创建一个存储随机数的集合。

* ????????C:定义一个统计变量。从0开始。

* ????????D:判断统计变量是否小于10

* ????????????是:先产生一个随机数,判断该随机数在集合中是否存在。

* ????????????????????如果不存在:就添加,统计变量++。

* ????????????????????如果存在:就不搭理它。

* ????????????否:不搭理它

* ????????E:遍历集合

*/

class RandomDemo {

????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);

????????}

????}

}

?

????C:键盘录入多个数据,以0结束,并在控制台输出最大值

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Scanner;

?

/*

* 键盘录入多个数据,以0结束,要求在控制台输出这多个数据中的最大值

*

* 分析:

* ????????A:创建键盘录入数据对象

* ????????B:键盘录入多个数据,我们不知道多少个,所以用集合存储

* ????????C:以0结束,这个简单,只要键盘录入的数据是0,我就不继续录入数据了

* ????????D:把集合转成数组

* ????????E:对数组排序

* ????????F:获取该数组中的最大索引的值

*/

class ArrayListDemo {

????public?static?void main(String[] args) {

????????// 创建键盘录入数据对象

????????Scanner sc = new Scanner(System.in);

?

????????// 键盘录入多个数据,我们不知道多少个,所以用集合存储

????????ArrayList<Integer> array = new ArrayList<Integer>();

?

????????// 以0结束,这个简单,只要键盘录入的数据是0,我就不继续录入数据了

????????while (true) {

????????????System.out.println("请输入数据:");

????????????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(i);

????????// System.out.println(ii);

?

????????// 对数组排序

????????// public static void sort(Object[] a)

????????Arrays.sort(i);

?

????????// 获取该数组中的最大索引的值

????????System.out.println("数组是:" + arrayToString(i) + "最大值是:"

????????????????+ 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();

????}

}

?

????

7:要掌握的代码

????集合存储元素,加入泛型,并可以使用增强for遍历。

时间: 2024-10-13 11:42:27

javaSE第十六天的相关文章

javaSE第二十六天

第二十六天????414 1:网络编程(理解)????414 (1)网络编程:用Java语言实现计算机间数据的信息传递和资源共享????414 (2)网络编程模型????414 (3)网络编程的三要素????414 (4)网络编程中主要类介绍:????416 A:InetAddress: 此类表示互联网协议 (IP) 地址.????416 B:????UDP协议下的Socket对象类DatagramSocket????418 1.发送端:????418 2.接收端:????419 C:????T

第十五天和十六天学习笔记

第十五天学习笔记: 主要学习了HTML5: 1 <!DOCTYPE html> <!--文档类型声明--> 2 <html> 3 <head> 4 <title>学习HTML5</title> 5 <meta charset = "UTF-8"> 6 </head> 7 <body> 8 <p>学习html5</p> 9 </body> 10

安卓第十六天笔记-音频与视频播放

安卓第十六天笔记-音频与视频播放 音频与视频播放 1.音频 播放应用资源中的音乐 应用中的音乐一般放在res/raw目录下 /** * 播放应用资源中的音乐 * * @param v */ public void player1(View v) { // 设置播放数据源 MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.gm); // 不需要准备,create,创建完成直接可以使用播放 mediaPlayer.start(); }

Training的第十六天

今天知道了很多也学会了很多.从哲学层面和行业层面粗略了解了一下IT这个大的体系.哲学层面从价值的角度来阐释了IT的发展对人类社会产生的影响,在以后的编写程序中,要形成一个价值观:编写的这个程序怎样才能产生最大的价值.这就需要我掌握更加多的知识,例如传输协议,用户界面设计,人机交互,代码的维护等等.罗马不是一天建成的,所以我也需要慢慢学习其他的知识并在其中发现自己的长处.因为一个好的程序,需要考虑的东西太多了,人需要知识广泛,但是也需要精通一门技术.一个好的产品在它的背后都有一个强大的团队. 今后

第二十六天 蛰伏的Hibernate遇到春日的暖阳 —Spring MVC 集成Hibernate使用(一)

6月7日,晴."纷纷红紫已成尘,布谷声中夏令新.夹路桑麻行不尽,始知身是太平人."        Hibernate和Spring的香艳相逢,不仅是Bean和Bean之间电光火石般的碰撞,也是XML和XML之间的萍水聚首.两种奇妙的架构,携手闯荡江湖,不仅塑造了依赖注入淋漓酣畅的快感,也让J2EE蹿红大半个地球. 第二十六天 蛰伏的Hibernate遇到春日的暖阳 -Spring MVC 集成Hibernate使用(一)

UI学习笔记---第十六天XML JSON解析

一.解析的基本概念 从事先规定好的格式中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据,数据方按照格式获取数据 常见解析方式XML解析JSON解析 二.XML:可扩展标记语言 XML数据格式的功能:数据交换 web服务  内容管理  用作配置文件 一对标签称为一个节点  节点可以包含节点   没有子节点叫叶子节点  只有一个根节点  节点可以相互嵌套 三.进行XML解析时使用到的SAX工具 SAX:Simple API for XML  基于事件驱动的解析方式,逐行解析数据.(

IT十八掌掌第十六天课程总结

今天学完IT十八掌第十六天java基础课程: 学习内容: 序列化 ---------------- 将对象用于网络间传输或者本次化存储. 也叫串行化 过程将java对象转换成byte[] java.io.Serializable    //可串行化接口,标识性.JVM. 串行化版本UID :            // 深度复制是指将整个对象图进行复制. transient :                //临时关键字. ObjectInputStream / ObjectOuputStre

python入门第二十六天--网络通信

网络编程 自从互联网诞生以来,现在基本上所有的程序都是网络程序,很少有单机版的程序了. 计算机网络就是把各个计算机连接到一起,让网络中的计算机可以互相通信.网络编程就是如何在程序中实现两台计算机的通信. 举个例子,当你使用浏览器访问新浪网时,你的计算机就和新浪的某台服务器通过互联网连接起来了,然后,新浪的服务器把网页内容作为数据通过互联网传输到你的电脑上. 由于你的电脑上可能不止浏览器,还有QQ.Skype.Dropbox.邮件客户端等,不同的程序连接的别的计算机也会不同,所以,更确切地说,网络

孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5

孤荷凌寒自学python第六十六天学习mongoDB的基本操作并进行简单封装5并学习权限设置 (完整学习过程屏幕记录视频地址在文末) 今天是学习mongoDB数据库的第十二天. 今天继续学习mongoDB的简单操作,并继续对一些可能反复经常使用的操作进行简单的封装.同时通过搜索了解了如何对本地Mongo数据库进行权限设置(没有实践本地数据库的用户权限设置.) 按个人规划,今天是初步了解学习MongoDb数据库的最后一个学习日,后续将在真正使用此数据库时,再对其进行深入研究. 一.今天完成了两个可