javaSE(集合操作队列栈,Map,少量io文件操作)

泛型在集合中的引用
泛型是在JavaSe5.0引入的特征,泛型的本质是参数化类型,接口和方法的定义中
所操纵的数据类型被传入的参数指定

java泛型机制广泛的应用在集合框架中,所有的集合类型都带有泛型参数,这样在创建集合时
可以指定放入集合中元素的类型,java编译器可以据此进行类型检查,这样可以减少代码在运行时出现
错误的可能性

ArrayList类的定义中,<E>中的E为泛型参数,在创建对象是可以将类型作为参数传递,此时
类定义所有的E将被替换成传入的参数
public class ArrayList<E>{
public boolean add(E e){........}
public E get(index a){..........}
}

List<String> list = new ArrayList<String>
list.add("one");
list.add(100);java编译器类型检查错误,此时add方法应该传入的参数为String

集合操作----线性表
List接口是Collection的子接口,用于定义线性表数据结构,可以将List理解为存放对象的数组
只不过其元素个数可以动态的增加或减少.

List接口的两个实现类:ArrayList和LinkedList,分别用动态数组和链表的形式实现了List接口

get和set
List除了继承Collection定义的方法外,还根据其线性表的数据结构定义了一系列的方法
其中最常用的就是基于下标的个体和set方法

E get(int  index)
获取集合总指定下标对应的元素,下标从0开始

E set(int  index,E element)
将给定的元素存入给定的位置,并将原位置的元素返回

插入和删除
List根据下标的操作还支持插入和删除操作
void add(int  index,E element)
将给定的元素插入到指定位置,原位置及后续元素顺序都向后移动

E remove(int index)
删除给定位置的元素

subString()
List和数组之间的相互转换
数组的排序

comparable接口以及comparator接口

队列和栈
队列(Queue):先进先出
栈:先进后出     如果将Deque限制为只能从一段入队和出队,则可以实现"栈"stack的数据结构
队列(Queue)是常用的数据结构,可以将队列看成特殊的线性表.队列限制了对线性表的访问方式
只能从线性表的一端添加(offer)元素,从另一端取出(poll)表
队列所遵循的原则:先进先出(FTFO First input First Output) 高速路上有一个隧道

JDK提供了Queue的接口,同时使用LinkedList实现了该接口.(选择LinkedList的原因在于Queue经常
需要进行添加和删除操作,而LinkedList在这方面效率高)

Queue接口中的主要方法如下:
boolean offer(E e):将一个对象添加至队尾,如果添加成功则返回true,否则false
E poll();从队首删除并返回一个元素.
E peek();返回队首元素(但并不删除)

Queue<String> queue = new LinkedList<String>();
        queue.offer("a");
        queue.offer("b");
        queue.offer("c");
        queue.offer("d");
        System.out.println(queue);//[a, b, c, d]
        
        String a = queue.peek();
        while(queue.size()>0){
            System.out.println(queue.poll());//先进先出
        }
栈:先进后出

Deque  先进后出
Deque是Queue的子接口,定义了所谓"双端队列" 即从队列的两端分别可以入队和出队
LinkedList也实现了这个接口

如果将Deque限制为只能从一段入队和出队,则可以实现"栈"stack的数据结构,对于栈而言
入栈称之为push,出现称之为pop

栈遵循先进后出的原则.

Deque<String> stack = new LinkedList<String>();
        stack.push("A");
        stack.push("B");
        stack.push("C");
        stack.push("D");
        System.out.println(stack);
        
        while(stack.size()>0){
            System.out.println(stack.pop());
        }
        System.out.println(stack);
查询表
Map()接口
Map接口定义的集合(查询包),用于存储所谓的"key-value"映射对,key可以看成是value的索引,
作为key的对象在集合中不可以重复

根据数据结构不同,Map接口的实现类很多,其中常用的有内部为hash表实现的HashMap
和内部为排序二叉树实现的TreeMap.

put()方法
Map接口定义了向map中存放元素的put方法:
V put(K key,V value)
将Key-Value对存入Map,如果在集合中已经包含该Key则操作将替换掉该Key所对应的value值
返回该key原来所对应的值value.(如果没有则返回null)

get()方法:
Map接口中定义了从Map中获取元素的个体方法
V get(Object key)
返回参数key所对应的Value对象,如果不存在则返回null(这里指的是key不存在则返回null)

containsKey()方法
 Map接口中定义了判断某个key是否存在Map中存放
 --boolean containsKey(Object key);
 诺Map中包含给定的key则返回true,否则返回false

如何创建:
Map<String,Integer> map = new HashMap<String,Integer>(); 

练习:检测北京各个站点,某一天中PM2.5的最高的浓度
要求使用Map,并且值记录最高的浓度

    Map<String, Integer> map = new HashMap<String, Integer>();

    public void main02(String str) {

        String[] q = str.split("[=,]");//[0-9]
        //        System.out.println(Arrays.toString(q));
        for (int i = 0; i < q.length; i += 2) {
            if (!map.containsKey(q.length)) {
                if (!map.containsKey(q.length) || Integer.parseInt(q[i + 1]) > map.get(q[i])) {
                    map.put(q[i], Integer.parseInt(q[i + 1]));
                }
            }
        }
        System.out.println(map);
    }

    public static void main(String[] args) {
        String map1 = "通州=208,永乐街=200,昌周=222,地坛=100";
        String map2 = "通州=408,永乐街=100,昌周=222,地坛=100";
        Main02 m = new Main02();
        m.main02(map1);
        m.main02(map2);
    }


有序Map
LinkedHashMap实现有序的Map
使用Map接口的哈希表和链表实现,具有可预知的迭代顺序,此实现与HashMap的不同之处在于
LinkedHashMap维护者一个双循环链表,此链表定义了迭代顺序
该迭代顺序通常就是存储元素的顺序.

遍历map
使用keySet()方法
Map提供了3种遍历方式
遍历所有的key-value对
遍历所有的value(不常用)
        
遍历所有key的方法
Set(K) keySet();        
该方法会将当前Map中所有的key存入有个Set集合后返回.

使用entrySet()方法;
Set<Entry<K,V>> entrySet();
该方法会将当前Map中每一组key-value对封装为一个Entry对象并存入Set集合后返回
Map<Integer,String> map = new HashMap<Integer,String>();
        map.put(0, "1");
        map.put(1, "2");
        map.put(2, "3");
//        String is = map.get(1);
//        map.keySet();
//        Boolean t = map.containsKey(4);
//        System.out.println(t);
        Set<Integer> set = map.keySet();
        for(Integer s:set){
            System.out.println(s+","+map.get(s));
        }
        Set<Entry<Integer, String>>  str = map.entrySet();
        for(Entry<Integer, String> s:str){
            System.out.print(s.getKey()+","+s.getValue()+"  ");
        }
文件操作:
File对象
1.java.io.File用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上文件和目录.
2.File类只能用于表示文件(目录)的信息(名称,大小等),不能对文件的内容进行访问
3.构造方法
-File(String path/name)
-通过将给定路径名字符字符串转换成抽象路径来创建一个新File实例
-抽象路径名应劲量使用相对路径,并且目录的层级分离符不要直接写"/"或"\"
应使用File.separator这个常量表示,以避免不同系统带来的差异.

练习:查看一个文件的大小
查看当前工程下demo文件下的HelloWorld.txt的文件大小

File(File parent,String child)
File还提供了另一个构造方法.
-根据parent抽象路径和child路径名字符串创建一个新File实例
File f = new File("demo");
File f1 = new File(f,"hello.txt");//demo/hello.txt

isFile()方法
.File的isFile()方法用于判断当前File对象所表示的是否为一个文件
-boolean isFile()
返回值:当前File对象所表示是一个文件是返回true

length()方法
File()length方法用于返回此抽象路径名表示的文件的长度(占用字节量)
-返回值:当前File对象所表示的文件所占用的字节量

exist()方法
File()的exist()方法用于测试此抽象路径名表示的文件或目录是否存在
-Boolean exist()
-返回值:诺该File表示的文件或目录存在则返回true,否则返回false

createNewFile()方法
File的createNewFile方法用于当且仅当不存在具有此抽象路径名指定的名称的文件时,
原子地创建由此抽象路径名指定的一个新的空文件
Boolean createNewFile
-返回值:如果指定的文件不存在并成功的创建,则返回true;如果指定的文件已经存在,则返回false

作业:在当前工程目录下创建一个新的空文件.命名为Test.txt.
要求使用File对象的第二种构造方法

File f = new File("demo");
        File f1 = new File(f,"Test.txt");
        if(!f1.exists()){
            try {
                f1.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值