Integer包装类

包装类

Integer

Integer num1 = 100;
Integer num2 = 100; //true
num1num2;
Integer num1 = 1000;
Integer num2 = 1000; //false
num1
num2;
Integer num1 = Integer.valueOf(100) ;
Integer.paeseInt();
String
不可变性,串池不重复
StringBuffer 一个对象,改变值
trim() 去前后空格 eg.取rgb颜色自动加的空格
day14-常见类1

2、包装类

Integer:

反编译:

Integer num = Integer.valueOf(100);
Integer num1 = Integer.valueOf(100);
System.out.println(num == num1);
追踪到valueOf():


public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];//new Integer()
        return new Integer(i);
}
追踪到IntegerCache:
 
private static class IntegerCache {
        static final int low = -128;
        static final int high;
        static final Integer cache[];
        static {
            // high value may be configured by property
            int h = 127;
            String integerCacheHighPropValue =                sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
            if (integerCacheHighPropValue != null) {
                try {
                    //把字符串转换为整形
                    int i = parseInt(integerCacheHighPropValue);
                    i = Math.max(i, 127);//取i和127的最大值赋给i
                    // Maximum array size is Integer.MAX_VALUE
                    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
                } catch( NumberFormatException nfe) {
                    // If the property cannot be parsed into an int, ignore it.
                }
            }
            high = h;
            cache = new Integer[(high - low) + 1];
            int j = low;
            for(int k = 0; k < cache.length; k++)
                cache[k] = new Integer(j++);
            // range [-128, 127] must be interned (JLS7 5.1.7)
            assert IntegerCache.high >= 127;
        }
        private IntegerCache() {}
 }

如何设置上限:

image

int num = Integer.parseInt(str);
"123"---['1','2','3']--[1,2,3]---123

public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
}

public static int parseInt(String s, int radix)
                throws NumberFormatException {
        /*
         * WARNING: This method may be invoked early during VM initialization
         * before IntegerCache is initialized. Care must be taken to not use
         * the valueOf method.
         */
    //判断字符串是否为空--null
        if (s == null) {
            throw new NumberFormatException("null");
        }

        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        int result = 0;//结果
        boolean negative = false;//positive
        int i = 0, len = s.length();//字符串的长度
        int limit = -Integer.MAX_VALUE;
        int multmin;//算结果
        int digit;//位

        if (len > 0) {//判断""
            char firstChar = s.charAt(0);//第一个字符'1'
            if (firstChar < '0') { // Possible leading "+" or "-"
                " "
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);
                //说明就是+或者-
                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            //运算
            multmin = limit / radix;
            //一位一位的判断
            while (i < len) {//i可能从0或1开始  +999   8888
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;
}

3、String

// abcdef bcdefa cdefab defabc efabcd fabcde

// abcdefabcdef

补充方法:

toCharArray():转为字符数组

split():打断字符串----字符串数组

常用类-上
一、基本数据类型包装类
Java是一种纯面向对象语言,但是java中有8种基本数据类型,破坏了java为纯面向对象的特征。为了承诺在java中一切皆对象,java又给每种基本数据类型分别匹配了一个类,这个类我们称之为包装类/封装类。
注意:每个基本数据类型都有一个与之匹配的包装类。
1.1八大基本数据类型的包装类

注意:int的包装类的写法为Integer、char的包装类的写法是:Character
其余基本数据类型的包装类均是基本类型的首字母大写。
1.2包装类的层次结构

1.3包装类中的常用方法
装箱:把基本数据类型包装为对应的包装类对象 10
Integer i1 = new Integer(10); // 利用构造方法
Integer i2 = Integer.valueOf(10); //利用包装类中的静态方法
拆箱:把包装类对象转换为对应的基本数据类型。
int i3= i1.intValue(); //返回包装类对象i1对应的基本数据

1.4自动装箱和自动拆箱
前面的装箱和拆箱操作,相对较麻烦。自jdk1.5开始,java增加的对基本数据类型的自动装箱和自动拆箱操作。
java编译器在编译时期会根据源代码的语法来决定是否进行装箱或拆箱。
1、自动装箱:可以直接把一个基本数据类型赋值给包装类
例如: Integer i1 = 10; //自动装箱操作
2、自动拆箱:可以直接把一个包装类对象,赋值给基本类型
例如:int a = new Integer(3); //自动拆箱。
自动装箱和自动拆箱,简化了对包装类的操作。
注意:需要理解自动装箱和拆箱的本质
1.5必须get的技能
将字符串转换为整数
练习:将一个字符串如”1,2,3,4,5,6”转换成一个整型数组信息列表

二、字符串相关类
1.String类
1.1 什么是String
String是不可变类, 即一旦一个String对象被创建, 包含在这个对象中的字符序列是不可改变的, 直至该对象被销毁。
String类是final类,不能有子类。
1.2 创建字符串对象
常量池概念:
Java运行时会维护一个常量池, 常量池用来存放运行时中产生的各种字符串,并且池中的字符串的内容不重复。

1.3 String类型常用方法
1.3.1 获得新字符串的常用方法(拼接+替换)
1)String concat(String str) 在原有字符串的尾部添加参数字符串,返回一个新的字符串(总是堆内存中的对象),如果str的长度为0,则返回原字符串。str不能为空。
2)String subString(int beginIndex) 获得从beginIndex开始到结束的子字符串。( 包括beginIndex位置的字符)
3)public String toLowerCase() 把字符串中的英文字符全部转换为小写字符,返回值为装换后的新的字符串。
4)public String toUpperCase() 把字符串中的英文字符全部转换为大写字符,返回值为装换后的新的字符串。
5)public String trim() 把字符串中的首尾空白字符去掉
6)public String replace(CharSequence target, CharSequence replacement) 使用指定的字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
7)public String replace(char oldChar, char newChar) 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 得到的。
8)public String replaceAll(String regex, String replacement) 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。
9)public replaceFirst(String regex, String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。
1.3.2计算字符串长度的方法
public int length(); //返回字符串字符的个数。
1.3.3字符串比较
1、”==”表示判断该两个字符串是否为同一对象,即在内存中的地址是否一样。如果一样则返回true 否则返回false; 和我们通常的是否为同一对象的是一样的。
2、boolean equals(Object anObject) 将此字符串与指定的对象比较。注意此时比较的是内容是否相等(字符串类对此方法进行了覆写)。
3、boolean equalsIgnoreCase(String anotherString) 将此 String 与另一个 String 比较,不考虑大小写。
例如:”abc”. equalsIgnoreCase(“AbC”); // true
4、int compareTo(String value) 按字典顺序比较两个字符串。如果两个字符串相等,则返回0;如果字符串在参数值之前,则返回值小于 0;如果字符串在参数值之后,则返回值大于 0
5、int compareToIgnoreCase(String val) 按字典顺序比较两个字符串,不考虑大小写
6、boolean startsWith(String value) 检查一个字符串是否以参数字符串开始。
7、boolean endsWith(String value) 检查一个字符串是否以参数个字符串结束。
1.3.4字符串查找

练习:完成一个邮箱格式的校验 hhy@qq.com
(1),“@”不能在第一位
(2),“.”不能在最后一位
(3),“@”和“.”中间应该有字符
(4),@.***
(5)当然还有更严格的校验规则,我们此处考虑到这即可
1.3.5其他数据类型转成字符串
在String类中定义了一些静态的重载方法
public static String valueOf(…)可以将基本类型数据、Object类型转换为字符串。如:
public static String valueOf(double d) 把double类型数据转成字符串
public static String valueOf(Object obj) 调用obj的toString()方法得到它的字符串表示形式。

还有一种最简单的方法:
把任意对象、基本数据类型与一个空字符串相连接则可以直接转换成字符串,与上面效果相同。
“第”+i+”个”
2 StringBuffer类
2.1 什么是StringBuffer
StringBuffer代表可变的字符序列。
StringBuffer称为字符串缓冲区,它的工作原理是:预先申请一块内存,存放字符序列,如果字符序列满了,会重新改变缓存区的大小,以容纳更多的字符序列。StringBuffer是可变对象,这个是String最大的不同

2.2 创建StringBuffer对象。
StringBuffer可以理解为一个字符串容器,可以动态的改变容器中的内容。
StringBuffer类的常用构造方法:
StringBuffer()
构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符
StringBuffer(String str)
构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
2.3 StringBuffer常用方法

3.StringBuilder类
3.1 什么是StringBuffer
StringBuilder与StringBuffer的用法完全一致,唯一的区别是StringBuffer是线程安全的,而StringBuilder不是线程安全的。所以StringBuilder的性能要比StringBuffer要好。单线程推荐使用StringBuilder,多线程使用StringBuffer。
3.2 为什么需要StringBuilder及StringBuffer类
字符串的不变性:
一个String对象的长度是固定的,不能改变它的内容,或者是附加新的字符到String对象中。
您也许会使用+来串联字符串以达到附加新字符或字符串的目的,但+会产生一个新的String对象。
String s1 = “abc”;
String s2 = “abc”;
String s3 = s1+s2;
如果程序对这种附加字符串的需求很频繁,系统会频繁在内存中创建String对象,造成性能下降。所以并不建议使用+来进行频繁的字符串串联。应该使用java.lang.StringBuffer类。

三、正则表达式
含义:用来描述或者匹配一系列符合某个语句规则的字符串
案例:把一个字符串中带电话号码替换成130****1111

四、Pattern类 及 Matcher
Pattern:代表正则表达式的匹配模式
Matcher:提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持
案例1:校验QQ邮箱
String str = "1445584980@qq.com";
String regex = "\d{5,11}@qq\.com";
//boolean matches = str.matches(regex);
boolean matches = Pattern.matches(regex , str);
System.out.println(matches);
案例2:分隔路径
String str = "C:\资源\日韩\波多野结衣.avi";
String regex = ":?\\";
//String[] split = str.split(regex);
Pattern pattern = Pattern.compile(regex);//创建匹配模式对象
String[] split = pattern.split(str);
for (String s : split) {
System.out.println(s);
}
案例3:Pattern+Matcher 找到前端代码中的图片路径
String str = "

";

	String regex = "<img\\b[^>]*\\bsrc\\b\\s*=\\s*('|\")?([^'\"\n\r\f>]+(\\.jpg|\\.bmp|\\.eps|\\.gif|\\.mif|\\.miff|\\.png|\\.tif|\\.tiff|\\.svg|\\.wmf|\\.jpe|\\.jpeg|\\.dib|\\.ico|\\.tga|\\.cut|\\.pic)\\b)[^>]*>";
	Pattern pattern = Pattern.compile(regex);//创建匹配模式对象
	Matcher matcher = pattern.matcher(str);//获取匹配结果

// System.out.println("在字符串中是否整个匹配:" + matcher.matches());
// System.out.println("在字符串中是否开头就匹配:" + matcher.lookingAt());
// System.out.println("在字符串中是否有包含匹配:" + matcher.find());

	while(matcher.find()){
		 System.out.println(matcher.group()); //matcher.group(2)-->获取正则表达式里第二个括号(组)里的内容
	     System.out.print("start:"+matcher.start()); 
	     System.out.println(" end:"+matcher.end()); 
	}

总结:Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持. 单独用Pattern只能使用Pattern.matches(String regex,CharSequence input)一种最基础最简单的匹配。
五、日期时间类
1.Date类
java.util.Date类表示特定的瞬间,精确到毫秒。
2.SimpleDateFormat类
将显示的日期信息格式化
3.Calendar类
Calendar类(日历)是一个抽象基类,主要用于完成日期字段之间相互操作的功能。即可以设置和获取日期数据的特定部分。

posted @ 2022-07-07 20:53  chahune  阅读(45)  评论(0编辑  收藏  举报