Java核心技术梳理-基础类库

一、引言

Oracle为Java提供了丰富的基础类库,Java 8 提供了4000多个基础类库,熟练掌握这些基础类库可以提高我们的开发效率,当然,记住所有的API是不可能也没必要的,我们可以通过API文档或直接网上搜索来逐渐熟悉大部分类的功能和方法,下面我们来学习一些基础类库。

二、Scanner

Scanner类可以很方便的获取用户的键盘输入,是一个基于正则表达式的文本扫描器,可以从文件、输入流、字符串中解析出字符串和基本类型值,构造器也是以文件、输入流、字符串为数据源进行构造,主要有两种方法:

hasNextXxx():是否还有下一个Xxx类型输入项。

nextXxx():获取下一个Xxx输入项。

//键盘输入Scanner scanner =new Scanner(System.in);//回车作为分隔符scanner.useDelimiter("\n");while (scanner.hasNext()) {

    System.out.println(scanner.next());

}

默认使用空白(空格、tab空白、回车)来进行项之间的分隔符。我们也可以直接按照行来进行分隔,调用下面方法:

hasNextLine

nextLine

Scanner 还可以读取文件输入

try {

    Scanner scannerfile=newScanner(newFile("123.txt"));

} catch (FileNotFoundException e) {

    e.printStackTrace();

}

三、系统相关

3.1 System

System类代表当前Java程序的运行平台,System不能被创建,可以获取环境变量,系统属性,还提供了加载文件和动态链接库的方法。

//键盘输入Scanner scanner =new Scanner(System.in);//回车作为分隔符scanner.useDelimiter("\n");while (scanner.hasNext()) {

    System.out.println(scanner.next());

}try {

    Scanner scannerfile=newScanner(newFile("123.txt"));

} catch (FileNotFoundException e) {

    e.printStackTrace();

}

3.2 Runtime

Runtime类代表Java程序的运行环境,我们可以通过此类获取JVM信息,如处理器数量,内存信息。并可以使用gc进行垃圾回收。

Runtime runtime = Runtime.getRuntime();

System.out.println("处理器数量:" + runtime.availableProcessors());

System.out.println("可用最大内存数:"+runtime.maxMemory());

System.out.println("空闲内存:"+runtime.freeMemory());

System.out.println("总内存数:"+runtime.totalMemory());

四、常用类

4.1 Object

Object 是所有类、数组、枚举类的父类,任何类型都可以赋给Object,有以下常用的一些方法:

boolean equals(Object obj) 判断指定对象与该对象是否相等。

void finalize() 垃圾回收器调用此方法来清理对象资源。

Class<?> getClass() 返回该对象运行时类。

int hashCode() 返回该对象的hash值。

toString() 返回该对象字符串表示。

Object还有控制线程的几个方法,wait()、notify()、notifyAll()。

Java 7 之后新增了Objects方法,里面提供了工具方法来操作对象,这些工具方法大多是空指针安全的,使用更安全。

4.2 字符串类

字符串就是一连串字符序列,Java提供了String、StringBuffer、StringBuilder 三个类进行字符串封装和处理。其中StringBuffer、StringBuilder基本相似,只是StringBuffer线程安全而StringBuilder线程不安全。

String类是不可变类,一旦创建,就不可改变,直至被销毁。String类的不可变性,后面有机会再详解。

String类提供了很多构造器:


String也提供了大量的方法来操作字符串对象,我们学习一些常用的方法:

String s =newString("abcdefg");//获取字符串中指定位置的字符System.out.println(s.charAt(1));//比较字符串的大小System.out.println(s.compareTo("adasd"));//将该字符串与str连接在一起s.concat("higk");

System.out.println(s);//与StringBuffer对象比较,值相等则返回trueSystem.out.println(s.contentEquals(newStringBuffer("abcd")));//将字符数组连缀成字符串System.out.println(String.copyValueOf(newchar[]{'a', 'b'}));//将字符数组的子数组连缀成字符串System.out.println((String.copyValueOf(newchar[]{'a', 'b', 'c', 'd', 'e'}, 2, 3)));//将字符串与指定对象比较System.out.println(s.equals("abcdefg"));//忽略大小写字符串与指定对象比较System.out.println(s.equalsIgnoreCase("ABcdefg"));//将string对象转换成Byte数组byte[] bytes = s.getBytes();for(inti = 0; i < bytes.length; i++) {

    System.out.println(bytes[i]);

}char[] s1 =newchar[]{'晚', '安', '!', '世', '界'};

String s2 =newString("。!?");//将字符串从srcBegin开始,到srcEnd结束复制到字符串数组串中,dstBegin为字符串数组的初始位置s2.getChars(0, 2, s1, 2);for(inti = 0; i < s1.length; i++) {

    System.out.println(s1[i]);

}//查询字符在字符串中第一次出现的位置System.out.println(s.indexOf('b'));//查询字符在字符串中从fromIndex后第一次出现在的位置System.out.println(s.indexOf('b', 2));//查询子字符串在字符串中第一次出现的位置System.out.println(s.indexOf("bc"));//查询子字符在字符串中从fromIndex后第一次出现在的位置System.out.println(s.indexOf("bc", 2));//查询字符在字符串中最后一次出现的位置System.out.println(s.lastIndexOf('b'));//查询字符在字符串中从fromIndex后最后一次出现在的位置System.out.println(s.lastIndexOf('b', 2));//查询子字符串在字符串中最后一次出现的位置System.out.println(s.lastIndexOf("bc"));//查询子字符在字符串中从fromIndex后最后一次出现在的位置System.out.println(s.lastIndexOf("bc", 2));//字符串长度System.out.println(s.length());//替换字符串s.replace('a', 'b');

System.out.println(s);//对象是否以某字符串结尾System.out.println(s.startsWith("ab"));//String 对象是以某字串结尾System.out.println(s.endsWith("fg"));//获取从beginIndex位置开始到结束的子字符串String substring = s.substring(4);

System.out.println(substring);//获取从beginIndex位置开始到endIndex结束的子字符串String substring1 = s.substring(4, 6);

System.out.println(substring1);char[] chars = s.toCharArray();//转换成char数组for(inti = 0; i

    System.out.println(chars[i]);

}//将字符串转换成小写String lowerCase = s.toLowerCase();

System.out.println(lowerCase);//将字符串转换成大写String upperCase = s.toUpperCase();

System.out.println(upperCase);

由于String的不可变性,频繁操作String时会产生大量的临时变量,这时我们可以使用StringBuilder和StringBuffer,两个类的用户基本一致,在不需要线程安全时,建议使用StringBuilder。

StringBuilder sb=new StringBuilder();//追加sb.append("java");

System.out.println(sb);//插入sb.insert(0,"hello ");

System.out.println(sb);//替换sb.replace(5,6,",");

System.out.println(sb);//反转sb.reverse();

System.out.println(sb);//长度与容量System.out.println(sb.length()+ sb.capacity());

4.3 Math 类

Java 提供了Math来进行复杂的数学运算,我们记住一些常用的就行:

//返回小于目标数的最大整数System.out.println(Math.floor(-1.57));//返回大于目标数的最小整数System.out.println(Math.ceil(1.57));//四舍五入System.out.println(Math.round(2.3));//取绝对值System.out.println(Math.abs(-4.6));//取最大数System.out.println(Math.max(1,3));

4.4 Random

Random类专门用于生产伪随机数,有两个构造器,一个已当前系统时间作为种子,一个已外部输入数字作为种子,常用的方法有:

Random random =new Random();//生成一个int范围内的随机数System.out.println(random.nextInt());//生成0-30范围的随机数System.out.println(random.nextInt(30));//生成0.0-1.0 的随机数System.out.println(random.nextDouble());

五、日期、时间类

ava提供了Date和Calendar来处理日期和时间,但Date不仅不支持国际化,而且不同属性也使用了前后矛盾的偏移量,Java 8 又提供了全新的日期时间库。

5.1 Date

Date 现在在用的有两个构造器:

Date() :生成一个代表当前日期时间的date对象

Date(long date):指定的long型整数来生成一个Date对象

Date 还在使用的方法也很少:

Date date = new Date();

Date date1 = new Date(System.currentTimeMillis()+100);

//测试该日期是否在指定日期之后

System.out.println(date.after(date1));

//比较日期大小

System.out.println(date.compareTo(date1));

Date类设计的并不好,对日期的操作推荐使用Calendar。

5.2Calendar 类

Calendar 类是一个抽象类,是所有日历的模板,提供了静态getInstance()方法获取Calendar对象,这个方法是通过获取TimeZone和Locale 来创建Calendar。Calendar 和Date都是表示日期的类,他们可以互相转换。

Calendar calendar = Calendar.getInstance();

Date date2 = calendar.getTime();

Calendar calendar1 = Calendar.getInstance();

calendar1.setTime(date2);

Calendar 类提供了大量访问、修改日期时间的方法,常用方法如下:

//给指定的字段增加或者减去时间量,如果指定量超过最大值,则进位calendar.add(Calendar.YEAR,1);//获取指定的字段值System.out.println(calendar.get(Calendar.YEAR));

System.out.println(calendar.get(Calendar.MONTH));

System.out.println(calendar.get(Calendar.DATE));//设置日期值calendar.set(2003,10,2,10,50,10);//给指定的字段增加或者减去时间量,如果指定量超过最大值,不进位calendar.roll(Calendar.YEAR,13);

5.3Java 8新增的时间日期包

Java 8 提供了java.time 包来处理日期和时间,常用的类:

Clock:获取指定时区的当前日期、时间。

Duration:代表持续时间,可以方便的获取一段时间。

Instant:代表具体时刻,可以精确到纳秒。

LocalDate:该类代表不带时区的日期。

LocalTime:该类代表不带时区的时间。

LocalDateTime:该类代表不带时区的日期、时间。

MonthDay:该类代表月日。

Year:代表年。

YearMonth:代表年月。

这些类的方法比较简单,需要使用时再通过API文档查找。

六、正则表达式

正则表达式是强大的字符串处理工具,可以对字符串进行查找、提取、分隔、替换等操作。

Java提供了Pattern和Matcher来使用正则表达式

//将字符串编译成Pattern对象Pattern pattern = Pattern.compile("a*b");

        //使用Pattern创建Matcher对象Matcher matcher = pattern.matcher("aaaaab");

        System.out.println(matcher.matches());

        //只能使用一次,效率不高Pattern.matches("a*b", "aaabbb");

        String s = "XXX:13892329111,XXX:18922121231,XXX:13824322341";

        Matcher matcher1 = Pattern.compile("1\\d{10}").matcher(s);

        //返回目标字符串中是否包含匹配的字串while (matcher1.find()) {

            //返回上一次匹配的字串            System.out.println(matcher1.group());

        }

七、日期、时间格式化器

对于日期的展示,我们一般的会格式化处理,Java提供了几个类来进行日期格式化处理。

7.1 SimpleDateFormat

SimpleDateFormat 既可以将日期按照固定格式转成字符串,也可以将特殊日期字符串转成日期

//将日期转换成固定格式SimpleDateFormat simpleDateFormat =newSimpleDateFormat("yyyy-MM-dd");

Date date =new Date();

System.out.println(simpleDateFormat.format(date));//日期字符串String str = "14###三月##21";

SimpleDateFormat simpleDateFormat1 =newSimpleDateFormat("y###MMM##d");//将日期字符串解析成日期,主要格式要匹配的上,不然会报错System.out.println(simpleDateFormat.format(simpleDateFormat1.parse(str)));

7.2 DateTimeFormatter

DateTimeFormatter 是Java 8提供的增强版的日期格式器类,功能很强大,DateTimeFormatter中包含了大量的静态化常量,这些静态化常量本身就是DateTimeFormatter实例

我们可以通过常量来创建格式化器,也可以使用不同风格的枚举值来创建

DateTimeFormatter[] formatters=new DateTimeFormatter[]{

        //常量创建        DateTimeFormatter.ISO_DATE_TIME,

        DateTimeFormatter.ISO_LOCAL_DATE,

        DateTimeFormatter.ISO_DATE,

        //枚举值创建        DateTimeFormatter.ofLocalizedDateTime(FormatStyle.FULL,FormatStyle.MEDIUM),

        //模式字符串DateTimeFormatter.ofPattern("Gyyyy%%MMM%%dd")

};

LocalDateTime localDate = LocalDateTime.now();for(inti = 0; i

    //两种方式格式化日期    System.out.println(formatters[i].format(localDate));

    System.out.println(localDate.format(formatters[i]));

}

DateTimeFormatter 也可以将字符串直接转成日期,用法与SimpleDateFormat 相同。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,305评论 0 9
  • 50道经典Java编程练习题,将数学思维运用到编程中来。抱歉哈找不到文章的原贴了,有冒犯的麻烦知会声哈~ 1.指数...
    OSET我要编程阅读 6,940评论 0 9
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,365评论 0 4
  • API String 类【最终类】 [if !supportLists]1. [endif]打印字符串中,某个元素...
    周书达阅读 718评论 0 0
  • 今天我从姥姥,姥爷家去到了姑姑家,到姑姑家,姑父,赶紧给我切火龙果,又给我吃了零食,还给我吃了西瓜,我们还想吃...
    玉珺阅读 332评论 0 0