知识点:
包装类基本知识
JAVA并不是纯面向对象的语言。Java语言是一个面向对象的语言,但是Java中的基本数据类型却是不面向对象的。
但是我们在实际使用中经常需要将基本数据转化成对象,便于操作。比如:集合的操作中。
例如使用Map对象要操作put()方法时,需要传入的参数是对象而不是基本数据类型。
为了解决这个不足,在设计类时为每个基本数据类型设计了一个对应的类进行代表,这样八个和基本数据类型对应的类统称为包装类(Wrapper Class)。
1)定义:将基本类型封装成类,其中包含属性和方法以方便对象操作。
2)包装类均位于java.lang包,包装类和基本数据类型的对应关系如下表所示:
Eg:*byte---->Byte
*short--->Short
*long--->Long
*float--->Float
*double--->Double
*boolean--->Boolean
*int--->Integer
*char---->Character
2)装箱:将基本数据类型转换成包装类型。
3)拆箱:将包装类型转换成基本数据类型。
注意:从JDK1.5之后支持自动装箱和拆箱
包装类的用途
对于包装类说,这些类的用途主要包含两种:
a、作为和基本数据类型对应的类型存在,方便涉及到对象的操作。
b、包含每种基本数据类型的相关属性如最大值、最小值等,以及相关的操作方法(这些操作方法的作用是在基本类型数据、包装类对象、字符串之间提供转化!)。
Eg:
1 package cn.zzsxt.commontype; 2 3 public class Test1 { 4 public static void main(String[] args) { 5 System.out.println("所有包装类都应该具有的方法是:"); 6 System.out.println(" A.将基本数据类型转化为Integer对象的两个方法:"); 7 System.out.println("\t方法1:使用Integer类的构造方法:new Integer(int value);"); 8 Integer i = new Integer(123);//装箱 9 System.out.println("\t方法2:使用Integer类的实例方法:valueOf(int i);"); 10 Integer ii = Integer.valueOf(123); 11 System.out.println(); 12 int i2 = i.intValue();//拆箱 13 Integer i4 = 100;//自动装箱 14 int i3 = Integer.valueOf(123);//自动 拆箱 15 System.out.println(" B.将字符串转化为Integer对象的两种方法:"); 16 Integer i5 = Integer.parseInt("123"); 17 System.out.println("\t字符串\"123\"转化的Integer对象的字符表示:"+i5); 18 Integer i6 = new Integer("123"); 19 System.out.println("\t字符串\"123\"转化的Integer对象的字符表示:"+i6); 20 System.out.println(); 21 System.out.println(" C.将Integer对象转换成字符串:"); 22 String str = i6.toString(); 23 System.out.println("\tInteger对象i6转成的字符串为:"+str); 24 System.out.println(); 25 System.out.println(" D.将Integer对象转化成int:"); 26 int m = i6.intValue(); 27 System.out.println("\tint类型值m="+m); 28 System.out.println(); 29 System.out.println(" E.将基本数据类型转化为Integer类型的对象的两种方法:"); 30 // System.out.println("将一个int类型的值转化为Integer类型的值的方法为:Integer.valueOf(int num);"); 31 Integer i7 = Integer.valueOf(100);//将一个int值转换成Integer类型 32 System.out.println("\tint类型值100转化成Integer对象的字符串表示:"+i7); 33 Integer i8 = new Integer(100); 34 System.out.println("\tint类型值100转化成Integer对象的字符串表示:"+i8); 35 System.out.println(); 36 System.out.println("Integer类型的属性值为:"); 37 System.out.println("\tint类型最大值(Integer.MAX_VALUE)="+Integer.MAX_VALUE); 38 System.out.println("\tint类型最小值(Integer.MIN_VALUE)="+Integer.MIN_VALUE); 39 System.out.println(); 40 System.out.println("进制转化的方法的应用:"); 41 System.out.println("\t使用Integer类的toBinaryString()方法,将123转化为对应二进制="+Integer.toBinaryString(123)); 42 System.out.println("\t使用Integer类的toOctalString()方法,将123转化为对应八进制="+Integer.toOctalString(123)); 43 System.out.println("\t使用Integer类的toHexString()方法,将123转化为对应十六进制="+Integer.toHexString(123)); 44 } 45 }
运行结果:
面试题1:
1 package cn.zzsxt.commontype; 2 /** 3 * 4 * @author LIZHENXI_1 5 * 面试题1: 6 */ 7 public class Test2 { 8 public static void main(String[] args) { 9 Integer i1 = new Integer(123); 10 Integer i2 = new Integer("123"); 11 Integer i5 = Integer.valueOf(123); 12 Integer i7 = Integer.valueOf("123"); 13 14 int i3 = 123; 15 int i4 = i2.intValue(); 16 int i6 = Integer.parseInt("123"); 17 System.out.println(i1==i2);//比较的是两个对象的引用(地址) 18 System.out.println(i1==i5); 19 System.out.println(i1==i7); 20 System.out.println(); 21 System.out.println(i2==i7); 22 System.out.println(i2==i5); 23 System.out.println(); 24 System.out.println(i1.equals(i2)); 25 System.out.println(i1.equals(i5)); 26 System.out.println(i1.equals(i7)); 27 System.out.println(i1.equals(i2));//比较的是对象的内容 28 System.out.println(); 29 System.out.println(i3==i4);//比较的是值 30 System.out.println(i3==i1);//将i1自动拆箱为基本数据类型进行比较 31 } 32 }
面试题2:
1 package cn.zzsxt.commontype; 2 /** 3 * [1.Java字符串就是Unicode字符序列,例如串“Java”就是4个Unicode字符J,a,v,a组成的。] 4 * [2.Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义的类String,每个用双引号括起来的字符串都是String类的一个实例] 5 * [3.Java允许使用符号"+"把两个字符串连接起来] 6 * {符号“+”把两个字符串按给定的顺序连接在一起,并且是完全按照给定的形式。 7 * 当“+”运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换为字符串然后再进行连接} 8 * 9 * @author LIZHENXI_1 10 * 面试题2: 11 */ 12 public class TestString { 13 public static void main(String[] args) { 14 String str1 = "zzsxt"; 15 String str2 = "zzsxt"; 16 String str3 = new String("zzsxt"); 17 String str4 = new String("zzsxt"); 18 19 System.out.println(str1==str2);//常量池 20 System.out.println(str1.equals(str2));//比较内容 21 System.out.println(str3==str4);//比较的是对象的引用 22 System.out.println(str3.equals(str4));//比较内容 23 24 String str5 = new String("123"); 25 String str6 = Integer.toString(123); 26 System.out.println(str5.equals(str6)); 27 } 28 }
java.lang.String类:常见构造方法和常用实例方法:
应用1:
1 package cn.zzsxt.commontype; 2 /** 3 *java.lang.String:不可变的字符序列。 4 *常用的构造方法 5 *String(String original) 6 *String() 7 *String(char[] value) 8 *常用的方法: 9 *length():获取字符串的长度 10 *charAt(int index):查看指定下标的字符,字符串的下标从零开始 11 *toUpperCase():转大写 12 *toLowerCase():转小写 13 *equals(String s):比较字符串的内容是否相等 14 *equalsIgnoreCase(String s):忽略大小写比较内容是否相等 15 *indexOf(String s):索引指定字符串s在当前字符串的出现的下标位置,如果查找不到返回-1,如果存在多个将返回第一个字符串的下标位置 16 *lastIndexOf(String s):索引指定字符串s在当前字符串的最后出现的下标位置 17 *substring(int beginIndex):字符串截取从beginIndex开始截取到最后。 18 *substring(int beginIndex,int endIndex):字符截取从beginIndex开始,到endIndex-1结束。不包含end位置 19 *trim():去掉前后空格,中间空格无法去除。 20 *startsWith(String prefix):测试此字符串是否以指定的前缀开始 21 *endsWith(String suffix):测试此字符串是否以指定的后缀结束 22 */ 23 public class TestString2 { 24 public static void main(String[] args) { 25 String str1 = "hello,zzsxt!"; 26 String str2 = "Hello,zzsxt!"; 27 String str3 = " hello,zzsxt"; 28 System.out.println("str1字符串的长度:"+str1.length()); 29 System.out.println("查看str1指定index处的字符:"+str1.charAt(2)); 30 System.out.println("把str1转换成大写:"+str1.toUpperCase()); 31 System.out.println("把str1转换成小写:"+str1.toLowerCase()); 32 System.out.println("比较str1和str2内容是否相等:"+str1.equals(str2)); 33 System.out.println("忽略大小写比较str1和str2内容是否相等:"+str1.equalsIgnoreCase(str2)); 34 System.out.println("索引指定字符在字符串str1中第一次出现的位置:"+str1.indexOf("l")); 35 System.out.println("索引指定字符在字符串str1最后一次出现的位置:"+str1.indexOf("l")); 36 System.out.println("截取字符串指定位置index处的子字符串:"+str1.substring(6)); 37 System.out.println("截取字符串从beginIndex位置到endIndex位置处的子字符串:"+str2.substring(0, 5)); 38 System.out.println("去掉字符串的前后空格:"+str3.trim()); 39 System.out.println("指定字符串str2是否以指定前缀开头:"+str2.startsWith("H")); 40 System.out.println("指定字符串str2是否以指定后缀结尾:"+str2.endsWith("!")); 41 } 42 }
应用2:
1 package cn.zzsxt.commontype; 2 /** 3 * 4 * @author LIZHENXI_1 5 * public String replace(char oldChar,char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。 6 * public String replace(CharSequence target,CharSequence replacement)使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串。 7 * public String[] split(String regex)根据给定正则表达式的匹配拆分此字符串。 8 */ 9 public class TestString3 { 10 public static void main(String[] args) { 11 String str = "hello,bjsxt!"; 12 String str2 = str.replace(‘!‘, ‘.‘); 13 String str7 = str.replace("bjsxt!", "zzsxt."); 14 System.out.println(str7); 15 System.out.println(str2); 16 String str3 = "java,html,oracle,mysql"; 17 String[] strs = str3.split(","); 18 for (String string : strs) { 19 System.out.println(string); 20 } 21 String str5 = str2.concat(str3); 22 String str6 = str2 + str3; 23 System.out.println(str5); 24 System.out.println(str6); 25 } 26 27 }
应用3:String类使用的综合应用:
1 package cn.zzsxt.commontype2; 2 3 import java.util.Scanner; 4 5 /** 6 * String类的使用。 7 * 带参方法的定义和使用 8 * 需求说明: 9 * 实现会员注册,要求用户名长度不小于3,密码长度不小于6,注册时两次输入密码必须相同 10 * 实现思路: 11 * 1、创建类Register 12 * 2、创建验证方法verify() 13 * 3、调用方法测试程序 14 * 难点指导: 15 * 创建验证方法verify() 16 * 17 * 18 */ 19 public class Register { 20 /** 21 * 核实输入是否符合要求 22 */ 23 public static boolean verify() { 24 boolean isVerify = true;//默认符合要求 25 Scanner input = new Scanner(System.in); 26 // System.out.println("欢迎进入注册向系统"); 27 System.out.println("请输入注册名:"); 28 String name = input.next(); 29 System.out.println("请输入用户密码:"); 30 String password = input.next(); 31 System.out.println("请确认输入的密码:"); 32 String password2 = input.next(); 33 String message = ""; 34 /* if(name.length()<3||password.length()<6||password.equals(password2) { 35 * isVerify = false; 36 System.out.println("用户长度不能小于3,密码长度不能小于6,两次输入的密码不能相同!"); 37 } 38 if(password.equals(password2)) { 39 System.out.println("两次输入的密码不同!"); 40 }else { 41 }*/ 42 if(name.length()<3) { 43 message = "用户名长度不能小于3!"; 44 isVerify = false; 45 } 46 if(password.length()<6) { 47 message += "密码长度不能小于6!"; 48 isVerify = false; 49 } 50 if(!password2.equals(password)) { 51 message += "两次输入的密码不相同!"; 52 isVerify = false; 53 } 54 System.out.println(message); 55 return isVerify; 56 } 57 58 public static void main(String[] args) { 59 System.out.println("*****欢迎进入注册系统*****"); 60 boolean is = verify(); 61 while(!is) { 62 verify(); 63 } 64 System.out.println("注册成功,请牢记用户名和密码!"); 65 } 66 }
应用4:判断输入字符在指定字符串中出现的次数:
1 package cn.zzsxt.commontype2; 2 3 import java.util.Scanner; 4 5 /** 6 * 输入一个字符串,输入一个字符,判断该字符在该字符串中出现的次数 7 */ 8 public class TestString4 { 9 public static void main(String[] args) { 10 Scanner input = new Scanner(System.in); 11 int count = 0; 12 System.out.println("请输入一个字符串:"); 13 String str = input.next(); 14 int len = str.length(); 15 System.out.println("请输入一个字符:"); 16 String c = input.next(); 17 for(int i=0;i<len;i++) { 18 char cc = str.charAt(i); 19 String s = cc + ""; 20 if(s.equals(c)) { 21 count ++; 22 } 23 } 24 System.out.println("“"+str+"”"+"字符串中"+"字符‘"+c+"‘"+"出现"+count+"次"); 25 } 26 }
StringBuffer引入的原因:
如果有大量字符串拼接的话String类[不可变的字符序列implements CharSequence]就效率太低
1 package cn.zzsxt.commontype3; 2 3 public class TestString5 { 4 public static void main(String[] args) { 5 6 long start = System.currentTimeMillis(); 7 String str = ""; 8 for(int i=0;i<100000;i++) { 9 str +=i; 10 } 11 long end = System.currentTimeMillis(); 12 System.out.println("总用时:"+(end-start)+"秒"); 13 } 14 }
StringBuffer类:在字符串拼接时,效率较高[可变的字符序列implements CharSequence——>线程安全的]
1 package cn.zzsxt.commontype3; 2 3 public class TestStringBuffer { 4 public static void main(String[] args) { 5 long start = System.currentTimeMillis(); 6 String str = ""; 7 StringBuffer sb = new StringBuffer(str); 8 for(int i=0;i<100000;i++) { 9 sb.append(i); 10 } 11 long end = System.currentTimeMillis(); 12 System.out.println("总用时:"+(end-start)+"秒"); 13 } 14 }
StringBuffer类的应用1:
1 package cn.zzsxt.commontype3; 2 3 import java.util.Scanner; 4 5 public class TestStringBuffer2 { 6 public static void main(String[] args) { 7 Scanner input = new Scanner(System.in); 8 StringBuffer bf = new StringBuffer(); 9 System.out.println("输入一串数字"); 10 // int num = input.nextInt(); 11 String num = input.next(); 12 bf = bf.append(num); 13 for(int i=bf.length()-3;i>0;i=i-3) { 14 bf.insert(i, ‘,‘); 15 } 16 System.out.println(bf); 17 } 18 }
StringBuilder类:[可变的字符序列implements CharSequence——>非线程安全的]
应用1:
1 package cn.zzsxt.commontype3; 2 /** 3 * String :不可变的字符序列 4 * StringBuffer:可变的字符序列,是线程安全,主要用于多线程,效率较低。 5 * StringBuilder:可变的字符序列,非线程安全,效率较高 6 * 线程安全:在多线程中使用,类似于信号灯。 7 * 8 *java.lang 9 *接口 CharSequence 10 *所有已知子接口: 11 * Name 12 *所有已知实现类: 13 * CharBuffer, Segment, String, StringBuffer, StringBuilder 14 *-------------------------------------------------------------------------------- 15 *public interface CharSequenceCharSequence 是 char 值的一个可读序列。此接口对许多不同种类的 char 序列提供统一的只读访问。 16 *char 值表示 Basic Multilingual Plane (BMP) 或代理项中的一个字符。有关详细信息,请参阅 Unicode 字符表示形式。 17 *此接口不修改 equals 和 hashCode 方法的常规协定。因此,通常未定义比较实现 CharSequence 的两个对象的结果。 18 *每个对象都可以通过一个不同的类实现,而且不能保证每个类能够测试其实例与其他类的实例的相等性。 19 *因此,使用任意 CharSequence 实例作为集合中的元素或映射中的键是不合适的。 20 */ 21 public class TestStringBuilder { 22 public static void main(String[] args) { 23 long start = System.currentTimeMillis(); 24 String str = ""; 25 StringBuilder sb = new StringBuilder(str); 26 for(int i=0;i<100000;i++) { 27 sb.append(i); 28 } 29 long end = System.currentTimeMillis(); 30 System.out.println("总用时:"+(end-start)+"秒"); 31 } 32 }
java.util.Date类:[日期处理类]
[格式化日期]:java.text.DateFormat:抽象类
-->继承子类:java.text.SimpleDateFormat
常用方法:
-->format(Date date);格式化日期类一个String表示
-->parse(String dateString);解析一个日期类字符串为Date类对象
1 package cn.zzsxt.commontype4; 2 3 import java.text.DateFormat; 4 import java.text.ParseException; 5 import java.text.SimpleDateFormat; 6 import java.util.Date; 7 8 /** 9 *java.util.Date 10 *常用的构造方法: 11 * Date() 12 * Date(int year, int month, int date) 已过时 13 * Date(long date) 14 *常用的方法: 15 * getYear()返回一个值,此值是从包含或开始于此 Date 对象表示的瞬间的年份减去 1900 的结果 16 * getMonth()返回表示月份的数字,返回的值在 0 和 11 之间,值 0 表示 1 月。 17 * getDate():返回此 Date 对象表示的月份中的某一天。 18 * getDay():返回一个星期中的星期几 19 *java.text.DateFormat:格式化日期,抽象类 20 *java.text.SimpleDateFormat继承DateFormat. 21 * SimpleDateFormat 是一个以与语言环境有关的方式来格式化和解析日期的具体类 22 * yyyy:年,MM:月 dd:日 hh:小时(12进制) HH:小时(24进制) mm:分钟 ss:秒 23 * 类SimpleDateFormat常用的方法: 24 * format(Date date):将日期转成字符串 25 * parse(String dateStr):将字符串转成日期 26 * before(Date when):测试此日期是否在指定日期之后。 27 * after(Date when):测试此日期是否在指定日期之前。 28 */ 29 public class TestDate { 30 public static void main(String[] args) { 31 Date date = new Date(); 32 System.out.println(date); 33 int year = date.getYear()+1900; 34 int month = date.getMonth()+1; 35 int date1 = date.getDate(); 36 int day = date.getDay(); 37 int hour = date.getHours(); 38 int min = date.getMinutes(); 39 int sec = date.getSeconds(); 40 String str = year+"-"+month+"-"+date1+" "+"星期"+day+" "+hour+":"+min+":"+sec; 41 System.out.println(str); 42 DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss"); 43 //将日期转换成字符串 44 String str2 = df.format(date); 45 System.out.println(str2); 46 //将字符串转换成日期 47 String dateStr = "2017-5-12"; 48 SimpleDateFormat simpleDateFormate = new SimpleDateFormat(dateStr); 49 Date date2 = null; 50 try { 51 //将字符串转换成日期 52 date2 = simpleDateFormate.parse(dateStr); 53 System.out.println(date2); 54 } catch (ParseException e) { 55 e.printStackTrace(); 56 } 57 //日期比较 58 System.out.println(date.before(date2)); 59 System.out.println(date.after(date2)); 60 } 61 }
java.util.Calendar类[抽象类]:
实例化方法:Calendar calendar = Calendar.getInstance();
常用属性(field):
常用的方法:
-->get(int field);Calendar类的获取属性
-->set(int field, int value);设置Calendar类的属性值
-->add(int field, int amount);增加属性的数量(amount)
-->getActualMaximum(int field);获取属性的最大值
-->getActualMinimum(int field);获取属性的最小值
1 package cn.zzsxt.commontype4; 2 3 import java.util.Calendar; 4 import java.util.Locale; 5 /** 6 *java.util.Calendar类:Calendar 类是一个抽象类,可以设置或获取日期中的指定部分。 7 *public abstract class Calendar extends Object 8 * implements Serializable, Cloneable, Comparable<Calendar> 9 *Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。 10 *常用方法: 11 * get(int field):返回给定日历字段的值。 12 * set(int field, int value) 将给定的日历字段设置为给定值。 13 * add(int field, int amount) 根据日历的规则,为给定的日历字段添加或减去指定的时间量。 14 * getActualMaximum(int field):返回指定日历字段可能拥有的最大值 15 */ 16 public class TestCalendar { 17 public static void main(String[] args) { 18 Calendar calendar = Calendar.getInstance(); 19 calendar.set(Calendar.YEAR, 2016); 20 calendar.set(Calendar.MONTH, 3);//月份范围为0~11之间 21 calendar.set(Calendar.DATE, 1); 22 calendar.add(Calendar.YEAR, 2);//年份加2 23 int year = calendar.get(Calendar.YEAR); 24 int month = calendar.get(Calendar.MONTH); 25 int date = calendar.get(Calendar.DATE); 26 int hour = calendar.get(Calendar.HOUR);//十二进制的时间表示 27 int hour2 = calendar.get(Calendar.HOUR_OF_DAY);//二十四进制的小时表示 28 int min = calendar.get(Calendar.MINUTE); 29 int second = calendar.get(Calendar.SECOND); 30 String str = year+"-"+(month+1)+"-"+date+" "+hour2+":"+min+":"+second; 31 System.out.println(str); 32 int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR); 33 System.out.println("一年之中的第"+dayOfYear+"天"); 34 int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR); 35 System.out.println("一年之中的第"+weekOfYear+"周"); 36 int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH); 37 System.out.println("一个月之中的第"+dayOfMonth+"天"); 38 int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK); 39 System.out.println("一周之中的第"+dayOfWeek+"天"); 40 int max = calendar.getActualMaximum(Calendar.MONTH); 41 calendar.set(Calendar.MONTH, 4);//月份范围为0~11之间 42 int max2 = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);//5月份最大多少天 43 System.out.println(max2); 44 long l = calendar.getTimeInMillis(); 45 long ll = System.currentTimeMillis(); 46 System.out.println(l); 47 System.out.println(ll); 48 int mins = calendar.getActualMinimum(Calendar.MONTH); 49 System.out.println(mins); 50 String str2 = calendar.getCalendarType();//格雷戈里 51 System.out.println(str2); 52 // Locale[] locals = calendar.getAvailableLocales(); 53 // for (Locale locale : locals) { 54 // System.out.println(locale); 55 // } 56 } 57 58 }