java.lang.String类的使用
String:字符串,使用一对“”引起来表示。
String声明位final的,不可以被继承;
String实现了Serializable接口,表示字符串可以被序列化;
实现了Comparable接口,表示String可以比较大小;
String内部定义了final char[] value用于存储字符串数据;还是private私有的。
通过字面量的方式(区别于new给一个字符串赋值),此时的字符串值声明在字符串常量池中。
字符串常量池中是不会存储相同内容。
方式1:通过字面量定义的方式
方式2:通过new+构造器的方式
String(),空参构造器,内部value = “”.valueString(String str)String(char[] c)String(char[], int offset, int count)String(byte[])String(byte[], Charset charset)String(byte[], int offset, int length)String(byte[], int offset, int length, String 字符集编码格式)String(StringBuffer sbf, StringBuilder sbd)String str = ”hadoop“
字符串的长度:str.length()
字符串的某个元素:str.charAt(0)
字符串转大写:str.toUpperCase()
字符串转小写:str.toLowerCase()
字符串切片:str.subString(2);从第2个开始一直到最后
str.subString(2, 4);从索引2到索引4,中间的2个字符
字符串是否为空:str.isEmpty()
字符串去掉首尾的空格:str.trim()
判断俩个字符串是否相等:str.equals(str1)
判断两个字符串在忽略大小写的情况下是否相等:str.equalsIgnoreCase(str1)
比较两个字符串的大小:str.compareTo(str1)
比较两个字符串在忽略大小写的情况下的大小:str.compareToIgnoreCase(str1)
判断字符串是否以字串开头:str.startsWith(str1)
判断字符串是否以字串结尾:str.endsWith(str1)
String str= “now is a big data day hadoop and spark are both big data structure”;判断字符串中是否包含字串:str.contains(str1)取某个字串在字符串中首次出现的索引:str.indexOf(str1)从某处起,取某个字串在字符串中首次出现的索引:str.indexOf(str1, 12)取某个字串,在字符串中最后一次出现的索引:str.lastIndexOf(str1)用指定字符替换字符:str.replace(‘a’, ‘e’)用指定字符串替换字符串:str.replace(“big”, “small”)按指定的字符分割字符串:str.split(" ") 第一波~int length():返回字符串的长度: return value.length char charAt(int index): 返回某索引处的字符return value[index] boolean isEmpty():判断是否是空字符串:return value.length == 0 String toLowerCase():使用默认语言环境,将 String 中的所字符转换为小写 String toUpperCase():使用默认语言环境,将 String 中的所字符转换为大写 String trim():返回字符串的副本,忽略前导空白和尾部空白 boolean equals(Object obj):比较字符串的内容是否相同 boolean equalsIgnoreCase(String anotherString):与equals方法类似,忽略大小写 String concat(String str):将指定字符串连接到此字符串的结尾。 等价于用“+” int compareTo(String anotherString):比较两个字符串的大小 String substring(int beginIndex):返回一个新的字符串,它是此字符串的从beginIndex开始截取到最后的一个子字符串。 String substring(int beginIndex, int endIndex) :返回一个新字符串,它是此字符串从beginIndex开始截取到endIndex(不包含)的一个子字符串。
第二波~boolean endsWith(String suffix):测试此字符串是否以指定的后缀结束 boolean startsWith(String prefix):测试此字符串是否以指定的前缀开始 boolean startsWith(String prefix, int toffset):测试此字符串从指定索引开始的子字符串是否以指定前缀开始
boolean contains(CharSequence s):当且仅当此字符串包含指定的 char 值序列时,返回 true int indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引 int indexOf(String str, int fromIndex):返回指定子字符串在此字符串中第一次出现处的索引,从指定的索引开始 int lastIndexOf(String str):返回指定子字符串在此字符串中最右边出现处的索引 int lastIndexOf(String str, int fromIndex):返回指定子字符串在此字符串中最后一次出现处的索引,从指定的索引开始反向搜索
注:indexOf和lastIndexOf方法如果未找到都是返回-1
第三波~替换: String replace(char oldChar, char newChar):返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所 oldChar 得到的。 String replace(CharSequence target, CharSequence replacement):使用指定的字面值替换序列替换此字符串所匹配字面值目标序列的子字符串。 String replaceAll(String regex, String replacement):使用给定的 replacement 替换此字符串所匹配给定的正则表达式的子字符串。 String replaceFirst(String regex, String replacement):使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 匹配: boolean matches(String regex):告知此字符串是否匹配给定的正则表达式。 切片: String[] split(String regex):根据给定正则表达式的匹配拆分此字符串。 String[] split(String regex, int limit):根据匹配给定的正则表达式来拆分此字符串,最多不超过limit个,如果超过了,剩下的全部都放到最后一个元素中。
编码:String --> byte[]:调用String的getBytes() 解码:byte[] --> String:调用String的构造器
编码:字符串 -->字节 (看得懂 —>看不懂的二进制数据) 解码:编码的逆过程,字节 --> 字符串 (看不懂的二进制数据 —> 看得懂
说明:解码时,要求解码使用的字符集必须与编码时使用的字符集一致,否则会出现乱码。
@Test public void test3() throws UnsupportedEncodingException { String str1 = "abc123中国"; byte[] bytes = str1.getBytes();//使用默认的字符集,进行编码。 System.out.println(Arrays.toString(bytes)); byte[] gbks = str1.getBytes("gbk");//使用gbk字符集进行编码。 System.out.println(Arrays.toString(gbks)); System.out.println("******************"); String str2 = new String(bytes);//使用默认的字符集,进行解码。 System.out.println(str2); String str3 = new String(gbks); System.out.println(str3);//出现乱码。原因:编码集和解码集不一致! String str4 = new String(gbks, "gbk"); System.out.println(str4);//没出现乱码。原因:编码集和解码集一致! }1)模拟一个trim方法,去除字符串两端的空格。
2)将一个字符串进行反转。将字符串中指定部分进行反转。比如“abcdefg”反转为”abfedcg”
3)获取一个字符串在另一个字符串中出现的次数。 比如:获取“ ab”在 “abkkcadkabkebfkabkskab” 中出现的次数
public class Test7 { public static void main(String[] args) { String mainStr = "abkkcadkabkebfkabkskab"; String subStr = "ab"; int count = countSubStr(mainStr, subStr); System.out.println(count); } public static int countSubStr(String mainStr, String subStr){ int count = 0; int index = 0; if (subStr.length() > 0){ if (mainStr.length() >= subStr.length()){ while ((index = mainStr.indexOf(subStr, index)) != -1){ index += subStr.length(); count++; } } } return count; } }4)获取两个字符串中最大相同子串。比如: str1 = "abcwerthelloyuiodef“;str2 = “cvhellobnm” 提示:将短的那个串进行长度依次递减的子串与较长的串比较。
public class Test6 { public static void main(String[] args) { String str1 = "abcwerthelloyuiodef"; String str2 = "cvhellobnm"; String string = maxSameStr(str1, str2); System.out.println(string); } public static String maxSameStr(String str1, String str2){ //str1 = "abcwerthelloyuiodef“; str2 = "cvhellobnm" String maxStr = str1.length() > str2.length() ? str1 : str2; String minStr = str1.length() < str2.length() ? str1 : str2; int length = minStr.length(); //和求两个数的最大公约数一样,从小的开始依次递减的去寻找 //外循环定义的是一共遍历多少轮 for (int i = 0; i < minStr.length(); i++) { //内循环定义两个指针,x表示头指针,y表示尾指针,循环的条件是y不超过minString的长度。 for (int x = 0, y = length - i; y <= length; x++,y++) { String substr = minStr.substring(x, y); if (maxStr.contains(substr)){ return substr; } } } return null; } }5)对字符串中字符进行自然顺序排序。 提示: 1字符串变成字符数组。 2对数组排序,择,冒泡,Arrays.sort(); 3将排序后的数组变成字符串。
String str = new String();//char[] value = new char[0];
String str1 = new String(“abc”);//char[] value = new char[]{‘a’, ‘b’, ‘c’};
StringBuffer sb1 = new StringBuffer();//char[] value = new char[16];底层创建了一个长度为16的数组;
System.out.println(sb1.lengtg());//输出0,原因是,存储的有效元素的个数。
sb1.append(‘a’);//value[0] = ‘a’;
sb1.append(‘b’);//value[1] = ‘b’;
StringBuffer sb2 = new StringBuffer(“abc”);//char[] value = new char[“abc”.length() + 16];
问题1:System.out.println(sb2.length()); //3
虽然开辟了字符串长度+16的char数组,但是长度是有效元素的个数。
问题2:扩容问题:
如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
默认情况下,扩容为原来容量16的2倍 + 2,同时将原数组中的元素复制到新的数组中。指导意义:开发中建议使用:StringBuffer(int capacity)或StringBuilder(int capacity)
从高到低排序:
StringBuilder > StringBuffer > String
返回当前时间与1970年1月1日0时0分0秒之间以毫秒为单位的时间差。
@Test public void test1(){ long currentTimeMillis = System.currentTimeMillis(); System.out.println(currentTimeMillis); }java.util.Date类
/ — java.sql.Date类
两个构造器的使用、
构造器1:Date() 创建一个对应当前时间的Date对象。
Date date = new Date(); //Date类重写了toString方法 System.out.println(date);//Thu Sep 03 16:51:29 CST 2020 long time = date.getTime();//获取date对象的时间1599123170605 System.out.println(time);构造器2:Date(long time) 创建一个指定毫秒数的Date对象
Date date1 = new Date(1599123089972L); System.out.println(date1);//Thu Sep 03 16:51:29 CST 2020两个方法的使用:
toString()显示当前的年、月、日、时、分、秒getTime()获取当前Date对象对应的毫秒数。(时间戳)java.sql.Date对应数据库中的日期类型的变量
如何实例化?
如何将java.util.Date对象转换成java.sql.Date对象
java.sql.Date date2 = new java.sql.Date(1599123170605L); System.out.println(date2);//2020-09-03 java.sql.Date date2 = new java.sql.Date(new Date().getTime()); System.out.println(date2);SimpleDateFormat对日期Date类的格式化和解析
两个操作: 格式化:日期 —> 字符串解析:字符串 —> 日期 //使用空参的构造器实例化SimpleDateFormat SimpleDateFormat simpleDateFormat = new SimpleDateFormat(); //格式化 String format = simpleDateFormat.format(new Date()); System.out.println(format);//20-9-3 下午5:01 //解析 Date parse = simpleDateFormat.parse("20-9-3 下午5:01"); System.out.println(parse);//Thu Sep 03 17:01:00 CST 2020按照指定格式进行格式化和解析:
两个构造器: SimpleDateFormat()SimpleDateFormat(“yyyy-MM-dd hh:mm:ss”) @Test public void test2() throws ParseException { //使用空参的构造器实例化SimpleDateFormat SimpleDateFormat simpleDateFormat = new SimpleDateFormat(); //格式化 String format = simpleDateFormat.format(new Date()); System.out.println(format);//20-9-3 下午5:01 //解析 Date parse = simpleDateFormat.parse("20-9-3 下午5:01"); System.out.println(parse);//Thu Sep 03 17:01:00 CST 2020 //使用指定格式的构造器实例化SimpleDateFormat SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); //格式化 String format1 = simpleDateFormat1.format(new Date()); System.out.println(format1);//2020-09-03 05:06:16 //解析 Date parse1 = simpleDateFormat1.parse("2020-09-03 05:06:16"); System.out.println(parse1);//Thu Sep 03 05:06:16 CST 2020 }日历类、抽象类
如何实例化?
方法1:创建其子类GregorianCalendar的对象(×)方法2:调用其静态方法getInstance()(√)常用方法:
get()
Calendar instance = Calendar.getInstance(); int month = instance.get(Calendar.MONTH); System.out.println(month);//MONTH-1 int dayOfMonth = instance.get(Calendar.DAY_OF_MONTH); System.out.println(dayOfMonth);//正确的当月第几天 int dayOfWeek = instance.get(Calendar.DAY_OF_WEEK); System.out.println(dayOfWeek);//星期日是1;星期六是7;set()
//calendar可变性 calendar.set(Calendar.DAY_OF_MONTH,22); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days);add()
calendar.add(Calendar.DAY_OF_MONTH,-3); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days);getTime()
//getTime():日历类---> Date Date date = calendar.getTime(); System.out.println(date);setTime()
Date date1 = new Date(); calendar.setTime(date1); days = calendar.get(Calendar.DAY_OF_MONTH); System.out.println(days);第一代:jdk 1.0 Date类 第二代:jdk 1.1 Calendar类,一定程度上替换Date类 第三代:jdk 1.8 提出了新的一套API
前两代出现的问题可变性:像日期和时间这样的类应该是不可变的。 偏移性:Date中的年份是从1900开始的,而月份都从0开始。 格式化:格式化只对Date用,Calendar则不行。 此外,它们也不是线程安全的;不能处理闰秒等。jdk 1.8中新的日期时间API设计的包:
now()获取当前的日期、时间、日期和时间
LocalDateTime now = LocalDateTime.now(); LocalDate now1 = LocalDate.now(); LocalTime now2 = LocalTime.now(); System.out.println(now);//2020-09-03T17:24:43.268 System.out.println(now1);//2020-09-03 System.out.println(now2);//17:24:43.268of()设置指定的年月日时分秒。没有偏移量
LocalDateTime localDateTime = LocalDateTime.of(1996, 9, 30, 13, 32, 11, 2); System.out.println(localDateTime);//1996-09-30T13:32:11.000000002 LocalDate localDate = LocalDate.of(1999, 2, 12); System.out.println(localDate); LocalTime localTime = LocalTime.of(23, 12, 23); System.out.println(localTime);//23:12:23getXxx()获取相关的属性
LocalDateTime now = LocalDateTime.now(); int dayOfMonth = now.getDayOfMonth(); System.out.println(dayOfMonth);//当前是这个月的第几天 DayOfWeek dayOfWeek = now.getDayOfWeek(); System.out.println(dayOfWeek);//THURSDAYwithXxx设置相关的属性(体现了不可变性)
LocalDateTime localDateTime = now.withDayOfMonth(12); System.out.println(localDateTime);//2020-09-12T17:31:51.431Comparable和Comparetor同为接口,
Comparable接口的方式一旦确定,保证Comparable接口实现类的对象在任何位置都可以比较大小。
Comparator接口属于临时的比较。
Comparable接口的使用举例: 自然排序
1.像String、包装类等实现了Comparable接口,重写了compareTo(obj)方法,给出了比较两个对象大小的方式。 2.像String、包装类重写compareTo()方法以后,进行了从小到大的排列 3.重写compareTo(obj)的规则: 如果当前对象this大于形参对象obj,则返回正整数, 如果当前对象this小于形参对象obj,则返回负整数, 如果当前对象this等于形参对象obj,则返回零。 4.对于自定义类来说,如果需要排序,我们可以让自定义类实现Comparable接口,重写compareTo(obj)方法。 在compareTo(obj)方法中指明如何排序
@Test public void test1(){ String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); } @Test public void test2(){ Goods[] arr = new Goods[5]; arr[0] = new Goods("lenovoMouse",34); arr[1] = new Goods("dellMouse",43); arr[2] = new Goods("xiaomiMouse",12); arr[3] = new Goods("huaweiMouse",65); arr[4] = new Goods("microsoftMouse",43); Arrays.sort(arr); System.out.println(Arrays.toString(arr)); } class Good implements Comparable{ private String name; private double price; public Goods() { } public Goods(String name, double price) { this.name = name; this.price = price; } 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) { // System.out.println("**************"); 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("传入的数据类型不一致!"); } } }① java.math包的BigInteger可以表示不可变的任意精度的整数。 ② 要求数字精度比较高,用到java.math.BigDecimal类
@Test public void test2() { BigInteger bi = new BigInteger("1243324112234324324325235245346567657653"); BigDecimal bd = new BigDecimal("12435.351"); BigDecimal bd2 = new BigDecimal("11"); System.out.println(bi); // System.out.println(bd.divide(bd2)); System.out.println(bd.divide(bd2, BigDecimal.ROUND_HALF_UP)); System.out.println(bd.divide(bd2, 25, BigDecimal.ROUND_HALF_UP)); }