集合框架、泛型、迭代(java基础知识十六)
1.ArrayList存储自定义对象并遍历
此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。* ArrayList存储自定义对象并遍历
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("张三",23));
list.add(new Person("李四",24));
list.add(new Person("王五",25));
迭代器
//Iterator
for ( Iterator<Person> i = list.iterator(); i.hasNext(); ) {
Person p = i.next();
System.out.println(p);//输出的是每个对象;
System.out.println(p.getName()+","+p.getAge());//输出对象中的属性值
}
* 普通for
for(int i = 0;i < list.size();i++){
Person p = (Person)list.get(i);//强转
System.out.println(p);//输出每个对象
System.out.println(p.getName()+","+p.getAge());
}
2.Vector的特有功能
* A:Vector类概述
* B:Vector类特有功能
* public void addElement(E obj)//添加一个元素
* public E elementAt(int index)//返回指定索引处的元素
* public Enumeration elements()//迭代
* C:案例演示
* Vector的特有功能演示
* Vector v = new Vector();
v.addElement("my");
v.addElement("girl");
Object obj = v.elementAt(1);
System.out.println(obj);//girl
for(Enumeration e = v.elements();e.hasMoreElements();){
System.out.println(e.nextElement());
}
3.LinkedList的特有功能
* A:LinkedList类概述* 底层数据结构是链表,查找慢,删除快
* B:LinkedList类特有功能
* public void addFirst(E e)及addLast(E e)//在头添加,在尾添加
* public E getFirst()及getLast()//得到头元素,得到尾元素
* public E removeFirst()及public E removeLast()//删除头元素,删除尾元素
* LinkedList list = new LinkedList();
list.addFirst("1");
list.addFirst("2");
System.out.println(list);//[2,1]
list.addLast("3");
list.addLast("4");
System.out.println(list);//[2,1,3,4]
Object obj = list.getFirst();
System.out.println(obj);//
Object obj1 = list.getLast();
System.out.println(obj1);//
Object obj2 = list.removeFirst();
System.out.println(obj2);//
System.out.println(list);
Object obj3 = list.removeLast();
System.out.println(obj3);//
System.out.println(list);//[1,3]
4.去除ArrayList中重复字符串元素方式
需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
思路:创建新集合方式
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("a");
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
ArrayList list2 = getSingle(list);
System.out.println(list2);
}
public static ArrayList getSingle(ArrayList list){
ArrayList list1 = new ArrayList();
for(Iterator i = list.iterator();i.hasNext();){
String str = (String)i.next();
if(!list1.contains(str)){
list1.add(str);
}
}
return list1;
}
需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add(new Person("张三",23));
list.add(new Person("张三",23));
list.add(new Person("李四",24));
list.add(new Person("李四",24));
list.add(new Person("王五",25));
list.add(new Person("王五",25));
ArrayList list2 = getSingle1(list);
System.out.println(list2);//重写equals 方法
}
public static ArrayList getSingle1(ArrayList list){
ArrayList list1 = new ArrayList();
for(Iterator i = list.iterator();i.hasNext();){
Person p = (Person)i.next();
if(!list1.contains(p)){
list1.add(p);
System.out.println(p.getName()+","+p.getAge());
}
}
return list1;
}
* B:注意事项
重写equals()方法的
@Override
public boolean equals(Object obj) {
Person p = (Person)obj;
return this.name.equals(p.name) && this.age == p.age;
}
* contains() 和remove() 方法底层都是依赖于equals()方法,
* 如果没有重写equals()方法,比较的都是地址值。
5.用LinkedList模拟栈数据结构的集合并测试
需求:请用LinkedList模拟栈数据结构的集合,并测试
1.LinkedList list = new LinkedList();
list.addLast("B");//从结尾添加元素,
list.addLast("M");
list.addLast("W");
System.out.println(list);
while(!list.isEmpty()){
list.removeLast();//删除结尾的元素
System.out.println(list);
}
System.out.println(list);
2.测试类:
LinkedList list = new LinkedList();
list.addFirst("B");//从开头添加元素,
list.addFirst("M");
list.addFirst("W");
System.out.println(list);
while(!list.isEmpty()){
list.removeFirst();//删除结尾的元素
System.out.println(list);
}
System.out.println(list);
运行类:
public class Stack {
private LinkedList list = new LinkedList();
//进栈,只需要把元素放进去即可,不需要任何返回类型;
//返回值类型为:void ,参数列表:Object obj--传入任意一个数
public void in(Object obj){
list.addFirst(obj);
}
//出栈,返回的是一个数,类型为:Object ;参数无。
public Object out(){
return list.removeFirst);
}
//判空方法。返回值类型为boolean。
public boolean isEmpty(){
return list.isEmpty();
}
}
6.泛型概述和基本使用
* A:泛型概述 <T>,JDK1.5出现的
* <> 是泛型,里面放的是引用数据类型,因为集合只能存引用数据类型。
* <> 前面加 后面不加 是JDK1.7版本出现,叫做菱形泛型
* B:泛型好处
* 把运行期的错误转换到运行期、不用强转
* C:泛型基本使用
7.ArrayList存储字符串并遍历泛型版
ArrayList<String> list = new ArrayList<>();
list.add("MY");
list.add("B");
list.add("M");
list.add("W");
//不使用泛型
for(Iterator i = list.iterator();i.hasNext();){
String s = (String)i.next();//此处的i.next()接收的是Object类型
System.out.println(s);
}
/*使用泛型,不用强转类型
for(Iterator<String> i = list.iterator();i.hasNext();){
String s = i.next();//此处的i.next()接收的是String类型。
System.out.println(s);
//System.out.println(i.next());//俩句可以换成一句。
}*/
ArrayList存储自定义对象并遍历泛型版
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("张三",23));//此处添加的.add()方法,提示的只接受Person类的对象。
list.add(new Person("李四",24));
list.add(new Person("王五",25));
//非泛型。需要强转。
for (Iterator i = list.iterator(); i.hasNext();) {
Person p = (Person) i.next();
System.out.println(p.getName()+","+p.getAge());
}
/* 泛型的情况。
for (Iterator<Person> i = list.iterator(); i.hasNext();) {
Person p = i.next();//此处直接得到的就是person中的对象。
System.out.println(p.getName()+","+p.getAge());
}*/
8.泛型的由来、泛型类的概述及使用
* 泛型的由来:通过Object转型问题引入
* 早期的Object类型可以接收任意的对象类型,但是在实际的使用中,会有类型转换的问题。也就存在这隐患,所以Java提供了泛型来解决这个安全问题。
* A:泛型类概述
* 把泛型定义在类上
* B:定义格式
* public class 类名<泛型类型1,…>
* public class Tool<W>{}
* 泛型类型在创建对象时才有值。
* C:注意事项
* 泛型类型必须是引用类型
9.泛型方法的概述和使用
* A:泛型方法概述
* 把泛型定义在方法上
* 非静态的方法:public void show(W w){}
* 静态的方法:public static <W>返回值类型 方法名(W w){},静态的方法直接可以用类名.调用,优于对象的创建。
* B:定义格式
* public <泛型类型> 返回类型 方法名(泛型类型 变量名)
10.泛型接口的概述和使用
* A:泛型接口概述
* 把泛型定义在接口上
* B:定义格式
* public interface 接口名<泛型类型>
* interface Inter<T>{
* public abstract void show();
* }
* 1.class Demo implements Inter<String>{//建议开发用,实现接口,已经确定是什么类型了。
* public void show(String s){
* System.out.println(s);
* }
* }
* 2.class Demo<T> implements Inter<T>{//Demo创建对象才实现T
* public void show(T t){
*
* }
* }
11.泛型高级之通配符
* A:泛型通配符<?>//不确定谁来用
* 任意类型,如果没有明确,那么就是Object以及任意的Java类了
* B:? extends E
* 向下限定,E及其子类
* 可以添加E类型以及E的子类型,E是上边界(固定上边界)
* C:? super E
* 向上限定,E及其父类
12.增强for的概述和使用
* A:增强for概述
* 底层就是迭代器实现
* 简化数组和Collection集合的遍历
* B:格式:
for(元素数据类型 变量 : 数组或者Collection集合) {
使用变量即可,该变量就是元素
}
for(临时变量:容器名){
输出临时变量;
}
ArrayList存储字符串并遍历增强for版
ArrayList<String> list = new ArrayList<>();
list.add("MY");
list.add("little");
list.add("girl");
for(String str : list){
System.out.println(str);
}
ArrayList存储自定义对象并遍历增强for版
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("张三",23));
list.add(new Person("李四",24));
list.add(new Person("王五",25));
for (Person p : list) {
//System.out.println(p);
System.out.println(p.getName()+","+p.getAge());
}
13.静态导入的概述和使用
* A:静态导入概述
* 导入的是静态方法,只要是静态方法都能用静态导入,开发严重不推荐,
* B:格式:
* import static 包名….类名.方法名;
* 可以直接导入到方法的级别
* C:注意事项
* 方法必须是静态的,如果有多个同名的静态方法,容易不知道使用谁?这个时候要使用,必须加前缀。由此可见,意义不大,所以一般不用,但是要能看懂。
14.可变参数的概述和使用
* A:可变参数概述
* 其实就是一个可变的数组
* 定义方法的时候不知道该定义多少个参数
* B:格式
* 修饰符 返回值类型 方法名(数据类型… 变量名){}
* C:注意事项:
* 这里的变量其实是一个数组
* 如果一个方法有可变参数,并且有多个参数,那么,可变参数肯定是最后一个
15.Arrays工具类的asList()方法的使用
* A:案例演示
* Arrays工具类的asList()方法的使用
* 将数组转换成集合,转换后的集合不能添加删除里面的元素,
* 必须是引用数据类型的数组,否则会将整个数组当成一个对象,
集合嵌套之ArrayList嵌套ArrayList
ArrayList<ArrayList<Person>> list = new ArrayList<>();
ArrayList<Person> list1 = new ArrayList<>();
list1.add(new Person("张三",23));
list1.add(new Person("李四",24));
list1.add(new Person("王五",25));
ArrayList<Person> list2 = new ArrayList<>();
list2.add(new Person("小张",12));
list2.add(new Person("小李",11));
list2.add(new Person("小王",13));
list.add(list1);//添加集合
list.add(list2);
for(ArrayList<Person>li : list){
for(Person p : li){
System.out.println(p);
}
}
集合框架、泛型、迭代(java基础知识十六)的更多相关文章
- 对象数组、集合、链表(java基础知识十五)
1.对象数组的概述和使用 * 需求:我有5个学生,请把这个5个学生的信息存储到数组中,并遍历数组,获取得到每一个学生信息. Student[] arr = new Student[5]; //存储学生 ...
- java基础(十六)集合(三)
这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...
- java 基础知识十 继承和多态
java 基础知识十 继承和多态 继承 1.定义: 继承是指声明一些类,可以再进一步声明这些类的子类,而子类具有父类已经拥有的一些方法和属性,这跟现实中的父子关系是十分相似的,所以面向对象把这种 ...
- 正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)
1.正则表达式的概述和简单使用 * A:正则表达式(一个字符串,是规则) * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. * B: ...
- Scanner、String(java基础知识十二)
1.Scanner的概述和方法介绍 * A:Scanner的概述 * 是一个从键盘输入的类,有final修饰,不能被子类继承 * Scanner sc = new Scanner(System.in) ...
- 包、修饰符、内部类、匿名内部类(java基础知识十)
1.package关键字的概述及作用 * A:为什么要有包 * 将字节码(.class)进行分类存放 * B:包的概述 * * C:包的作用 * 包名要定义在第一行, ...
- 夯实Java基础(十六)——枚举类的使用
1.枚举类简介 枚举是仅容许特定数据类型值的有限集合.例如我们平时生活中星期一到星期日这七天就是一个特定的有限集合,一年四季的春夏秋冬也同样是的,它们都是枚举.枚举和我们数学中的集合非常相似,如果我们 ...
- Android学习之基础知识十六 — Android开发高级技巧的掌握
一.全局获取Context的技巧 前面我们很多地方都使用到了Context,弹出Toast的时候.启动活动的时候.发送广播的时候.操作数据库的时候.使用通知的时候等等.或许目前来说我们并没有为得不到C ...
- Java基础知识陷阱(六)
本文发表于本人博客. 上次说了下equals跟==的问题,今天再来认识一下这个equals()跟hasCode().上次的代码如下: class Person{ public String name; ...
随机推荐
- uva 10090 二元一次不定方程
Marbles Input: standard input Output: standard output I have some (say, n) marbles (small glass ball ...
- Linux 下MySQL 安装与卸载
这个写的比较好:http://www.cnblogs.com/starof/p/4680083.html 2.卸载系统自带的Mariadb rpm -qa|grep mariadb / ...
- Linux主机被SSH精神病(Psychos)暴力攻破后成为肉鸡的攻防过程
近日公司局域网突然变得非常慢,上网受到很大影响,不仅仅是访问互联网慢,就连访问公司内部服务器都感到异常缓慢.于是对本局域网网关进行测试: $ ping 10.10.26.254 发现延时很大, ...
- jpaRepository findById()数据库有数据却为null
oracle中的char类型用空格自动将字段补成指定的长度, 而varchar2类型不会.大部分情况下设计表字段类型都是varchar2,今天被char坑了一次, findById()始终为空..
- 使用NSOperationQueue简化多线程开发
多线程开发是一件需要特别精心的事情,即使是对有多年开发经验的工程师来说. 为了能让初级开发工程师也能使用多线程,同时还要简化复杂性.各种编程工具提供了各自的办法.对于iOS来说,建议在尽可能的情况下避 ...
- 如何绕过Win8、Win10的systemsetting与注册表校验设置默认浏览器
*本文原创作者:浪子_三少,属Freebuf原创奖励计划,未经许可禁止转载 在win7时我们只需修改注册表就能设置默认浏览器,但是win8.win10下不能直接修改的因为同样的注册表项,win8.wi ...
- 天下文章一大抄 之 修改excel 创建时间
Sub ChangeDate()ThisWorkbook.BuiltinDocumentProperties("Creation Date") = #2 28 2016 13:25 ...
- Linux学习系列之Iptables
iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分.可以直接配置,也可以通过许多前端和图形界面配置. 语法 iptables(选项)(参数) 选项 -t<表&g ...
- 一种排序(nyoj8)(简单排序)
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描写叙述 如今有非常多长方形.每个长方形都有一个编号,这个编号能够反复.还知道这个长方形的宽和长,编号.长.宽都是整数 ...
- 华夏互联总经理汪照发接受程序猿杂志专訪-2014年6月江西IDC排行榜
作为软件开发界最权威的期刊,<程序猿>杂志一直是业界推崇的高端读物,能被其採訪是极大的荣耀. 上个月,作为江西省内的排名第一的站点开发企业和专业的站点研发厂商,Zoomla!逐浪CM ...