首页 文章 精选 留言 我的

精选列表

搜索[天玑9500],共10000篇文章
优秀的个人博客,低调大师

阿里云与天猫双11这十年

2009年,发生了两件看似不起眼的事。 初春刚过,阿里云在北京一栋没有暖气的写字楼写下了飞天第一行代码。 同年11月11日,淘宝商城启动了一个叫做双11的促销活动。 谁也没想到,多年以后他们会是现在这模样。 前传 2007年淘宝的交易额突破了400亿,技术团队却喜忧参半:现有集中式架构已经捉襟见肘,该如何应对? 随即启动的分布式改造获得巨大成功,淘宝所有的业务都做了模块化。 尽管这次技术升级在现在看来存在诸多局限性:更多的是为了应对不断增多的图片缓存,在CDN端对海量的图片缓存做了一些限流操作。但就是这次改造成就了历史上第一个双11,2009年双11当天的流量达到了一个高峰,在旧的架构体系下,这几乎是一项不可能完成的任务。 一年后,飞天的第一个版本上线,仅有几十台机器的集群开始服务第一个内部客户——阿里金融。 这些探索让所有人看到了一个趋势:用分布

优秀的个人博客,低调大师

2018-06-08 第三十三天

一、RandomAccessFile java.io.RandomAccessFile:随机存取文件。这个功能很强大,可以随机跳着读写。 importjava.io.RandomAccessFile; publicclassRandomAccessFileTest { publicstaticvoidmain(String[] args) throwsException { test1(); test2(); } //往指定的文件中写入三个学生的信息。 staticvoidtest1() throwsException{ RandomAccessFile raf= newRandomAccessFile("./res/students.txt", "rw"); raf.seek(40);//可以来回跳 // raf.skipBytes(n)//只能往前跳 raf.writeUTF("小明"); raf.writeInt(21); raf.writeInt(90); raf.seek(0); //每个人的信息占用的字节数为20 raf.writeUTF("小刚"); raf.writeInt(20); raf.writeInt(100); //跳到第20个字节开始继续写 raf.seek(20); raf.writeUTF("小花"); raf.writeInt(17); raf.writeInt(99); raf.close(); } //读取学生的信息 staticvoidtest2() throwsException{ RandomAccessFile raf= newRandomAccessFile("./res/students.txt", "r"); raf.seek(20); System.out.println(raf.readUTF()); System.out.println(raf.readInt()); System.out.println(raf.readInt()); raf.seek(0); System.out.println(raf.readUTF()); System.out.println(raf.readInt()); System.out.println(raf.readInt()); raf.close(); } } 二、ObjectInputStream-ObjectOutputStream 对象字节输入输出流。 需求:将一个内存中的对象写入到一个本地文件中。实现对对象的持久化存储。还要将磁盘中的文件中保存的对象数据,还原到内存中对象数据来。 importjava.io.BufferedInputStream; importjava.io.BufferedOutputStream; importjava.io.FileInputStream; importjava.io.FileOutputStream; importjava.io.ObjectInputStream; importjava.io.ObjectOutputStream; importjava.io.Serializable; publicclassObjectStreamTest { publicstaticvoidmain(String[] args) throwsException { writeObj(); readObj(); } //将一个Student 对象写入到指定的文件中,持久化存储 staticvoidwriteObj() throwsException{ ObjectOutputStream oos= newObjectOutputStream(newBufferedOutputStream(newFileOutputStream("./res/student.obj"))); // Student student= newStudent("小刚", 19, Gender.MALE); oos.writeInt(10); oos.writeObject(student); oos.close(); } //将一个文件中的对象数据,还原到程序的内存中。 staticvoidreadObj() throwsException{ ObjectInputStream ois= newObjectInputStream(newBufferedInputStream(newFileInputStream("./res/student.obj"))); System.out.println(ois.readInt()); Student student= (Student)ois.readObject(); System.out.println(student); ois.close(); } } classStudent implementsSerializable{ /** * 最好将类型信息版本号显式的定义 */ privatestaticfinallongserialVersionUID= 1L; privateString name; privateintage; privatetransientGender gender; privateintscore; privateBook book= newBook("鲁滨逊漂流记"); publicStudent() { System.out.println("Student.Student()"); } Student(String name, intage, Gender gender) { super(); System.out.println("Student.Student()"); this.name= name; this.age= age; this.gender= gender; } @Override publicString toString() { return"Student [name="+ name+ ", age="+ age+ ", gender="+ gender+ ", score="+ score+ "]"; } } classBookimplementsSerializable{ privateString name; publicBook(String name) { this.name= name; } } enumGender{ FEMALE,MALE } 三、序列化 --- 反序列化 序列化:将内存中的对象,转换为字节数组的过程。称为对象的序列化。 字节数组包含的内容:对象的类型信息。属性的类型信息。还包含了用于将字节数据还原为对象的信息。 反序列化:将字节数组还原为对象的过程。反序列化。 作用: 1:对象的持久化存储。 2:可以在网络中传输对象,网络中传输的都是字节信息。必须将对象序列化之后传输过去,对方收到字节数据之后再反序列化,得到对象的信息。 1:如果一个对象可以被序列化和反序列化,那么该对象的类型 必须 实现 接口 java.io.Serializable.该接口是一个空接口,标记性接口。 类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化。可序列化类的所有子类型本 身都是可序列化的。序列化接口没有方法或字段,仅用于标识可序列化的语义。 2:反序列化 还原对象的时候,并不会调用对象类中的构造方法。所有对象的生成的过程,全部依赖于序列化的字节数据。 3:如果想反序列化成功,那么被序列化的时候类中的 serialVersionUID 字段的值,必须和 反序列化的时候,类中的serialVersionUID 值相同。不然会抛出 类型版本号不一致的异常,导致不能反序列化成功。 所以建议,在序列化的类中,显式的定义serialVersionUID值,指定一个随意的long类型的值即可。 private static final long serialVersionUID= 1L; 4:静态的类的成员变量是不会被序列化的。因为不再对象的内部,依赖于类存在的。 5:如果类中的某些实例变量也不想被序列化,那么将 该实例成员 使用关键字transient修饰即可。 如果一个实例变量,被transient修饰,那么被反序列化的时候,该字段的值是该类型的 默认值。 6:如果一个对象可以被序列化,那么该对象的所有的成员都必须是可以被序列化的。基本数据类型可以直接被序列化,那么引用数据类型必须实现接口Serializable。 7:如果想将字节数据反序列化成功,那么字节码中的类型信息(包名+类名)必须和本地的一致。还有的类型的版本号必须一致。 四、ByteArrayInputStream --- ByteArrayOutputStream 字节数组输入输出流。 如何将一个对象的序列化之后的字节数组得到? 1:将对象序列化到一个文件中。 2:然后再使用字节流读取出来就行了。 作用:1:ByteArrayOutputStream可以将任意类型的数据 得到对应的字节数组形式。 2:ByteArrayInputStream可以将 字节数组中包含的我们需要的类型的信息,还原回来。 ByteArrayOutputStream流中包含的字节数组信息,这个流关闭之后,ByteArrayOutputStream对象中包含的字节数组仍然可以获得。 importjava.io.BufferedInputStream; importjava.io.BufferedOutputStream; importjava.io.ByteArrayInputStream; importjava.io.ByteArrayOutputStream; importjava.io.FileOutputStream; importjava.io.ObjectInputStream; importjava.io.ObjectOutputStream; publicclassByteArrayStreamTest { publicstaticvoidmain(String[] args) throwsException { test(); } staticvoidtest() throwsException{ //将写出的数据,写出到了baos对象中的字节数组中了。 ByteArrayOutputStream baos= newByteArrayOutputStream(); ObjectOutputStream oos= newObjectOutputStream(newBufferedOutputStream(baos)); oos.writeInt(10); oos.writeObject(newStudent("小明",21,Gender.MALE)); oos.flush(); //关闭之后,baos对象仍然可以使用。 oos.close(); byte[] array= baos.toByteArray(); System.out.println(array.length); //以字节数组为数据源读取数据 ByteArrayInputStream bais= newByteArrayInputStream(array); ObjectInputStream ois= newObjectInputStream(newBufferedInputStream(bais)); System.out.println(ois.readInt()); System.out.println(ois.readObject()); ois.close(); } } IO体系及总结 1:对文件读写操作 读取文件的内容: 1:如果是文本文件 new BufferedReader(new FileReader(file)); readLine();方法 2: 非文本文件 new BufferedInputStream(new FileInputStream(file)); read(byte[]);方法 往文件中写数据: 1:文本数据: new BufferedWriter(new FileWriter(file,append)); write(String);方法 newLine();方法 2:字节数据: new BufferedOutputStream(newFileOutputStream(file,append)); wirete(byte[]);方法 flush();方法 2 : 使用流接收键盘输入的信息 new BufferedReader(new InputStreamReader(System.in)); readLine(); 3: 想对八种基本数据类型进行读写,还可以包括 String DataInputStream、DataOutputStream 4:对对象进行序列化和反序列化 ObjectInputStream、ObjectOutputStream 5:内存和内存之间的数据的交互。 想操作的数据和 字节数组之间的相互的转换。 ByteArrayInputStream ByteArrayOutputStream 6:如果想将字符序列使用指定的字符集编码为字节数据 OutputStreamWriter 进程和线程 1:程序 是一个静态的概念。 是一系列 计算机指令的集合。 2:进程:是一个动态的概念,程序的一次执行,会产生一个进程。或者进程可以看作是运行的程序。 进程特点: 1:进程可以并发(不是并行执行)执行。 并行执行:两个程序在同一个时间一起被执行。 2:进程是cpu和操作系统 进行资源分配的最小单元。 当程序执行的时候,进程被创建,然后系统会对该进程分配只供它自己使用的资源,多个进程之间不共享资源。 3:线程:是进程中的一条完整的执行的路径。可以看作是进程中的一条任务线程。 进程是运行的程序,进程是为了完成某些任务的。 1:进程可以看作是一个线程的容器,所有进程中的任务都是依赖于进程中的线程来完成的。 2:一个进程中至少要包含一个线程。 3:一个进程中可以包含多个线程,那么这多个线程就共享了所在的进程的资源。 4:一个进程中的第一个线程,称为是主线程。java 中的主线程 是 main 线程。 5:线程可以并发执行。一个进程中可以同时运行多个线程。 举个栗子: 把进程看作高速公路,把线程看作高速公路上的车道。 把一个车道看作一个线程。 进程和线程的关系: 1:线程是不能独立存在的,必须在进程中存活。 2:进程的所有的任务都依赖于进程中的线程来完成。 3:进程是线程的载体,线程负责完成进程的任务。 4:一个进程可以有任意个线程,至少一个线程。第一个线程称为主线程。 java 中的第一个线程为main线程。 5:进程是cpu进行资源分配的最小单位。 6:线程是cpu进行调度执行的最小单位。 7:可以将线程看作轻量级的进程。系统创建进程,销毁进程 都会消耗比较大的资源。但是创建线程,销毁线程消耗资源比较小。 8:一个进程中的所有的线程共享所在进程的资源。 ​​​​​​​ 单线程程序的问题: 1:如果程序中存在阻塞式方法。。nextInt,线程就被阻塞了。程序就不能继续执行了。 2:多线程程序中,如果一个线程被阻塞了,其他的线程不受任何的影响。 在java 中提供了类 java.lang.Thread 用来描述线程对象。 java 中被执行的代码,都是被某一个线程执行的。 A; 是一条代码语句,那么当前线程的意思,就是执行 A 语句的线程对象。 java 中创建线程的方式:3种方式。 1:继承 java.lang.Thread 类。 2:实现java.lang.Runnable 接口。 3: 实现 java.util.concurrent.Callable.(jdk 1.5之后出现的)。 /** * 使用继承线程类的方式,实现创建线程 * */ publicclassMyThreadTest { //main 主线程执行的主体代码就是main 方法的方法体。 publicstaticvoidmain(String[] args) { //先创建一个自定义线程对象 MyThread thread= newMyThread(); //启动线程对象,开始执行run。通过调用线程对象的start 方法启动线程,千万不要调用run 方法。 thread.start(); //主线程完成的任务也是不断累加 intcounter= 0; while(true){ System.out.println(Thread.currentThread().getName()+"-->"+counter++); } } } //自定义线程类线程完成的任务是让一个计数器不断的累加输出。 classMyThread extendsThread{ //就是该线程的任务的主体部分 publicvoidrun() { intcounter= 0; while(true){ System.out.println(Thread.currentThread().getName()+"-->"+counter++); } } }

优秀的个人博客,低调大师

2018-05-30 第二十四天

一、String public final class String extends Object implements Serializable, Comparable, CharSequence String 类包括的方法可用于检查序列的单个字符、比较字符串、搜索字符串、提取子字符串、创建字符串副本并将所有字符全部转换为大写或小写。大小写映射基于 Character 类指定的 Unicode 标准版。 例1: importjava.util.Arrays; publicclassTestString { publicstaticvoidmain(String[] args) { byte[] bs= {65,66,67,68,69}; //通过字节数组创建字符串对象 String str=newString(bs); //将字符穿对象转换为字节数组 System.out.println(Arrays.toString(str.getBytes()));//{65,66,67,68,69} System.out.println(str);//ABCDE //得到字节数组指定区间的字符串对象 System.out.println(newString(bs,1,3));//BCD //创建一个字符串对象,根据指定的值 str=newString("0123456789"); //0序的 System.out.println(str.charAt(3));//3 //字符串连接原字符串不变 System.out.println(str.concat("asd"));//0123456789asd //是否包含某个子字符串 System.out.println(str.contains("0234"));//false //某个字符串是否以什么结尾 System.out.println(str.endsWith(""));//true //字符串格式化, System.out.println(String.format("%s攻击了%s,%s掉了%d滴血", "阿基里斯","赫克托","赫克托",100));//100是自动装箱 //从前往后找 System.out.println(str.indexOf(52));//4 System.out.println(str.indexOf("345"));//3 System.out.println(str.indexOf("345", 6));//-1 //求长度 System.out.println(str.length());//10 //生成一个新的字符串 System.out.println(str.replace("2", "__")); //切割字符串 str= "123_5435_1232_545_343_DSF"; System.out.println(Arrays.toString(str.split("_"))); System.out.println(str.substring(8));//_1232_545_343_DSF System.out.println(str.substring(1, 2));//2 //去掉前后的空白字符 str= " uiu ou ou ou "; System.out.println(str.trim()); System.out.println(); System.out.println(str); } } 例2: //* 1:在工具类中定义工具方法,对指定的字符串,求出该字符串中,出现指定字符的个数。 //* 2:自定义方法,实现产生一个随机字符串,长度为20,每一个字符要求全部随机产生,然后统计该字符串中的大写字符和小写字符的个数并以数组形式返回统计的个数 //* 3:自定义方法,针对指定的字符串,返回该字符串的逆序形式。 importjava.util.Arrays; importcom.bjsxt.util.MyUtil; publicclassTestString1 { publicstaticvoidmain(String[] args) { System.out.println(getCharCount("3278239782981", '8')); String str=getRandomStr(20); System.out.println(str); System.out.println(Arrays.toString(getLowerAndUpperCharCount(str))); } // 在工具类中定义工具方法,对指定的字符串,求出该字符串中,出现指定字符的个数。 publicstaticintgetCharCount(String str,charkey){ if(str==null) return-1; if(str.isEmpty()) return0; intcounter= 0; intlen= str.length(); for(inti= 0; i< len; i++) { //取出每个字符进行比对 charc= str.charAt(i); if(key== c) counter++; } returncounter; } //自定义方法,实现产生一个随机字符串,长度为20,每一个字符要求全部随机产生,然后统计该字符串中的大写字符和小写字符的个数并以数组形式返回统计的个数 //随机产生一个指定长度的字符串 publicstaticString getRandomStr(intlength){ String str= ""; for(inti=0;i //得到随机区间的值 intranNumber= MyUtil.getRandomNumber('A', 'Z'+1); //随机大小写的字符 charranChar= (char)(Math.random() > 0.5 ? ranNumber: ranNumber+ 32); str= str.concat(Character.toString(ranChar)); } returnstr; } //针对指定的字符串,统计字符串中大小写的个数,以数组形式返回。 publicstaticint[] getLowerAndUpperCharCount(String str){ if(str==null) returnnull; if(str.isEmpty()) returnnull; int[] count=newint[2]; //统计 intlen= str.length(); for(inti= 0; i< len; i++) { charc= str.charAt(i); if(Character.isUpperCase(c)){ count[0]++; }elseif(Character.isLowerCase(c)){ count[1]++; } } returncount; } // 自定义方法,针对指定的字符串,返回该字符串的逆序形式。 publicstaticString reverse(String str){ //逆序取出来,连接 if(str==null) returnnull; if(str.isEmpty()) return""; String newStr= ""; intlen= str.length(); for(inti= len-1; i>= 0; i--) { charc= str.charAt(i); newStr+= c; } returnnewStr; } } 二、原码分析 1:字符串类型底层使用 char[] 实现。是一个final 修饰的数组。 String 类没有提供对外的任何修改原有字符串的方法。 结论:字符串对象一旦创建,就不能更改。所有的看似对字符串的修改,都不是在原有的字符串对象上的修改,而是会生成一个新的字符串对象。 这样的特点导致了,在程序中使用字符串对象,会在内存中生成大量的字符串对象的碎片。造成对内存的浪费。 java 对String 进行了特殊的处理,来尽量的避免这样的问题。 三、String扣留intern 机制 java 对字符串提供了一种 字符串扣留intern 机制。 java 对字符串常量 提供了一个字符串常量池的内存空间。在方法区中。扣留机制的基础。 字符串常量池由String 类自己维护。 在编译期一个类有哪些字符串常量就确定了。在类加载的时候,就会把当前类的所有的字符串常量加载到字符串常量池中。 1:String str = "abc"; 在java 语句中,如果存在了一个字符串常量,那么 String 类的扣留机制 会 自动的判断 该常量是否存在于 常量池中 如果存在,那么直接将常量池中的字符串对象的引用返回,不会创建新的字符串对象。 如果在常量池中不存在该常量,那么就将该常量添加到常量池中,并返回常量池字符串的地址。 这样的赋值方式会产生[0-1]个字符串对象。 2:String str = new String("123"); 首先对字符串常量"123",进行扣留机制的判断。可能产生[0-1]个对象。 new 出来的String 对象在堆区中被创建。 新的String 对象中的成员 value 指向 常量池中的字符串地址。 这样的创建对象的方式会产生[1-2]个对象。 要求:使用第一种创建字符串对象的方式。 publicclassTestInternString { publicstaticvoidmain(String[] args) { //产生了一个字符串对象a ,在常量池中 String a= "a"; //产生了一个字符串对象b ,在常量池中 String b= "b"; //产生了一个字符串对象ab,在常量池中 String s1= "ab"; //编译之后和a和b 合并,没有产生字符串对象,直接指向方法区"ab"; String s2= "a"+"b"; //会产生一个新的对象,指向堆的。涉及到字符串变量的+连接的实现。 String s3= a+ b; //在堆中产生一个新的对象 String s4=newString("ab"); //如果"ab" 字符串已经存在于常量池中,那么直接返回常量池的地址。 //如果“ab”不存在于常量池中。那么就将"ab" 在运行期动态的添加到常量池,并返回常量池字符串的地址。 //intern 将当前字符串对象动态的添加到常量池中,并返回在常量池中的地址。 String s5=newString(a+b).intern(); System.out.println(s1== s2);//true System.out.println(s1== s3);//false System.out.println(s1== s4);//false System.out.println(s1== s5);//true } } 四、StringBuffer和StringBuilder StringBuffer: 可以修改的字符串对象。可以认为是一个增强版的String。 在原有的String的功能上面(有些功能没有),增加了对字符串序列的增删改。 底层使用char[] 数组实现。 StringBuilder是在某些情况下的替代StringBuffer 类的一个类。和StringBuffer类的用法完全一样。API 兼容。 StringBuffer 是线程安全的。 效率相对较低。 StringBuilder 是线程非安全的。 效率更高。 总结:在线程安全的情况下使用StringBuilder。 例: /** * 对于指定的一个字符串,将该字符串的统计表示形式[asdasdasd---a(3)s(3)d(3)]保存到一个StringBuffer中,并最后打印输出。 * 思路:逐个遍历字符串中的每个字符,将统计的结果放到一个StringBuffer中,如果被遍历的字符还没有出现在 * StringBuffer 中,则在StringBuffer中尾部添加该字符并在该字符后增加(1) ,如果已经存在与StringBuffer * 则将该字符后的小括号中的字符串取出,转换为int,然后+1后,再插入原位置。最后返回StringBuffer的字符串形式。 */ publicstaticString countTypeChar(String str){ if(str==null) returnnull; if(str.isEmpty()) return""; intlen= str.length(); StringBuffer sb=newStringBuffer(); for(inti= 0; i< len; i++) { charc= str.charAt(i); //得到c 在sb中的位置 intindex= sb.indexOf(Character.toString(c)); //c 已经存在sb中了。那么将原有的数量获得,并删除,加1 之后插入回去。 if(index>=0 ){ //先获得sb中c 的数量 //数量的起始索引,和结束索引 intstart= index+ 2;//当前字符的右边的第二个符号 intend= sb.indexOf(")", start); //获得当前字符的在sb中数量的值 intcount= Integer.parseInt(sb.substring(start, end)); //删除数量字符串 sb.delete(start, end); //原有数量+1 插入回去 count++; sb.insert(start, Integer.toString(count)); }else{//不在sb中尾部添加即可 sb.append(c+"(1)"); } } returnsb.toString(); } 五、String类的 + 连接的实现 /** * String 类的+ 连接实现 * */ publicclassTestStringBuffer1 { publicstaticvoidmain(String[] args) { String a= "a"; //直接指向常量池 String b= "a"+ "b"; //变量相加或者是变量和常量相加底层使用StringBuilder 实现。 //在StringBuilder 没有出来之前,使用StringBuffer 实现+ 连接。 String c= a+ b+ "a"; String str=new StringBuilder(a).append(b).append("a").toString(); } } 六、字符串连接性能测试 publicclassTestStringConcat { publicstaticvoidmain(String[] args) { longtime= System.currentTimeMillis(); for(inti=0;i<100000;i++){ concat6("rewrewrewfewrewfdwefewfrewfew", "32lkfjklwejrl2o3kdlemfrl243kj", "fjoweurolenmflkdnmvklsdnlkfew", "fu98u798rjhoifdjiefldsfjdskljfvcd", "9123ljkrlemwfklmwe,.fm c,.dmv", "23oirjelkfmnkdslnmvkldsnmvdsklmnfds"); } longcost= System.currentTimeMillis()-time; System.out.println("cost = "+ cost); } //210ms 会创建6个StringBuilder 对象 staticStringconcat1(Strings1,Strings2,Strings3,Strings4,Strings5,Strings6){ Stringstr= ""; str+= s1; str+= s2; str+= s3; str+= s4; str+= s5; str+= s6; returnstr; } //95 线程安全的,创建了一个StringBuffer 对象,存在多次扩容的行为 staticStringconcat2(Strings1,Strings2,Strings3,Strings4,Strings5,Strings6){ StringBuffer sb=newStringBuffer(); sb.append(s1).append(s2).append(s3).append(s4).append(s5).append(s6); returnsb.toString(); } //85 线程非安全的,创建了一个StringBuilder 对象,存在多次扩容的行为 staticStringconcat3(Strings1,Strings2,Strings3,Strings4,Strings5,Strings6){ StringBuilder sb=newStringBuilder(); sb.append(s1).append(s2).append(s3).append(s4).append(s5).append(s6); returnsb.toString(); } //62 创建了一个StringBuilder对象,存在多次扩容 staticStringconcat4(Strings1,Strings2,Strings3,Strings4,Strings5,Strings6){ returns1+ s2+ s3+ s4+ s5+ s6; } //67 创建一个StringBuffer 对象,不存在扩容行为 staticStringconcat5(Strings1,Strings2,Strings3,Strings4,Strings5,Strings6){ StringBuffer sb=newStringBuffer(s1.length()+s2.length() + s3.length() + s4.length() + s5.length() +s6.length()); sb.append(s1).append(s2).append(s3).append(s4).append(s5).append(s6); returnsb.toString(); } //48 创建一个StringBuilder 对象,不存在扩容行为 staticStringconcat6(Strings1,Strings2,Strings3,Strings4,Strings5,Strings6){ StringBuilder sb=newStringBuilder(s1.length()+s2.length() + s3.length() + s4.length() + s5.length() +s6.length()); sb.append(s1).append(s2).append(s3).append(s4).append(s5).append(s6); returnsb.toString(); } } 七、File 一个File对象既可以表示一个文件,也可以表示一个目录。 提供了对文件对象和目录对象的各种操作的方法。 对文件的操作: 创建文件 删除文件 修改文件的属性,不能修改文件的内容。 判断是文件还是目录 得到目录下是所有的文件对象。 创建目录,删除目录 判断文件或者目录是否存在 获得文件的绝对路径。 获得文件的名字 重命名文件 ...... 绝对路径:相对于盘符的路径。 相对路径:相当于当前工程根目录。 例: importjava.io.File; importjava.io.IOException; importjava.text.ParseException; importjava.text.SimpleDateFormat; importjava.util.Date; publicclassTestFile { // 在相对路径中创建1.txt 文件 工程目录下 // 在c盘的根目录下创建文件2.txt, 并修改其修改的时间 1970-05-20 13:14:20。 // 在c盘的根目录下创建文件c:/7/7/2.txt // 将指定的目录下的,指定的后缀的文件全部删除 // 使用递归将某个目录下的所有的文件以及子目录中的文件 文件的个数的统计。 // 使用递归实现,将指定的目录以及其子目录全部删除。 publicstaticvoidmain(String[] args) { // 从当前系统动态获得的路径分隔符 和 目录分隔符 System.out.println(File.pathSeparator);// ; System.out.println(File.separator);// \ // deleteFilesBySuffix("c:\\class\\501", "class"); test2(); } // 在res 的相对目录中,创建 或者删除指定的文件 staticvoidtest1() { File file =newFile("."+ File.separator+ "res"+ File.separator + "1.txt"); if(file.exists()) {// 文件存在,删除, file.delete(); }else{// 不存在,创建新的 try{ file.createNewFile(); }catch(IOException e) { e.printStackTrace(); } } } // 在c盘的根目录下创建文件2.txt, 并修改其修改的时间 1970-05-20 13:14:20。 staticvoidtest2() { File file =newFile("F:\\2.txt"); if(!file.exists()) { try{ file.createNewFile(); }catch(IOException e) { e.printStackTrace(); } } // 修改 time 要求是 距离 1970 年1月1日 的毫秒的时间差 try{ file.setLastModified(Long .parseLong(dateToStamp("1970-05-20 13:14:20"))); }catch(NumberFormatException e) { e.printStackTrace(); }catch(ParseException e) { e.printStackTrace(); } // file.lastModified() } // 在c盘的根目录下创建文件c:/7/7/2.txt staticvoidtest3() { File file =newFile("c:\\88\\88"); // 先创建目录 // file.mkdir() 只能创建一层 file.mkdirs(); // 再创建文件 File file2 =newFile(file, "2.txt"); if(!file2.exists()) { try{ file2.createNewFile(); }catch(IOException e) { e.printStackTrace(); } } } /** *删除指定目录下的指定的后缀的文件 * *@parampath *@paramsuffix */ staticvoiddeleteFilesBySuffix(String path, String suffix) { File file =newFile(path); // 得到当前目录下的所有的文件 File[] files = file.listFiles(); // 遍历所有的文件,如果文件的名字以suffix 结尾 就删除 for(File file2 : files) { // 获得文件的名字 String name = file2.getName(); if(name.endsWith(suffix)) { file2.delete(); } } } /* * 将时间转换为时间戳 · publicstaticString dateToStamp(String s)throwsParseException { String res; SimpleDateFormat simpleDateFormat =newSimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); Date date = simpleDateFormat.parse(s); longts = date.getTime(); res = String.valueOf(ts); returnres; } }

优秀的个人博客,低调大师

第190天:js---String常用属性和方法(最全)

String常用属性和方法 一、string对象构造函数 1 /*string对象构造函数*/ 2 console.log('字符串即对象');//字符串即对象 3 //传统方式 - 背后会自动将其转换成对象 4 // 所以我们才可以访问string对象中方法 5 var zhangsan ='张三' 6 zhangsan.length; 7 //通过对象形式 8 var lisi = new String('李四'); 9 console.log(zhangsan);//张三 10 console.log(lisi);//String 11 12 //使用对象中的方法 13 console.log(lisi.charAt(0));//李 14 console.log(lisi.concat(['张领','王占一']));//李四张领,王占一 二、字符串对象属性和方法概述 获取字符串长度Length属性 连接字符串:concat 获取索引值:indexOf() 根据索引值获取单个字符:charAt() 1、concat方法 连接字符串 1 console.log('concat用法') 2 3 var s1="a"; 4 var s2="b"; 5 var s3="c"; 6 console.log(s1.concat(s2,s3));//abc 7 // 等同于:result = s1 + s2 + ... + s 8 // 关联记忆:数组中的concat 9 var arr = [1, 2, 3]; 10 console.log(arr.concat(4, 5));//[1,2,3,4,5] 2、indexOf 找到匹配项返回索引值,如果没找到返回-1 1 /*indexOf 找到匹配项返回索引值,如果没找到返回-1*/ 2 console.log('indexOf用法') 3 4 // 获取索引值indexOf 5 // 常用方法:找到匹配项返回索引值,如果没找到返回-1 6 var myString="JavaScript"; 7 var a1=myString.indexOf("v");//2 8 var a2=myString.indexOf("S");//4 9 var a3=myString.indexOf("Script");//4 10 var a4=myString.indexOf("key"); 11 12 //如果没有匹配项返回 -1 13 console.log(a1)//2 14 console.log(a2)//4 15 console.log(a3)//4 16 console.log(a4)//-1 17 18 // 完整的indexof用法: 19 // 可以传入第二个参数:indexOf(str,fromIndex) 20 // 表示从索引位置fromIndex开始查找,如果fromIndex省略,则表示默认从起始索引0开始查找; 21 // 若fromIndex为负,则从索引0开始查找。 22 var b1 = myString.indexOf("v",5);// 从下标5开始查找,而v在索引2,所以找不到,返回-1 23 var b2 = myString.indexOf("v",1);//-2 24 console.log(b1)//-1 25 console.log(b2)//-2 3、charAt 返回指定索引位置的字符,若索引越界,返回空字符串。 1 //返回指定索引位置的字符 2 //(因为Javascript中没有字符类型,所以返回的是长度为1的字符串)。 3 myString="JavaScript"; 4 console.log(myString.charAt(1));//a 5 console.log(myString.charAt(1000000));//若索引越界,返回空字符串 6 console.log(myString.charAt(-1));//若索引越界,返回空字符串 -- "" 7 console.log(myString.charAt(-10000000000));//若索引越界,返回空字符串 "" 4、substr(fromIndex,length) 获取部分字符串 1 /*substr(fromIndex,length) 获取部分字符串 2 从起始索引fromIndex开始截取长度length的字符串*/ 3 console.log('substr用法') 4 5 //从起始索引fromIndex开始截取长度length的字符串 - 正向截取 6 myString="JavaScript"; 7 console.log(myString.substr(1,1));//a 表示从第1个索引值开始截取,截取1个字符 8 console.log(myString.substr(1,2));//av 表示从第1个索引值开始截取,截取2个字符 9 console.log(myString.substr(1,3));//ava 表示从第1个索引值开始截取,截取3个字符 10 console.log(myString.substr(1,4));//avaS 表示从第1个索引值开始截取,截取4个字符 11 12 //若不指定length或者length超过可截取的最大长度,则截取到结尾。 13 console.log(myString.substr(1));//avaScript 14 console.log(myString.substr(1,4000000));//avaScript 15 16 17 //反向截取 18 //若起始索引为负,则从右往左开始截取 -1表示倒数第一个, -2表示倒数第二个 19 myString="JavaScript"; 20 console.log(myString.substr(-1,1));//t 表示从倒数第一个开始截取,截取1个字符 21 console.log(myString.substr(-2,1));//p 表示从倒数第二个开始截取,截取1个字符 22 console.log(myString.substr(-3,1));//i 表示从倒数第三个开始截取,截取1个字符 23 console.log(myString.substr(-4,1));//r 表示从倒数第四个开始截取,截取1个字符 24 console.log(myString.substr(-5,1));//c 表示从倒数第五个开始截取,截取1个字符 25 console.log(myString.substr(-6,1));//S 表示从倒数第六个开始截取,截取1个字符 26 console.log(myString.substr(-7,1));//a 表示从倒数第七个开始截取,截取1个字符 27 28 myString="JavaScript"; 29 console.log(myString.substr(-6,1));//S 表示从倒数第6个开始截取,截取1个字符 30 console.log(myString.substr(-6,2));//Sc 表示从倒数第6个开始截取,截取2个字符 31 console.log(myString.substr(-6,3));//Scr 表示从倒数第6个开始截取,截取3个字符 32 console.log(myString.substr(-6,4));//Scri 表示从倒数第6个开始截取,截取4个字符 33 console.log(myString.substr(-6,5));//Scrip 表示从倒数第6个开始截取,截取5个字符 34 console.log(myString.substr(-6,6));//Script 表示从倒数第6个开始截取,截取6个字符 35 36 //从倒数的方式开始截取,获取av 37 myString="JavaScript"; 38 console.log(myString.substr(-9,2));//av 表示从倒数第9个开始截取,截取2个字符 39 40 //整数的方式获取曲线S 41 //首先思考 我要获取几个字符,则后面的参数就确定了 42 myString="JavaScript"; 43 console.log(myString.substr(4,1));//S 表示从索引值4开始截取,截取1个字符 44 console.log(myString.substr(-6,1));//S 表示从倒数第6个开始截取,截取1个字符 5、substring(startIndex,endIndex) 获取部分字符串 1 /*substring(startIndex,endIndex)获取部分字符串 2 截取 起始索引startIndex 到 结束索引endIndex的子字符串, 3 结果包含startIndex处的字符,不包含endIndex处的字符。 4 */ 5 console.log('substring用法') 6 //获取av 7 myString="JavaScript"; 8 console.log(myString.substring(1,3));//av 9 10 //获取曲线S 11 myString="JavaScript"; 12 console.log(myString.substring(4,5));//S 13 14 //其他小点: 15 //如果省略个数,则自动获取后面所有 16 console.log(myString.substring(4));//Script 17 //若startIndex或者endIndex为负,则会被替换为0。 18 console.log(myString.substring(-1,1));//J 19 //若startIndex = endIndex,则返回空字符串。 20 console.log(myString.substring(3,3));// 返回空 21 //若startIndex > endIndex,则执行方法时,两个值会被交换。 22 console.log(myString.substring(3,1));//av 等价于myString.substring(1,3) 6、slice(startIndex,endIndex) 获取部分字符串 1 /*slice(startIndex,endIndex)获取部分字符串 2 截取 起始索引startIndex 到 结束索引endIndex的子字符串, 3 结果包含startIndex处的字符,不包含endIndex处的字符。 4 */ 5 console.log('slice(startIndex,endIndex)用法'); 6 myString="JavaScript"; 7 console.log(myString.slice(1,3)) //av 8 console.log(myString.slice(4,5)) //S 9 console.log(myString.slice(4)) //Script //如果省略个数,则自动获取后面所有 10 11 // 基本用法和substring用法一样,不同点如下: 12 13 // stringObj.slice(start, [end]) 14 // 如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。 15 console.log(myString.slice(-1,2)); 16 // 如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。 17 console.log(myString.slice(2,-3));//vaScr 18 // 如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。 19 // 如果 end 大于 start,不复制任何元素到新数组中。 20 // 21 // strVariable.substring(start, end) 22 // 如果 start 或 end 为 NaN 或者负数,那么将其替换为0。 23 // 子字符串的长度等于 start 和 end 之差的绝对值。例如,在 strvar.substring(0, 3) 和 strvar.substring(3, 0) 返回的子字符串的的长度是 3。 24 // slice可以对数组操作,substring不行。。。 7、split() 分割 1 /*split()分割 2 按给定字符串分割,返回分割后的多个字符串组成的字符串数组。 3 */ 4 console.log('split()用法') 5 var s="a,bc,d"; 6 console.log(s.split(","));//["a", "bc", "d"] 7 s="a1b1c1d1"; 8 console.log(s.split("1"));//["a", "b", "c", "d", ""] 8、join()合并 1 /*join()合并 使用您选择的分隔符将一个数组合并为一个字符串*/ 2 console.log('join用法') 3 var myList=new Array("jpg","bmp","gif","ico","png"); 4 var imgString=myList.join("|");//结果是jpg|bmp|gif|ico|png 5 console.log(imgString); 6 7 8 //split()还可以结合正则表达式 9 myString = 'javascript is a good script language'; 10 console.log(myString.split(/\s/)); //javascript,is,a,good,script,language 11 //传入\s表示要匹配空格,我们将字符串分割为一个数组,如果你要访问某一个,那么可以明确指出: 12 console.log(myString.split(/\s/)[3]); //good 9、字符串大小写转换 1 /*字符串大小写转换 2 使用您选择的分隔符将一个数组合并为一个字符串 3 */ 4 console.log('字符串大小写转换'); 5 6 myString="JavaScript"; 7 myString = myString.toLowerCase(); 8 console.log(myString);//javascript 9 myString = myString.toUpperCase(); 10 console.log(myString);//JAVASCRIPT 10、replace用法 1 /*replace用法1 - 基础用法 2 最核心的易错点:如果要替换全部匹配项,需要传入一个 RegExp 对象并指定其 global 属性。 3 */ 4 console.log('replace基本用法'); 5 6 //基本用法: 7 myString = "javascript is a good script language"; 8 //在此我想将字母a替换成字母A 9 console.log(myString.replace("a","A"));//jAvascript is a good script language 10 // 我想大家运行后可以看到结果,它只替换了找到的第一个字符,如果想替换多个字符怎么办? 11 // 答案:结合正则表达式,这也是replace的核心用法之一! 12 13 14 //将字母a替换成字母A 正确的写法 /g表示匹配所有 15 myString = "javascript is a good script language"; 16 console.log(myString.replace(/a/g,"A"));//jAvAscript is A good script lAnguAge 17 18 19 20 /*replace用法2 - 高级用法 特殊标记$*/ 21 22 23 //replace高级技巧 - 特殊标记$ 24 console.log('replace功能4 - 特殊标记$'); 25 26 // 对于正则replace约定了一个特殊标记符$: 27 // 1.$i (i:1-99) : 表示从左到右正则子表达式所匹配的文本。 28 // 2.$&:表示与正则表达式匹配的全文本。 29 // 3.$`(`:切换技能键):表示匹配字符串的左边文本。 30 // 4.$'(‘:单引号):表示匹配字符串的右边文本。 31 // 5.$$:表示$转移。 32 33 34 // $i (i:1-99) : 表示从左到右正则子表达式所匹配的文本 35 36 //案例1- 匹配后替换 37 console.log('replace功能1 - 匹配后替换'); 38 //在本例中,我们将把所有的花引号替换为直引号: 39 myString = '"a", "b"'; 40 myString = myString.replace(/"([^"]*)"/g, "'$1'");// 寻找所有的"abb"形式字符串,此时组合表示字符串,然后用'$1'替换 41 console.log(myString);//'a', 'b' 42 43 44 45 //案例2- 匹配后替换 46 myString= "javascript is a good script language"; 47 console.log(myString.replace(/(javascript)\s*(is)/g,"$1 $2 fun. it $2"));//javascript is fun. it is a good script language 48 49 50 51 //案例3 - 分组匹配后颠倒 52 console.log('replace功能2 - 颠倒'); 53 //在本例中,我们将把 "baidu,com" 转换为 "com baidu" 的形式: 54 myString = "baidu , com"; 55 myString = myString.replace(/(\w+)\s*, \s*(\w+)/, "$2 $1"); 56 console.log(myString);//com baidu 57 58 59 //案例4 - 分组匹配后颠倒 60 myString = "boy & girl"; 61 myString.replace(/(\w+)\s*&\s*(\w+)/g,"$2 & $1") 62 console.log(myString);//girl & boy 63 64 65 66 // $&:表示与正则表达式匹配的全文本。 67 myString = "boy"; 68 myString.replace(/\w+/g,"$&-$&"); 69 console.log(myString);// boy-boy 70 71 // $`(`:切换技能键):表示匹配字符串的左边文本。 72 myString = "javascript"; 73 myString.replace(/script/,"$& != $`"); 74 console.log(myString); //javascript != java 75 76 // $'(‘:单引号):表示匹配字符串的右边文本。 77 myString = "javascript"; 78 myString.replace(/java/,"$&$' is "); 79 console.log(myString);// javascript is script 80 81 82 83 /*replace用法2 - 高级用法 第二个参数可以是函数 - 最常用 必考点*/ 84 85 //无敌的函数 - replace第二个参数可以传递函数 86 //如果第二参数是一个函数的话,那么函数的参数是什么呢? 87 console.log('replace功能5 - 无敌的函数 - replace第二个参数可以传递函数'); 88 myString = "bbabc"; 89 myString.replace(/(a)(b)/g, function(){ 90 console.log(arguments); // ["ab", "a", "b", 2, "bbabc"] 91 }); 92 // 参数将依次为: 93 // 1、整个正则表达式匹配的字符。 94 // 2、第一分组匹配的内容、第二分组匹配的内容…… 以此类推直到最后一个分组。 95 // 3、此次匹配在源自符串中的下标(位置)。 96 // 4、源自符串 97 // 所以例子的输出是 ["ab", "a", "b", 2, "bbabc"] 98 99 100 //用法举例 首字母大写 -- 一个参数 表示匹配的整个字符串 101 console.log('replace功能3 - 将首字符转为大写'); 102 103 //在本例中,我们将把字符串中所有单词的首字母都转换为大写: 104 myString = 'aaa bbb ccc'; 105 myString=myString.replace(/\b\w+\b/g, function(word){ 106 return word.substring(0,1).toUpperCase()+word.substring(1);} 107 ); 108 console.log(myString);//Aaa Bbb Ccc 109 110 111 112 //用法举例 首字母大写 -- 多个参数 - 第一个表示匹配的整个字符串,后面的表示分组中的内容 113 function capitalize(str){ 114 return str.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase(); 115 } ); 116 117 }; 118 myString = "i am a boy !" 119 console.log(capitalize(myString)) //I Am A Boy! 11、正则表达式基础知识 1 //正则表达式基础知识 2 3 //星号(*) : 星号代表匹配它前面一个字符任意遍(0或任意次) 4 5 //加号(+): 加号是一个与星号(*)类似的通配符,它也是数量词,表示匹配前面的字符一次或多次(至少一次). 6 //它与星号的差别就在这里,星号可以匹配0次,加号则必须一次以上。 7 8 //问号(?): 问号也是一个数量词,它代表匹配前一个字符0或1次。 9 10 11 //中括号[]: 中括号用来表示一个字符集合, 12 //如果这个集合有很多元素,如26个字母,数字等,一个个地写在中括号里,未免太麻烦太蠢笨, 13 //这时可以用连字符(hyphen)来表示一个范围, 14 // 如:[a-z]表示小写字母的集合, 15 // [a-zA-Z]表示大小写字母的集合。 16 // 脱字符^ (caret). 17 // 这种写法表示,匹配任何不在该集合中的字符,与上面的用法刚好相反 18 19 20 //特殊字符: 21 // \w -- (小写w) 表示字母或数字,等价于 [a-zA-Z0-9] 22 // \W -- (大写W)非字母且非数字,与\w相反 等价于 '[^A-Za-z0-9_]' 23 // \s -- (小写s)匹配一个空格字符,包括:空格,换行,回车,tab,等价于[ \n\r\t\f] 24 // \S -- (大写S)匹配非空格字符,\s的相反 等价于 [^ \f\n\r\t\v]。 25 // \d -- 表示10进制数字,等价于 [0-9] 26 // \D -- 匹配一个非数字字符。等价于 [^0-9]。 27 28 // \f 匹配一个换页符。等价于 \x0c 和 \cL。 29 // \n 匹配一个换行符。等价于 \x0a 和 \cJ。 30 // \r 匹配一个回车符。等价于 \x0d 和 \cM。 31 // \t 匹配一个制表符。等价于 \x09 和 \cI。 32 // \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 33 34 35 36 // 大括号:{} 37 // 大括号的作用是指定重复前面一个字符多少遍: 38 // {N} 重复N遍 39 // {n,m} 重复 n~m 遍 40 // {n,} 至少重复n遍 41 // {,m} 至多重复m遍 42 43 44 //定位符: 45 // ^ 匹配输入字符串的开始位置。 46 // $ 匹配输入字符串的结束位置。 47 // \b 匹配一个单词边界,也就是指单词和空格间的位置。//例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 48 // \B 和\b相反,匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 12、常用字符串扩充 封装框架 1 //定义一个对象 - 名字是$ 2 var $$ = function() { 3 4 }; 5 //第二种写法 6 $$.prototype = { 7 init:function(){ 8 this.stringExtend(); 9 this.MathExtend(); 10 }, 11 stringExtend:function(){ 12 13 /*新增一个方法*/ 14 String.prototype.formateString=function(data){ 15 return this.replace(/@\((\w+)\)/g, function(match, key){ 16 return typeof data[key] === "undefined" ? '' : data[key]}); 17 } 18 19 /*trim是ES5新增的,以前的版本不支持,一般我们在编程的时候不会直接使用ES5,所以必须自己扩充*/ 20 String.prototype.trim = function() { 21 return this.replace(/(^\s*)|(\s*$)/g, ""); 22 } 23 24 /*字符串-去掉前空白字符 */ 25 String.prototype.ltrim = function(){ 26 return this.replace(/(^\s*)/g, ""); 27 } 28 29 /** 30 *字符串-去掉后空白字符 31 */ 32 String.prototype.rtrim = function(){ 33 return this.replace(/(\s*$)/g, ""); 34 } 35 36 /** 37 * 将一个字符串的首字母大写,其它字符小写 38 */ 39 String.prototype.capitalize= function() { 40 return this.trim().replace(/^(\w{1})(.*)/g, function(match, g1, g2) { 41 return g1.toUpperCase() + g2.toLowerCase(); 42 }); 43 } 44 45 /** 46 * 将字符串中的下划线转换成中划线 47 */ 48 String.prototype.dashString = function() { 49 return this.replace(/\_/g, '-'); 50 } 51 52 /** 53 * 检测字符串是否是空串 54 */ 55 String.prototype.isEmpty = function() { 56 return this.length === 0; 57 } 58 59 /** 60 * 检测字符串是否包含特定的字符串 61 */ 62 String.prototype.contains = function(target) { 63 return this.indexOf(target) !== -1; 64 } 65 66 /** 67 * 对字符串中的特殊字符进行转义,避免XSS 68 */ 69 String.prototype.escapeHTML=function() { 70 //转义后的字符是可以直接设置成innerHTML的值。 71 //replace(/&/g, '&amp;')这条replace()调用一定要写在所有的特殊字符转义的前面,不然转换后有&符号的会再被转一次 72 return this.replace(/&/g, '&amp;') 73 .replace(/\</g, '&lt;') 74 .replace(/\>/g, '&gt;') 75 .replace(/\'/g, '&#39;') 76 .replace(/\"/g, '&quot;'); 77 }, 78 79 /** 80 * 对字符串进行反转义 81 */ 82 String.prototype.unescapeHTML = function() { 83 return this.replace(/&amp;/, '&') 84 .replace(/&lt;/g, '<') 85 .replace(/&gt;/g, '>') 86 .replace(/&#39;/g, '\'') 87 .replace(/&quot;/g, '\"') 88 .replace(/&#(\d+)/g, function($0, $1) { 89 return String.formCharCode(parseInt($1, 10)); 90 }); 91 } 92 93 94 /** 95 * 取得字符串的逆序 96 */ 97 String.prototype.reverse = function() { 98 return (this.toString()).split('').reverse().join(''); 99 } 100 101 }, 102 MathExtend:function(){ 103 104 }, 105 $id:function(id){ 106 return document.getElementById(id) 107 }, 108 //去除左边空格 109 ltrim:function(){ 110 return str.replace(/(^\s*)/g,''); 111 }, 112 //去除右边空格 113 rtrim:function(){ 114 return str.replace(/(\s*$)/g,''); 115 }, 116 //去除空格 117 trim:function(){ 118 return str.replace(/(^\s*)|(\s*$)/g, ''); 119 } 120 121 }//在框架中实例化,这样外面使用的使用就不用实例化了 122 $$ = new $$(); 123 $$.init(); 实例: 1 <script> 2 /*去除空格*/ 3 var str = ' 百度一下' 4 console.log(str.trim());//百度一下 5 6 /*首字母大写*/ 7 var baidu = 'baidu' 8 console.log(baidu.capitalize());//Baidu 9 10 /*下划线转成中划线*/ 11 var str = '1_2_3_4' 12 console.log(str.dashString());//1-2-3-4 13 14 /*判断是否为空*/ 15 str = '' 16 console.log(str.isEmpty());//true 17 18 /*判断是否包含指定字符串*/ 19 str = '我们一起走,一起唱歌,你妹,祖宗' 20 console.log(str.contains('祖宗'));//true 21 22 23 /*html编码和解码*/ 24 str = '<div>hello</div>' 25 console.log(str.escapeHTML());//&lt;div&gt;hello&lt;/div&gt; 26 console.log(str.unescapeHTML());//<div>hello</div> 27 28 /*获取逆序*/ 29 str = 'abcdefg' 30 console.log(str.reverse());//gfedcba 31 </script> 13、获取随机数 1 <script> 2 3 //随机选取 4 //获取10个10-100之间的随机数,并从小到大排序放到一个数组中 5 function getRandom (begin,end){ 6 return Math.floor(Math.random()*(end-begin))+begin; 7 } 8 9 10 function getRandomList(){ 11 var iArray = []; 12 for(var i=0; i<10; i++){ 13 iArray.push(getRandom(10,100)); 14 } 15 iArray.sort(); 16 return iArray 17 18 } 19 20 var arr = getRandomList() 21 console.log(arr); 22 //Array(10) 23 //0:20 24 //1:22 25 //2:23 26 //3:28 27 //4:56 28 //5:61 29 //6:63 30 //7:70 31 //8:73 32 //9:97 33 //length:10 34 </script>

优秀的个人博客,低调大师

天猫“双11”成交额实时统计技术详解

阿里巴巴资深技术专家莫问在2017年12月20日云栖大会北京峰会上做了题为“Apache Flink技术进阶”的主题演讲。Apache Flink作为流式计算引擎,支持了“双十一对的”实时计算,已经被国内外的公司使用。其中关于“Flink的技术特点”、“阿里巴巴的Flink版本——Blink”以及“Blink在实际场景中的应用” 等经验首次对外详细剖析,很有价值。以下为视频内容整理: Apache Flink介绍Flink是Storm之后出现的第二个纯流式计算引擎,其特点是支持毫秒级的延迟,同时支持 “至少一次”语义的保证。目前在阿里巴巴的“双十一”上面支持了每秒四亿次的计算。 Flink提供了不同的抽象级别来开发流/批处理应用程序: 最下面一层是有状态的分布式流式执行引擎。 第二层是core APIs,包括DataStream/Data

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册