package com.gyd.good; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; /** * Created by Administrator on 2017/7/31. */ public class ArrayListTest { public static void main(String[] args) throws Exception { Goods goods = new Goods(); //从键盘输入 输入流 把从键盘输入的以输入流的形式输入 BufferedReader sr = new BufferedReader(new InputStreamReader(System.in)); while (true) { System.out.println("请按提示选择以下功能"); System.out.println("添加商品按1"); System.out.println("删除商品按2"); System.out.println("查找商品按3"); System.out.println("修改商品按4"); System.out.println("退出按0"); String str = sr.readLine(); if (str.equals("1")) { System.out.println("请输入商品编号:"); int id = Integer.parseInt(sr.readLine()); System.out.println("请输入商品名称"); String name = sr.readLine(); GoodsPojo goodsPojo = new GoodsPojo(name, id); goods.addgoods(goodsPojo); } else if (str.equals("2")) { System.out.println("请输入商品编号"); int id = Integer.parseInt(sr.readLine()); goods.goodsDel(id); } else if (str.equals("3")) { System.out.println("请输入商品编号"); int id = Integer.parseInt(sr.readLine()); goods.goodsSelect(id); } else if (str.equals("4")) { System.out.println("请输入要修改的商品编号"); int id = Integer.parseInt(sr.readLine()); System.out.println("请输入想要要修改的名称"); String name = sr.readLine(); goods.goodsUpdateName(id, name); } else if (str.equals("0")) { System.out.println("谢谢使用"); System.exit(0); } else { System.out.println("输入有误"); } } } } class Goods { private ArrayList aa = null; //当在newGoods对象时,会自动new出ArrayList的对象 Goods() { aa = new ArrayList(); } //添加商品 public void addgoods(GoodsPojo goods) { aa.add(goods); System.out.println("添加新产品成功!!!"); } //查询商品 public void goodsSelect(int id) { for (int i = 0; i < aa.size(); i++) { GoodsPojo goods = (GoodsPojo) aa.get(i); if (goods.getId() == id) { System.out.println("商品名称" + goods.getName() + "商品编号" + goods.getId()); break; } else if (i == aa.size()) { System.out.println("无此商品"); } } } //删除商品 public void goodsDel(int id) { int i; if (aa.size() == 0) { System.out.println("仓库中没有商品"); } for (i = 0; i < aa.size(); i++) { GoodsPojo goods = (GoodsPojo) aa.get(i); if (goods.getId() == i) { aa.remove(i); System.out.println("删除成功"); //break 之后退出 此时再执行的话,i为0,和aa.size相等,始终打印没有此产品 //所以如果要保证没有产品,还需要保证对象的个数不等于0 break; } else if (i == aa.size() && aa.size() != 0) { System.out.println("没有此产品"); } } } //更新商品操作 public void goodsUpdateName(int id, String name) { for (int i = 0; i < aa.size(); i++) { GoodsPojo goods = (GoodsPojo) aa.get(id); if (goods.getId() == id) { goods.setName("小花"); } else if (id == aa.size()) { System.out.println("无此商品"); } } } } LikedList用法:(后进先出 压栈)
package com.gyd.good; import java.util.LinkedList; /** * Created by Administrator on 2017/7/31. */ public class LinkedListTest { public static void main(String[] args) { LinkedList bb=new LinkedList(); GoodsPojo goodsPojo = new GoodsPojo("小花", 22); GoodsPojo goodsPojo1=new GoodsPojo("小刚",33); // bb.addFirst(goodsPojo); // bb.addFirst(goodsPojo1); // for (int i = 0; i < bb.size(); i++) { // System.out.println((GoodsPojo)bb.get(i));后进先出 先打印小刚 再小花 // System.out.println((GoodsPojo)bb.getFirst());只打印小刚 因为小刚永远在第一个 只要没有移除它 // System.out.println((GoodsPojo)bb.getLast());只打印小花 因为小花永远在最后 只要没有移除它 // } //从底部放 bb.addLast(goodsPojo); bb.addLast(goodsPojo1); for (int i = 0; i < bb.size(); i++) { // System.out.println((GoodsPojo)bb.get(i));//先进先出 先小花 后小刚 //System.out.println((GoodsPojo)bb.getFirst());//只打印小花 System.out.println((GoodsPojo)bb.getLast());//只打印小刚 } } }Java中ArrayList和LinkedList的区别:
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。例如我们可以用ArrayList来存储一系列的String或者Integer。那么ArrayList和LinkedList在性能上有什么差别呢?什么时候应该用ArrayList什么时候又该用LinkedList呢?
通过时间复杂度和空间复杂度来进行比较对于排好序的列表,队列表进行二分查找,ArrayList的时间要明显小于LinkedList的时间,二分查找法使用的随机访问(random access)策略,而LinkedList是不支持快速的随机访问的。对一个LinkedList做随机访问所消耗的时间与这个list的大小是成比例的。而相应的,在ArrayList中进行随机访问所消耗的时间是固定的。 对一个列表进行大量的插入和删除操作时,首先要选linkedlist
1.ArrayList 采用的是数组形式来保存对象的,这种方式将对象放在连续的位置中,所以最大的缺点就是插入删除时非常麻烦,LinkedList 采用的将对象存放在独立的空间中,而且在每个空间中还保存下一个链接的索引 但是缺点就是查找非常麻烦 要丛第一个索引开始,对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
可以这样说:当操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
ArrayList更适合读取数据,linkedList更多的时候添加或删除数据。
vector(同ArrayList集合用法近似)
stack(同ArrayLIst集合用法类似)
List集合是线性结构 map集合是图结构
如果用ArrayList集合添加一个相同的对象,可以正常添加 显示两个 会出现数据冗余的问题 List集合不能解决这个问题
HashMap的用法
package com.gyd.good; import java.util.HashMap; import java.util.Iterator; /** * Created by Administrator on 2017/7/31. */ public class HashMapTest { public static void main(String[] args) { HashMap hm=new HashMap(); GoodsPojo goodsPojo = new GoodsPojo("服装", 22); GoodsPojo goodsPojo1=new GoodsPojo("水果",23); hm.put("001",goodsPojo); hm.put("002",goodsPojo1);//键值 唯一 保证数据不冗余 hm.put("002",goodsPojo);//键值一样 后面的会把前面的一个覆盖,保证数据不冗余 /*if (hm.containsKey("003")){//map集合不需要遍历 System.out.println("该商品信息:"); GoodsPojo goods=(GoodsPojo)hm.get("002"); System.out.println(goods.getName()); }else { System.out.println("没有该商品"); }*/ /* for 循环是不可以进行对map集合遍历的 要对map集合所有元素进行遍历,可以使用迭代器 */ //作用是使用迭代器取出map集合的键值 遍历所有元素 Iterator it=hm.keySet().iterator(); while (it.hasNext()){ //tostring方法把键值转换成string类型 String key=it.next().toString(); GoodsPojo goodsPojo2=(GoodsPojo)hm.get(key); System.out.println("商品名称" + goodsPojo2.getName()); } } }HashTable同HashMap用法完全一样
集合类的比较
List集合类和Map集合类的区别:
键值:能唯一标识某一事物的值成为键值(是为了唯一标识事务而单独
添加的属性,一定不要用事务本身的属性来做键值)
List没有键值,Map有键值
ArrayList和HashMap都是线程异步的,所以他们的特点是效率高但是安全性低
Vector和HashTable都是线程同步的,所以他们的特点是效率低但是安全性高
Linked 改快读慢
Array 读快改慢
Hash 两都之间
Collection是集合接口 |————Set子接口:无序,不允许重复。 |————List子接口:有序,可以有重复元素。
区别:Collections是集合类
Set和List对比: Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。 List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。
Set和List具体子类: Set |————HashSet:以哈希表的形式存放元素,插入删除速度很快。
List |————ArrayList:动态数组 |————LinkedList:链表、队列、堆栈。
Array和java.util.Vector Vector是一种老的动态数组,是线程同步的,效率很低,一般不赞成使用。
set集合用法
HashSet 类和 TreeSet 类
“集合框架”支持
Set
接口两种普通的实现:HashSet
和TreeSet
。在更多情况下,您会使用HashSet
存储重复自由的集合。考虑到效率,添加到HashSet
的对象需要采用恰当分配散列码的方式来实现hashCode()
方法。虽然大多数系统类覆盖了Object
中缺省的hashCode()
实现,但创建您自己的要添加到HashSet
的类时,别忘了覆盖hashCode()
。当您要从集合中以有序的方式抽取元素时,TreeSet
实现会有用处。为了能顺利进行,添加到TreeSet
的元素必须是可排序的。 “集合框架”添加对Comparable
元素的支持,在排序的“可比较的接口”部分中会详细介绍。我们暂且假定一棵树知道如何保持java.lang
包装程序器类元素的有序状态。一般说来,先把元素添加到HashSet
,再把集合转换为TreeSet
来进行有序遍历会更快。为优化
HashSet
空间的使用,您可以调优初始容量和负载因子。TreeSet
不包含调优选项,因为树总是平衡的,保证了插入、删除、查询的性能为log(n)
。
HashSet
和TreeSet
都实现Cloneable
接口。import java.util.*; public class SetExample { public static void main(String args[]) { Set set = new HashSet(); set.add("Bernadine"); set.add("Elizabeth"); set.add("Gene"); set.add("Elizabeth"); set.add("Clara"); System.out.println(set); Set sortedSet = new TreeSet(set); System.out.println(sortedSet); } }
运行程序产生了以下输出。请注意重复的条目只出现了一次,列表的第二次输出已按字母顺序排序。
[Gene, Clara, Bernadine, Elizabeth] [Bernadine, Clara, Elizabeth, Gene]