实现Stack—继承Vector(底层原理)
package cn.tedu.stack;
import java.util.Arrays;
import java.util.EmptyStackException;
/**
*@author 作者:
*@version 创建时间:2020年10月21日下午10:02:28
*@description 描述:实现Stack---继承Vector(底层原理)
*/
public class StackDemox {
public static void main(String[] args) {
ListStack list=new ListStack();
list.push("123");
list.push("66");
System.out.println(list);
}
}
class ListStack{
//存储数据的数组
String[] data=new String[10];//默认长度为10
//元素个数及下标
int size=0;
//判断栈是否为空
public boolean empty() {
//判断元素是否为0
return size==0;
}
//获取栈顶元素并不删除----获取的就是数组的最后一个元素
public String peek() {
//判断元素是否为0
if (size<1) {
throw new EmptyStackException();
}
//把数组最后一个元素进行返回
return data[size-1];
}
//获取栈顶元素并删除----获取数组的最后一个元素并删除
public String pop() {
//获取栈顶元素
String str=peek();
//删除数组最后一个元素----栈顶
size--;
//返回栈顶元素
return str;
}
//入栈
public void push(String str) {
//判断是否需要扩容
if (size>=data.length) {//不能指定数组初始长度
data=Arrays.copyOf(data, data.length+data.length);
}
data[size++]=str;
}
//查找
public int search(String str) {
//遍历数组从后往前查找
for (int i = size-1; i >=0;i--) {
if(str==data[i]||str!=null&&str.equals(data[i])) {
//返回新的下标值
return size-i;
}
}
//没有找到
return -1;
}
public String toString() {
//创建StringBuilder的对象
StringBuilder sb=new StringBuilder("[");
//拼接字符串数组中的元素
for (int i = 0; i < size; i++) {//只遍历有元素的下标
//拼接元素
sb.append(data[i]).append(", ");
}
//转成字符串
String s=sb.toString();
//截取字符串,后面的不要了
//判断size是否大于0
if(size>0) {
s=s.substring(0, s.length()-2);
}
/*String s="[";
if(size!=0) {
for (int i = 0; i < size; i++) {
s+=data[i]+", ";
}}*/
return s+"]";
}
}
集合中的上下限
package cn.tedu.typex;
import java.util.ArrayList;
import java.util.List;
/**
*@author 作者:
*@version 创建时间:2020年10月21日下午10:36:21
*@description 描述:
*/
public class TypeDemo3 {
public static void main(String[] args) {
//
List<Integer> list1=new ArrayList<Integer>();
list1.add(113);
list1.add(3);
list1.add(1);
list1.add(1);
list1.add(11);
//
List<Double> list2=new ArrayList<Double>();
list2.add(1.2);
list2.add(3.0);
list2.add(6.3);
list2.add(1.2);
list2.add(1.1);
//List<Number> list=new ArrayList<Number>();//泛型没有向上造型
m(list1);
m(list2);
//m(new ArrayList<String>());//不是数字类型
}
//只遍历数字类型的集合
//数字包装类的统一父类为Number
//<? extends 类/接口>----可以传入的类型包括本类/本接口或者子类以及子接口
//<? extends Number>----可以传入Number类型或者以及Number的子类
//泛型的上限
public static void m(List<? extends Number> list) {//所有元素的数据类型都可以接受
for (Object object : list) {
System.out.println(object);
}
}
//泛型的下限
//传入的类型的最小类型是String
//<? super 类/接口>-----传入的类型要么是本类/本接口或者父类及父接口
//<? super String>
public static void n(List<? super String> list) {//所有元素的数据类型都可以接受
for (Object object : list) {
System.out.println(object);
}
}
}
映射(Map<K,V>)
K键,V键 由键得到值(唯一),键不能重复,把这一对数据(键和值)统称为键值对,一个映射是由多个键值对组成的
为了方便操作键和值,就把键值对抽取成一个类-----Map.Entry,Entry对象是具体的键值对,一个映射可以有多个Entry对象组成的
遍历映射
1、根据键遍历映射
2、根据键值对获取对应的键和值
package cn.tedu.mapx;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
*@author 作者:
*@version 创建时间:2020年10月22日下午8:43:43
*@description 描述:映射
*/
public class MapDemo1 {
public static void main(String[] args) {
//创建映射对象
Map<String, Integer> map=new HashMap<String, Integer>();
//添加元素
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4);
//重复键----覆盖
//map.put("a", 6);
//判断映射是否包含键
//System.out.println(map.containsKey("c"));
//判断映射是否包含值
//System.out.println(map.containsValue(1));
//把映射中的键值对(Entry对象)存放在set集合中进行返回
//Set<Map.Entry<String, Integer>> s=map.entrySet();
//根据键获取值-----键不存在返回null
//System.out.println(map.get("a"));
//返回的所有键存放在Set集合中
//Set<String> set=map.keySet();
//根据键删除键值对
//map.remove("a");
//删除键值对
//同时满足才能删除
map.remove("a", 2);
//把映射的所有值存储到一个集合中进行返回
Collection<Integer> c=map.values();
//输出
System.out.println(map);
}
}
遍历映射
package cn.tedu.mapx;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
*@author 作者:
*@version 创建时间:2020年10月22日下午9:14:33
*@description 描述:
*/
public class MapDemo2 {
public static void main(String[] args) {
//创建映射对象
Map<String, Integer> map=new HashMap<String, Integer>();
//添加元素
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4);
//获取映射中的所有键
Set<String> set=map.keySet();
//遍历键
//1、增强for循环
for (String string : set) {
//由键获取指定值
System.out.println(string+"="+map.get(string));
}
}
}
package cn.tedu.mapx;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/**
*@author 作者:
*@version 创建时间:2020年10月22日下午9:22:40
*@description 描述:
*/
public class MapDemo3 {
public static void main(String[] args) {
//创建映射对象
Map<String, Integer> map=new HashMap<String, Integer>();
//添加元素
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
map.put("d", 4);
//2、获取所有的键值对
Set<Map.Entry<String, Integer>> set=map.entrySet();
//遍历所有的键值对
for (Entry<String, Integer> entry : set) {
//每个entry就是具体的entry对象就是具体的键值对
System.out.println(entry.getKey()+"="+entry.getValue());
}
}
}
练习:
1、通过映射统计一个字符串中所有字符出现的次数
package cn.tedu.mapx;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
*@author 作者:
*@version 创建时间:2020年10月24日下午11:45:27
*@description 描述:统计一个字符串中相同字符出现的次数
*/
public class MapText {
public static void main(String[] args) {
//字符串
String str="wqefdsvsdqvhw";
//创建映射对象---键代表字符 值---字符出现的次数
Map<String, Integer> map=new HashMap<String, Integer>();
//遍历字符串----把字符串中每个字符存入义工社之中
for (int i = 0; i < str.length(); i++) {
//获取到每个字符
//判断要存入的字符是否已经包含了
char c=str.charAt(i);
if(map.containsKey(c+"")) {
//获取上一次这个键对应的值再加1
map.put(c+"", map.get(""+c)+1);
}else {//第一次存入---不包含
map.put(c+"", 1);
}
}
//遍历映射
for (Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey()+"="+entry.getValue());
}
}
}
Map的实现类
1、HashMap
可以允许存储null值和null键,默认初始容量为16,默认扩容是增加一倍,如果指定初始容量,指定的值在2的n次到2的n次加1,那么底层真实的容量就是2的n次加1 异步式线程不安全的集合
2、HashTable
不允许存储null值和null键,默认初始容量是11,默认扩容是增加一倍再加一
11----22+1----46+1,如果指定初始容量底层真实的初始容量就是多少 同步式线程安全的集合
映射是结合? 不是 Java集合类框架(Java Collection Framwork)—集合、映射以及相关的操作类(Collection 、Collection、Map、数组、操作数组、Comparable接口、Iterrator接口……)
File类
File----代表文件或目录的类
练习:
1、删除文件(递归思想)
2、统计工作空间中有多少的.java文件和.class文件
package cn.tedu.file;
import java.io.File;
import java.io.IOException;
/**
*@author 作者:
*@version 创建时间:2020年10月23日下午9:43:06
*@description 描述:
*/
public class FileDemo {
public static void main(String[] args) throws IOException {
//创建File类对象
//在创建对象的过程中不会去检测真实的路径
//只是在根据给定的路径创建对象
File file=new File("D:\\abb");
//创建文件----空文件
//boolean b=file.createNewFile();
//创建目录---文件夹
//不仅可以创建文件夹或者目录还可以创建多级目录
//boolean b=file.mkdirs();
//可以删除文件(有无内容),删除空目录
//直接删除---不会放在回收站中(慎用)
boolean b=file.delete();
System.out.println(b);
}
}
package cn.tedu.file;
import java.io.File;
/**
*@author 作者:
*@version 创建时间:2020年10月23日下午9:32:06
*@description 描述:初识IO
*/
public class FileDemo2 {
public static void main(String[] args) {
//创建文件类对象
File file=new File("D:\\a");
//获取当前目录下的所有文件以及文件夹的信息
File[] fs=file.listFiles();
//遍历数组
for (File f : fs) {
System.out.println(f);
}
//判断是否是文件
System.out.println(file.isFile());
//判断是否是文件夹----目录
System.out.println(file.isDirectory());
}
}
package cn.tedu.file;
import java.io.File;
/**
*@author 作者:
*@version 创建时间:2020年10月23日下午9:54:21
*@description 描述:
*/
public class FileText1 {
public static void main(String[] args) {
//创建对象
File file=new File("D:\\a");
//
deleteFile(file);
}
//删除文件
public static void deleteFile(File file) {
if(file.isDirectory()) {
File[] fs=file.listFiles();
for (File f: fs) {
deleteFile(f);
}
}
//删除文件----删除空目录
file.delete();
}
}
public class FileDemo3 {
public static void main(String[] args) {
//创建文件类对象
File file=new File("D:\\a\\b\\c");
//返回目录或者文件的名称
System.out.println(file.getName());
//返回所在目录的路径
System.out.println(file.getParent());
//返回所在位置的路径以及名称
System.out.println(file.getPath());
}
}
public class FileDemo4 {
public static void main(String[] args) {
//创建文件类对象
File file=new File("D:\\az.txt");
/*
* //返回的是1970年1月1日到现在的毫秒值 //System.out.println(file.lastModified());
* file.setLastModified(324912L);
*/
//输出D盘下名称含有数字的文件或者文件夹
/*
* File[] fs=file.listFiles(new FileFilter() { //匹配规则
*
* @Override public boolean accept(File pathname) { // TODO Auto-generated
* method stub return pathname.getName().matches(".*\\d.*"); } });
*/
//lamda
//File[] fs=file.listFiles(str->str.getName().matches(".*\\d.*"));
//
/*
* File[] fs=file.listFiles(new FilenameFilter() { //匹配规则
*
* @Override public boolean accept(File dir, String name) {
*
* return name.matches(".*\\d.*"); } });
*/
//
//File[] fs=file.listFiles((dir,name)->name.matches(".*\\d.*"));
//遍历数组
/*
* for (File f : fs) { System.out.println(f); }
*/
//重命名----剪切(路径不一样)
file.renameTo(new File("D:\\a\\az.txt"));//文件存储位置
}
}
统计一个目录中.Java文件和.class文件的个数
package cn.tedu.file;
import java.io.File;
/**
*@author 作者:
*@version 创建时间:2020年10月25日上午11:40:22
*@description 描述:统计某一目录里.class文件和.java文件的个数
*/
public class FileText2 {
//统计.java文件
static int countJava;
//统计.class文件
static int countClass;
public static void main(String[] args) {
//
File file=new File("D:\\yy2");
countFile(file);
System.out.println(".java文件个数:"+countJava+".class文件个数:"+countClass);
}
public static void countFile(File file) {
//把当前文件信息调用出来
File[] fs=file.listFiles();
if(file.isDirectory()) {
for (File f : fs) {
countFile(f);
}
}else if(file.getName().endsWith(".java")) {
countJava++;
}else if(file.getName().endsWith(".class")) {
countClass++;
}
}
}