本文共 28640 字,大约阅读时间需要 95 分钟。
String:字符串,使用一对""引起来表示。
1.String声明为final的,不可被继承 2.String实现了Serializable接口:表示字符串是支持序列化的。实现了Comparable接口:表示String可以比较大小 3.String内部定义了final char[] value用于存储字符串数据 4.String:代表不可变的字符序列。简称:不可变性。 体现:1.当对字符串重新赋值时,需要重写指定内存区域赋值,不能使用原有的value进行赋值。 2. 当对现有的字符串进行连接操作时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。 3. 当调用String的replace()方法修改指定字符或字符串时,也需要重新指定内存区域赋值,不能使用原有的value进行赋值。 5.通过字面量的方式(区别于new)给一个字符串赋值,此时的字符串值声明在字符串常量池中。 6.字符串常量池中是不会存储相同内容的字符串的。@Test public void test1(){ String s1 = "abc"; //字面量 String s2 = "abc"; //比较s1和s2的地址值 System.out.println(s1 == s2);//true s1 = "hello"; System.out.println(s1 == s2);//false System.out.println(s1);//hello System.out.println(s2);//abc System.out.println("****************"); String s3 = "abc"; s3 += "def"; System.out.println(s3);//abcdef System.out.println(s2);//abc System.out.println("****************"); String s4 = "abc"; String s5 = s4.replace('a', 'm'); System.out.println(s4);//abc System.out.println(s5);//mbc
String的实例化方式:
方式一:通过字面量定义的方式 方式二:通过new + 构造器的方式@Test public void test2(){ //通过字面量定义的方式:此时s1和s2的数据在javaEE声明在方法区中的字符串常量池中 String s1 = "javaEE"; String s2 = "javaEE"; //通过new + 构造器的方式:s3和s4保存的地址值,是数据在堆空间中开辟空间以后的地址值 String s3 = new String("javaEE"); String s4 = new String("javaEE"); System.out.println(s1 == s2);//true System.out.println(s1 == s3);//false System.out.println(s1 == s4);//false System.out.println(s3 == s4);//false System.out.println("***********************"); Person p1 = new Person("Tom",12); Person p2 = new Person("Tom",12); System.out.println(p1.name.equals(p2.name)); System.out.println(p1.name == p2.name); }
在字符串常量的拼接中会出现一些情况,记住下面的一些结论:
1.常量与常量的拼接结果在常量池。且常量池中不会存在相同内容的常量 2.只要其中有一个是变量,结果就在堆中 3.如果拼接的结果调用intern()方法,返回值就在常量池中@Test public void test3(){ String s1 = "java"; String s2 = "ee"; String s3 = "javaee"; String s4 = "java" + "ee"; String s5 = s1 + "ee"; String s6 = "java" + s2; String s7 = s1 + s2; System.out.println(s3 == s4);//true System.out.println(s3 == s5);//false System.out.println(s3 == s6);//false System.out.println(s3 == s7);//false System.out.println(s5 == s7);//false System.out.println(s5 == s7);//false System.out.println(s6 == s7);//false String s8 = s5.intern();//返回值得到的s8使用的是常量池中已经存在的"javaee" System.out.println(s3 == s8);//true }
注意用下面的小例子:
@Test public void test4(){ String s1 = "javaEEhadoop"; String s2 = "javaEE"; String s3 = s2 + "hadoop"; System.out.println(s1 == s3);//false final String s4 = "javaEE";//s4常量 String s5 = s4 + "hadoop"; System.out.println(s1 == s5);//true }
@Test public void test2(){ String s1 = "helloworld"; String s2 = "HelloWorld"; System.out.println(s1.equals(s2));//false System.out.println(s1.equalsIgnoreCase(s2));//true String s3 = "abc"; String s4 = s3.concat("def"); System.out.println(s4); String s5 = "abc"; String s6 = "abe"; System.out.println(s5.compareTo(s6)); String s7 = "河北省张家口市"; String s8 = s7.substring(3); System.out.println(s7); System.out.println(s8); String s9 = s7.substring(3,6); System.out.println(s9); } @Test public void test1(){ String s1 = "HelloWorld"; System.out.println(s1.length()); System.out.println(s1.charAt(1)); System.out.println(s1.charAt(2)); System.out.println(s1.charAt(9)); System.out.println(s1.isEmpty()); String s2 = s1.toLowerCase(); System.out.println(s1);//HelloWorld s1是不可变的仍然为原来的字符串 System.out.println(s2);//helloworld 改成小写以后的字符串 System.out.println(s1.toUpperCase()); String s3 = " hello world "; String s4 = s3.trim(); System.out.println(s4); }
@Test public void test3(){ String str1 = "helloworld"; boolean b1 = str1.endsWith("ld"); System.out.println(b1);//true boolean b2 = str1.startsWith("he"); System.out.println(b2);//true boolean b3 = str1.startsWith("ll",2); System.out.println(b3);//true String str2 = "owo"; System.out.println(str1.contains(str2));//true System.out.println(str1.indexOf("lo"));//3 System.out.println(str1.indexOf("lo",5));//-1 String str3 = "hellorworld"; System.out.println(str3.lastIndexOf("or"));//7 System.out.println(str3.lastIndexOf("or",6));//4 }
@Test public void test4(){ String str1 = "河北省张家口市"; String str2 = str1.replace('北','被'); System.out.println(str2); String str3 = str1.replace("河北", "和倍"); System.out.println(str3); String str = "12hello34world5java7891mysql456"; //把字符串中的数字替换成,,如果结果中开头和结尾有,的话去掉 String string = str.replaceAll("\\d+", ",").replaceAll("^,|,$", ""); System.out.println(string); str = "12345"; //判断str字符串中是否全部有数字组成,即有1-n个数字组成 boolean matches = str.matches("\\d+"); System.out.println(matches); String tel = "0571-4534289"; //判断这是否是一个杭州的固定电话 boolean result = tel.matches("0571-\\d{7,8}"); System.out.println(result); str = "hello|world|java"; String[] strs = str.split("\\|"); for (int i = 0; i < strs.length; i++) { System.out.println(strs[i]); } System.out.println(); str2 = "hello.world.java"; String[] strs2 = str2.split("\\."); for (int i = 0; i < strs2.length; i++) { System.out.println(strs2[i]); } }
@Test public void test1(){ String str1 = "123"; //String --> 基本数据类型、包装类 int num = Integer.parseInt(str1); //基本数据类型、包装类 --> String String str2 = String.valueOf(num); }
String --> char[]:调用String的toCharArray()
char[] --> String:调用String的构造器/* String 与 char[] 之间的转换 */ @Test public void test2(){ //String --> char[] String str1 = "abc123"; char[] charArray = str1.toCharArray(); for (int i = 0; iString char[] arr = new char[]{ 'h','e','l','l','o'}; String str2 = new String(arr); System.out.println(str2); }
tringBuilder 和 StringBuffer非常类似,均代表可变的字符序列,而且提供相关功能的方法也一样
String(JDK1.0):不可变的字符序列;底层使用byte[]存储
StringBuffer(JDK1.0):可变的字符序列;线程安全的,效率低;底层使用byte[]存储 StringBuilder(JDK5.0):可变的字符序列;jdk5.0新增的,线程不安全的,效率高;底层使用byte[]存储 注意:在JDK8.0及之前是char[]数组存储的 源码分析:String str = new String();//byte[] value = new byte[0]; String str1 = new String("abc");//byte[] value = new byte[]{'a','b','c'}; StringBuffer sb1 = new StringBuffer();//byte[] value = new byte[16];底层创建了一个长度是16的数组。 System.out.println(sb1.length());// sb1.append('a');//value[0] = 'a'; sb1.append('b');//value[1] = 'b'; StringBuffer sb2 = new StringBuffer("abc");//byte[] value = new byte["abc".length() + 16]; //注意 System.out.println(sb2.length())//3
如果添加的数据底层数组盛不下,就需要进行扩容,默认情况下,扩容为原来容量的2倍+2,同时将原有数组中的元素复制到新的数组中。
在开发中尽量使用StringBuffer(int capacity) 或 StringBuilder(int capacity)/* 总结: 增:append(xxx) 删:delete(int start,int end) 改:setCharAt(int n ,char ch) / replace(int start, int end, String str) 查:charAt(int n ) 插:insert(int offset, xxx) 长度:length(); *遍历:for() + charAt() / toString()*/ @Test public void test2(){ StringBuffer s1 = new StringBuffer("abc"); s1.append(1); s1.append('1'); System.out.println(s1); s1.delete(2,4); System.out.println(s1); StringBuffer s2 = new StringBuffer("abcdef"); System.out.println(s2); s2.replace(1,4,"hello"); System.out.println(s2); StringBuffer s3 = new StringBuffer("abcd"); System.out.println(s3); System.out.println(s3.reverse()); }
@Test public void test3(){ //初始设置 long starttime = 0L; long endtime = 0L; String text = ""; StringBuffer buffer = new StringBuffer(""); StringBuilder builder = new StringBuilder(""); //开始对比 starttime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { buffer.append(String.valueOf(i)); } endtime = System.currentTimeMillis(); System.out.println("StringBuffer的执行时间:" + (endtime - starttime) );//5 starttime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { builder.append(String.valueOf(i)); } endtime = System.currentTimeMillis(); System.out.println("StringBuilder的执行时间:" + (endtime - starttime) );//2 starttime = System.currentTimeMillis(); for (int i = 0; i < 20000; i++) { text = text + i; } endtime = System.currentTimeMillis(); System.out.println("String的执行时间:" + (endtime - starttime) );//255 }
只使用追加操作对三种类型的字符串进行对比。可以看出String类型效率最低,StringBuilder的效率约为StringBuffer效率的两倍。
System类提供的public static long currentTimeMillis()用来返回当前时 间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
注意:此方法常常用来计算时间差@Test public void test1(){ long time = System.currentTimeMillis(); //返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。 //称为时间戳 System.out.println(time); }
import java.util.Date; @Test public void test2(){ //构造器一:Date():创建一个对应当前时间的Date对象 Date date1 = new Date(); System.out.println(date1.toString());//Fri Sep 11 20:44:41 GMT+08:00 2020 System.out.println(date1.getTime());//1599828281246 //构造器二:创建指定毫秒数的Date对象 Date date2 = new Date(1599828281246L); System.out.println(date2.toString()); //创建java.sql.Date对象 java.sql.Date date3 = new java.sql.Date(1599828281246L); System.out.println(date3.toString()); System.out.println(date3.getTime()); //如何将java.util.Date对象转换为Date.sql.Date对象 //情况一 Date date4 = new java.sql.Date(1599828281246L); java.sql.Date date5 = new java.sql.Date(date4.getTime()); System.out.println(date5); //情况二 Date date6 = new Date(); java.sql.Date date7 = new java.sql.Date(date6.getTime()); }
/* SimpleDateFormat的使用 格式化:日期->字符串 解析: 格式化的逆过程 字符串->日期 */ @Test public void testSimpleDateFormat() throws ParseException { //实例化SimpleDateFormat对象 SimpleDateFormat sdf = new SimpleDateFormat(); //格式化:日期->字符串 Date date = new Date(); System.out.println(date); String format = sdf.format(date); System.out.println(format); //解析:逆过程 字符串->日期 String str = "2019/9/12 下午8:40"; Date date2 = sdf.parse(str); System.out.println(date2); System.out.println("************"); //通常使用下面的方法 SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //格式化 String format1 = sdf1.format(date); System.out.println(format1); //解析:要求字符串必须符合SimpleDateFormat识别格式(通过构造器参数体现),否则抛出异常 Date date1 = sdf1.parse("2020-09-12 08:45:37"); System.out.println(date1); }
/* Calender类的使用 */ @Test public void testCalender(){ //1.实例化 //方式一:创建其子类(GergorianCalendar)的对象 //方式二:调用静态方法getInstance() Calendar calendar = Calendar.getInstance(); System.out.println(calendar.getClass());//GergorianCalendar //2.常用方法 //get() int days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); //set() calendar.set(Calendar.DAY_OF_MONTH,22);//修改Calender类中的数据 days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); //add() calendar.add(Calendar.DAY_OF_MONTH,3);//修改Calender类中的数据,可以添负数 days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); //getTime():日历类->Date Date date = calendar.getTime(); System.out.println(date); //setTime():Date->日历类 Date date1 = new Date(); calendar.setTime(date1); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days); }
注意: 获取月份时:一月是0,二月是1,以此类推,12月是11
获取星期时:周日是1,周一是2 , 。。。。周六是7@Test public void test1() { //now():获取当前的日期、时间、日期+时间 LocalDate localDate = LocalDate.now(); LocalTime localTime = LocalTime.now(); //LocalDateTime类使用的更加频繁 LocalDateTime localDateTime = LocalDateTime.now(); System.out.println(localDate); System.out.println(localTime); System.out.println(localDateTime); //of():设置指定的n年月日时分秒。没有偏移量 LocalDateTime localDateTime1 = localDateTime.of(2020, 10, 6, 12, 23, 45); System.out.println(localDateTime1); //getXXX() System.out.println(localDateTime.getDayOfMonth()); System.out.println(localDateTime.getDayOfWeek()); System.out.println(localDateTime.getDayOfYear()); System.out.println(localDateTime.getMonthValue()); System.out.println(localDateTime.getMonth()); //体现不可变性 //withxxx():设置相关的属性 LocalDateTime localDateTime2 = localDateTime.withDayOfMonth(10); System.out.println(localDateTime); System.out.println(localDateTime2); //不可变性,加或减相应的时间 LocalDateTime localDateTime3 = localDateTime.plusMonths(3); System.out.println(localDateTime); System.out.println(localDateTime3); LocalDateTime localDateTime4 = localDateTime.minusMonths(2); System.out.println(localDateTime); System.out.println(localDateTime4); }
/* Instant的使用 */ @Test public void test2(){ //now():获取本初子午线对应的标准时间 Instant instant = Instant.now(); System.out.println(instant); //添加时间偏移量 OffsetDateTime offsetDateTime = instant.atOffset(ZoneOffset.ofHours(8)); System.out.println(offsetDateTime); //toEpochMilli():获取1970年01月01日00时00分00秒对应的毫秒数 long epochMilli = instant.toEpochMilli(); System.out.println(epochMilli); //ofEpochMilli():通过给定的毫秒数,获取Instant实例 -->Date(long millis) Instant instant1 = Instant.ofEpochMilli(1599999607466L); System.out.println(instant1); }
/* DateTimeFormatter的使用 */ @Test public void test3(){ //方式一:预定义的标准格式。如:ISO_LOCAL_DATE_TIME;ISO_LOCAL_DATE;ISO_LOCAL_TIME DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; //格式化:日期 --> 字符串 LocalDateTime localDateTime = LocalDateTime.now(); String str1 = formatter.format(localDateTime); System.out.println(localDateTime); System.out.println(str1); //解析:字符串 --> 日期 TemporalAccessor temporalAccessor = formatter.parse(str1); System.out.println(temporalAccessor); //方式二: // 本地化相关的格式。如:ofLocalizedDateTime() // FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT :适用于LocalDateTime DateTimeFormatter formatter1 = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM); //格式化 String str2 = formatter1.format(localDateTime); System.out.println(str2);//2020年9月14日 下午9:09:38 //本地化相关的格式。如:ofLocalizedDate() //FormatStyle.FULL / FormatStyle.LONG / FormatStyle.MEDIUM / FormatStyle.SHORT : 适用于LocalDate DateTimeFormatter formatter2 = DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL); String str3 = formatter2.format(LocalDate.now()); System.out.println(str3);//2020年9月14日星期一 //重点: 方式三:自定义的格式。如:ofPattern(“yyyy-MM-dd hh:mm:ss”) DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss"); //格式化 String str4 = formatter3.format(LocalDateTime.now()); System.out.println(str4);//2020-09-14 09:12:44 //解析 TemporalAccessor parse = formatter3.parse("2020-09-14 09:12:44"); System.out.println(parse); }
实现 Comparable 的类必须实现 compareTo(Object obj) 方法,两个对象即 通过 compareTo(Object obj) 方法的返回值来比较大小。如果当前对象this大 于形参对象obj,则返回正整数,如果当前对象this小于形参对象obj,则返回 负整数,如果当前对象this等于形参对象obj,则返回零。
对于字符串对象的排序:@Test public void test1(){ String[] arr = new String[]{ "AA","JJ","ZZ","GG","MM"}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }
对于自定义类的排序,需要实现Comparable接口
/** * 商品类 */public class Goods implements Comparable { private String name; private double price; public Goods(String name, double price) { this.name = name; this.price = price; } public Goods() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } @Override public String toString() { return "Goods{" + "name='" + name + '\'' + ", price=" + price + '}'; } //指明商品比较大小的方式:按照价格从低到高排序,再按照产品名称从高到低排序 @Override public int compareTo(Object o) { if(o instanceof Goods){ Goods goods = (Goods)o; //方式一: if(this.price > goods.price){ return 1; }else if(this.price < goods.price){ return -1; }else{ //return 0; return -this.name.compareTo(goods.name); } //方式二// return Double.compare(this.price,goods.price); }// return 0; throw new RuntimeException("传入的数据类型不一致"); }}/** * 测试类 */ @Test public void test2(){ Goods[] arr = new Goods[5]; arr[0] = new Goods("lenovoMouse",34); arr[1] = new Goods("xiaomiMouse",12); arr[2] = new Goods("dellMouse",60); arr[3] = new Goods("huaweiMouse",45); arr[4] = new Goods("microsoMouse",45); Arrays.sort(arr); System.out.println(Arrays.toString(arr)); }
@Test public void test3(){ String[] arr = new String[]{ "AA","JJ","ZZ","GG","MM"}; Arrays.sort(arr, new Comparator() { //按照字符串从大到小的顺序排列 @Override public int compare(String o1, String o2) { if(o1 instanceof String && o2 instanceof String){ String s1 = (String)o1; String s2 = (String)o2; return -s1.compareTo(s2); } throw new RuntimeException("输入的数据类型不一致"); } }); System.out.println(Arrays.toString(arr)); }
@Test public void test4(){ //指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序 Goods[] arr = new Goods[5]; arr[0] = new Goods("lenovoMouse",34); arr[1] = new Goods("xiaomiMouse",12); arr[2] = new Goods("dellMouse",60); arr[3] = new Goods("huaweiMouse",45); arr[4] = new Goods("microsoMouse",45); Arrays.sort(arr, new Comparator() { @Override public int compare(Goods o1, Goods o2) { if(o1 instanceof Goods && o2 instanceof Goods){ Goods g1 = (Goods)o1; Goods g2 = (Goods)o2; if(g1.getName().equals(g2.getName())){ return Double.compare(g1.getPrice(), g2.getPrice()); }else{ return g1.getName().compareTo(g2.getName()); } } throw new RuntimeException("输入的数据类型不一致!!"); } }); System.out.println(Arrays.toString(arr)); }
Comparable接口的方式一旦一定,保证Comparable接口实现类的对象在任何位置都可以比较大小
Comparator接口属于临时性的比较System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。
String getProperty(String key):该方法的作用是获得系统中属性名为key的属性对应的值。系统中常见 的属性名以及属性的作用如下表所示:@Test public void test1(){ String javaVersion = System.getProperty("java.version"); System.out.println("java的version:" + javaVersion); String javaHome = System.getProperty("java.home"); System.out.println("java的home:" + javaHome); String osName = System.getProperty("os.name"); System.out.println("os的name:" + osName); String osVersion = System.getProperty("os.version"); System.out.println("os的version:" + osVersion); String userName = System.getProperty("user.name"); System.out.println("user的name:" + userName); String userHome = System.getProperty("user.home"); System.out.println("user的home:" + userHome); String userDir = System.getProperty("user.dir"); System.out.println("user的dir:" + userDir); }
java.lang.Math提供了一系列静态方法用于科学计算。其方法的参数和返回 值类型一般为double型
一些常用的方法: abs 绝对值 acos,asin,atan,cos,sin,tan 三角函数 sqrt 平方根 pow(double a,doble b) a的b次幂 log 自然对数 exp e为底指数 max(double a,double b) min(double a,double b) random() 返回0.0到1.0的随机数 long round(double a) double型数据a转换为long型(四舍五入) toDegrees(double angrad) 弧度—>角度 toRadians(double angdeg) 角度—>弧度java.math包的BigInteger可以表示不可变的任意精度的整数
BigInteger(String val):根据字符串构建BigInteger对象
public BigInteger abs():返回此 BigInteger 的绝对值的 BigInteger BigInteger add(BigInteger val) :返回其值为 (this + val) 的 BigInteger BigInteger subtract(BigInteger val) :返回其值为 (this - val) 的 BigInteger BigInteger multiply(BigInteger val) :返回其值为 (this * val) 的 BigInteger BigInteger divide(BigInteger val) :返回其值为 (this / val) 的 BigInteger,整数 相除只保留整数部分
BigInteger remainder(BigInteger val) :返回其值为 (this % val) 的BigInteger BigInteger[] divideAndRemainder(BigInteger val):返回包含 (this / val) 后跟 (this % val) 的两个 BigInteger 的数组 BigInteger pow(int exponent) :返回其值为 (thisexponent) 的 BigInteger商业计算中, 要求数字精度比较高,故用到java.math.BigDecimal类
BigDecimal类支持不可变的、任意精度的有符号十进制定点数public BigDecimal(double val)
public BigDecimal(String val)public BigDecimal add(BigDecimal augend)
public BigDecimal subtract(BigDecimal subtrahend) public BigDecimal multiply(BigDecimal multiplicand) public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)public class StringDemo { public static void main(String[] args) { String str = " 123 45 "; System.out.println(str); System.out.println(str.trim()); System.out.println("**********"); System.out.println(trim_test(str)); } private static String trim_test(String str){ if(str != null){ int start = 0; int end = str.length() - 1; while(start < end && str.charAt(start)==' '){ start++; } while(start < end && str.charAt(end) == ' '){ end--; } if(str.charAt(start) == ' '){ return ""; } return str.substring(start, end+1); }else{ return null; } }}
package com.wzc.exer;public class StringDemo2 { /* 将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg” */ public static void main(String[] args) { String str = "abcdefg"; System.out.println(Reverse(str,2,5)); System.out.println(Reverse1(str,2,5)); System.out.println(Reverse2(str,2,5)); } /* 方式一:转换为char[] */ public static String Reverse(String str, int startIndex, int endIndex){ if(str != null){ char temp; char[] arr = str.toCharArray(); for(int x=startIndex, y=endIndex; x= startIndex; i--){ reverseStr += str.charAt(i); } //第三部分 reverseStr += str.substring(endIndex+1); return reverseStr; } return null; } //方式三:使用StringBuffer/StringBuidler替换String public static String Reverse2(String str, int startIndex, int endIndex){ if(str!= null){ StringBuilder builder = new StringBuilder(str.length()); //第一部分 builder.append(str.substring(0,startIndex)); //第二部分 for (int i = endIndex; i >= startIndex ; i--) { builder.append(str.charAt(i)); } //第三部分 builder.append(str.substring(endIndex+1)); return builder.toString(); } return null; }}
public class StringDemo3 { /* 获取一个字符串在另一个字符串中出现的次数。 比如:获取“ab”在 “abkkcadkabkebfkaabkskab” 中出现的次数 */ public static void main(String[] args) { String mainStr = "abkkcadkabkebfkaabkskab"; String subStr = "ab"; System.out.println(getCount(mainStr,subStr)); } public static int getCount(String mainStr, String subStr){ int mainLen = mainStr.length(); int subLen = subStr.length(); int count = 0; int index; int index2 = 0; if(mainLen >= subLen){ //方式一:// while( (index = mainStr.indexOf(subStr)) != -1){ // count++;// mainStr = mainStr.substring(index + subStr.length());// } //方式二:对方式一的改进 while((index2 = mainStr.indexOf(subStr,index2)) != -1){ count++; index2 += subStr.length(); } return count; }else{ return 0; } }}
练习一:字符串“2020-09-08”转换为java.sql.Date
@Test public void test1() throws ParseException { String birth = "2020-09-08"; SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf1.parse(birth); java.sql.Date date1 = new java.sql.Date(date.getTime()); System.out.println(date1); }
参考资料:
[1]尚硅谷宋康红java基础教程转载地址:http://tkgwb.baihongyu.com/