java 输出一个爱心_java基础 之 几个常用的类
在以上的文章中我们看了Java的一些基础的使用,今天我们主要学习一下Java的几个常用的类
java操作系统底层Sytem类:
System类代表当前Java程序的运行平台,程序不能创建System类的对象,System类提供了一些类Field和类方法,允许直接通过System类来调用这些Field和方法。System类提供了代表标准输入、标准输出和错误输出的类Field,并提供了一些静态方法用于访问环境变量、系统属性的方法,还提供了加载文件和动态链接库的方法。下面程序通过System类来访问操作的环境变量和系统属性
加载文件和动态链接库主要对native方法有用,对于一些特殊的功能(如访问操作系统底层硬件设备等)Java程序无法实现,必须借助C语言来完成,此时需要使用C语言为Java方法提供实现。其实现步骤如下:
Java程序中声明native()方法,类似于abstract方法,只有方法签名,没有实现。编译该Java程序,生成一个class文件。
用javah编译第1步生成的class文件,将产生一个.h文件。
写一个.cpp文件实现native方法,其中需要包含第2步产生的.h文件(.h文件中又包含了JDK带的jni.h文件)。
将第3步的.cpp文件编译成动态链接库文件。
在Java中用System类的loadLibrary..()方法或Runtime类的loadLibrary()方法加载第4步产生的动态链接库文件,Java程序中就可以调用这个native()方法了。
System类提供了通知系统进行垃圾回收的gc()方法,以及通知系统进行资源清理的runFinalization()方法。System类还有两个获取系统当前时间的方法:currentTimeMillis()和nanoTime(),它们都返回一个long型整数。实际上它们都返回当前时间与UTC1970年1月1日午夜的时间差,前者以毫秒作为测量单位,后者以纳秒作为测量单位。必须指出的是,这两个方法的返回值的粒度取决于底层操作系统,可能所在的操作系统根本不支持以毫秒、纳秒作为计时单位。
例如,许多操作系统以几十毫秒为单位测量时间,currentTimeMillis()方法不可能返回精确的毫秒数;而nanoTime()方法很少用,因为大部分操作系统都不支持使用纳秒作为计时单位。
除此之外,System类的in、out和err分别代表系统的标准输入(通常是键盘)、标准输出(通常是显示器)和错误输出流,并提供了setIn、setOut和setErr方法来改变系统的标准输入、标准输出和标准错误输出流。
public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
Map env = System.getenv();
for(String name: env.keySet()){
System.out.println(name+"-->"+env.get(name));
}
// 获取指定的环境变量的值
System.out.println(System.getenv("JAVA_HOME"));
// 获取所有的系统属性
Properties properties =System.getProperties();
// 将所有的properties保持到prop.txt文件
properties.store(new FileOutputStream("props.txt"),"System Porpertis");
//输出特定的系统属性
System.out.println(System.getProperties());
}
//输出
//输出
USERDOMAIN_ROAMINGPROFILE-->DESKTOP-KJ16LKS
LOCALAPPDATA-->C:\Users\BlueEarth\AppData\Local
ChocolateyLastPathUpdate-->132478206462499485
PROCESSOR_LEVEL-->23
USERDOMAIN-->DESKTOP-KJ16LKS
FPS_BROWSER_APP_PROFILE_STRING-->Internet Explorer
LOGONSERVER-->\\DESKTOP-KJ16LKS
JAVA_HOME-->D:\jdk-8u91-windows-x64
SESSIONNAME-->Console
ALLUSERSPROFILE-->C:\ProgramData
PROCESSOR_ARCHITECTURE-->AMD64
PSModulePath-->C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
SystemDrive-->C:
MAVEN_HOME-->D:\Program Files\apache-maven-3.5.2
OneDrive-->C:\Users\BlueEarth\OneDrive
APPDATA-->C:\Users\BlueEarth\AppData\Roaming
USERNAME-->BlueEarth
System类还提供了一个identityHashCode(Object x)方法,该方法返回指定对象的精确hashCode值,也就是根据该对象的地址计算得到的hashCode值。当某个类的hashCode()方法被重写后,该类实例的hashCode()方法就不能唯一地标识该对象;但通过identityHashCode()方法返回的hashCode值,依然是根据该对象的地址计算得到的hashCode值。所以,如果两个对象的identityHashCode值相同,则两个对象绝对是同一个对象。如下程序所示
public void test(){
String s1=new String("Hello");
String s2= new String("Hello");
// String 重写了hashcode方法,因为s1和s2的字符序列相同,所以他们的hashCode()方法返回值相同。
System.out.println(s1.hashCode()+"______"+ s2.hashCode());
// s1和s2是不同的字符串对象,所以他们的identityHashCode值相同
System.out.println(System.identityHashCode(s1)+"------" + System.identityHashCode(s2));
}
// 输出:
69609650______69609650
792791759------1191747167
java中获取当地时间:
public class LocaleList {
public static void main(String[] args) {
// 返回Java所支持的全部国家和语言的数组
Locale[] localeList = Locale.getAvailableLocales();
// 遍历数组的每个元素,依次获取所支持的国家和语言
for (int i = 0; i < localeList.length; i++) {
// 输出所支持的国家和语言
System.out.println(localeList[i].getDisplayCountry()
+ "=" + localeList[i].getCountry() + " "
+ localeList[i].getDisplayLanguage()
+ "=" + localeList[i].getLanguage());
}
}
}
Object类:
Object类是所有类、数组、枚举类的父类,也就是说,Java允许把任何类型的对象赋给Object类型的变量。当定义一个类时没有使用extends关键字为它显式指定父类,则该类默认继承Object父类。
因为所有的Java类都是Object类的子类,所以任何Java对象都可以调用Object类的方法。Object类提供了如下几个常用方法。
boolean equals(Object obj):判断指定对象与该对象是否相等。此处相等的标准是,两个对象是同一个对象,因此该equals()方法通常没有太大的实用价值。
protected void finalize():当系统中没有引用变量引用到该对象时,垃圾回收器调用此方法来清理该对象的资源。
Class getClass():返回该对象的运行时类。
int hashCode():返回该对象的hashCode值。在默认情况下,Object类的hashCode()方法根据该对象的地址来计算(即与System.identityHashCode(Object x)方法的计算结果相同)。但很多类都重写了Object类的hashCode()方法,不再根据地址来计算其hashCode()方法值
String toString():返回该对象的字符串表示,当我们使用System.out.println()方法输出一个对象,或者把某个对象和字符串进行连接运算时,系统会自动调用该对象的toString()方法返回该对象的字符串表示。Object类的toString()方法返回“运行时类名@十六进制hashCode值”格式的字符串,但很多类都重写了Object类的toString()方法,用于返回可以表述该对象信息的字符串。
Java还提供了一个protected修饰的clone()方法,该方法用于帮助其他对象来实现“自我克隆”,所谓“自我克隆”就是得到一个当前对象的副本,而且二者之间完全隔离。由于Object类提供的clone()方法使用了protected修饰,因此该方法只能被子类重写或调用。自定义类实现“克隆”的步骤如下。
(1)自定义类实现Cloneable接口。这是一个标记性的接口,实现该接口的对象可以实现“自我克隆”,接口里没有定义任何方法。
(2)自定义类实现自己的clone()方法。
(3)实现clone()方法时通过super.clone();调用Object实现的clone()方法来得到该对象的副本,并返回该副本。
String,StringBuffer和StringBuilder类
字符串就是一连串的字符序列,Java提供了String和StringBuffer两个类来封装字符串,并提供了一系列方法来操作字符串对象。
String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁。
StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象。
从JDK 1.5开始出现的StringBuilder类,也代表字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是,StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高。因此在通常情况下,如果需要创建一个内容可变的字符串对象,则应该优先考虑使用StringBuilder类。
String常用方法:
String substring(int beginIndex):获取从beginIndex位置开始到结束的子字符串。
String substring(int beginIndex, int endIndex):获取从beginIndex位置开始到endIndex位置的子字符串。
char[] toCharArray():将该String对象转换成char数组。
String toLowerCase():将字符串转换成小写。
String toUpperCase():将字符串转换成大写。
char charAt(int index):获取字符串中指定位置的字符。其中,参数index指的是字符串的序数,字符串的序数从0开始到length()-1
int compareTo(String anotherString):比较两个字符串的大小。如果两个字符串的字符序列相等,则返回 0;不相等时,从两个字符串第 0个字符开始比较,返回第一个不相等的字符差。另一种情况,较长字符串的前面部分恰巧是较短的字符串,则返回它们的长度差
String concat(String str):将该String对象与str连接在一起。与Java提供的字符串连接运算符“+”的功能相同
boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。
String replaceAll(String regex, String replacement):将该字符串中所有匹配regex的子串替换成replacement。
String replaceFirst(String regex, String replacement):将该字符串中第一个匹配regex的子串替换成replacement。
String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。
因为String是不可变的,所以会额外产生很多临时变量,使用StringBuffer或StringBuilder就可以避免这个问题。StringBuilder提供了一系列插入、追加、改变该字符串里包含的字符序列的方法。而StringBuffer与其用法完全相同,只是StringBuffer是线程安全的。
StringBuilder、StringBuffer有两个属性:length和capacity,其中length属性表示其包含的字符序列的长度。与String对象的length不同的是,StringBuilder、StringBuffer的length是可以改变的,可以通过length()、setLength(int len)方法来访问和修改其字符序列的长度。capacity属性表示StringBuilder的容量,capacity通常比length大,程序通常无须关心capacity属性.
Math类:
Java提供了基本的+、-、*、/、%等基本算术运算的运算符。Java提供了Math工具类来完成这些复杂的运算,Math类是一个工具类,它的构造器被定义成private的,因此无法创建Math类的对象;Math类中的所有方法都是类方法,可以直接通过类名来调用它们。Math类除了提供了大量静态方法之外,还提供了两个静态Field:PI和E,正如它们名字所暗示的,它们的值分别等于π和e
Random类:
Random类专门用于生成一个伪随机数,它有两个构造器:一个构造器使用默认的种子(以当前时间作为种子),另一个构造器需要程序员显式传入一个long型整数的种子。ThreadLocalRandom类是Java 7新增的一个类,它是Random的增强版。
在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有较好的性能。提示:关于多线程编程的知识,
ThreadLocalRandom类的用法与Random类的用法基本相似,它提供了一个静态的current()方法来获取ThreadLocalRandom对象,获取该对象之后即可调用各种nextXxx()方法来获取伪随机数了。ThreadLocalRandom与Random都比Math的random()方法提供了更多的方式来生成各种伪随机数,可以生成浮点类型的伪随机数,也可以生成整数类型的伪随机数,还可以指定生成随机数的范围
BigDecimal类
BigDecimal(double val)构造器的详细说明时,可以看到不推荐使用该构造器的说明,主要是因为使用该构造器时有一定的不可预知性。当程序使用new BigDecimal(0.1)来创建一个BigDecimal对象时,它的值并不是0.1,它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为double浮点数,所以传入BigDecimal构造器的值不会正好等于0.1(虽然表面上等于该值)。
如果使用BigDecimal(String val)构造器的结果是可预知的——写入newBigDecimal("0.1")将创建一个BigDecimal,它正好等于预期的0.1。因此通常建议优先使用基于String的构造器。
如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将该double浮点数作为构造器参数创建BigDecimal对象,而是应该通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。
BigDecimal类提供了add()、subtract()、multiply()、divide()、pow()等方法对精确浮点数进行常规算术运算
创建BigDecimal对象时,不要直接使用double浮点数作为参数来调用BigDecimal构造器,否则同样会发生精度丢失的问题。
Date类与DateFormat类
Java提供了Date类来处理日期、时间(此处的Date是指java.util包下的Date类,而不是java.sql包下的Date类),Date对象既包含日期,也包含时间。Date类从JDK 1.0起就开始存在了。但正因为它历史悠久,所以它的大部分构造器、方法都已经过时,不再推荐使用了。Date类提供了6个构造器,其中4个已经Deprecated(Java不再推荐使用,使用不再推荐的构造器时编译器会提出警告信息,并导致程序性能、安全性等方面的问题),剩下的两个构造器如下所示。
Date():生成一个代表当前日期时间的Date对象。该构造器在底层调用System.currentTimeMillis()获得long整数作为日期参数。
Date(long date):根据指定的long型整数来生成一个Date对象。该构造器的参数表示创建的Date对象和GMT 1970年1月1日00:00:00之间的时间差,以毫秒作为计时单位。
方法:
boolean after(Date when):测试该日期是否在指定日期when之后。
boolean before(Date when):测试该日期是否在指定日期when之前。
int compareTo(Date anotherDate):比较两个日期的大小,后面的时间大于前面的时间时返回-1,否则返回1。
boolean equals(Object obj):当两个时间表示同一时刻时返回true。
long getTime():返回该时间对应的long型整数,即从GMT 1970-01-0100:00:00 到该Date对象之间的时间差,以毫秒作为计时单位。
void setTime(long time):设置该Date对象的时间
DateFormat:
getDateInstance():返回一个日期格式器,它格式化后的字符串只有日期,没有时间。该方法可以传入多个参数,用于指定日期样式和Locale等参数;如果不指定这些参数,则使用默认参数。[插图]
getTimeInstance():返回一个时间格式器,它格式化后的字符串只有时间,没有日期。该方法可以传入多个参数,用于指定时间样式和Locale等参数;如果不指定这些参数,则使用默认参数。[插图]
getDateTimeInstance():返回一个日期、时间格式器,它格式化后的字符串既有日期,也有时间。该方法可以传入多个参数,用于指定日期样式、时间样式和Locale等参数;如果不指定这些参数,则使用默认参数
DateFormat的parse()方法可以把一个字符串解析成Date对象,但它要求被解析的字符串必须符合日期字符串的要求,否则可能抛出ParseException异常
Pattern与Matcher类
Pattern对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象。执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象
Matcher类提供了如下几个常用方法。[插图]
find():返回目标字符串中是否包含与Pattern匹配的子串。
group():返回上一次与Pattern匹配的子串。
start():返回上一次与Pattern匹配的子串在目标字符串中的开始位置。
end():返回上一次与Pattern匹配的子串在目标字符串中的结束位置加1。
lookingAt():返回目标字符串前面部分与Pattern是否匹配。
matches():返回整个目标字符串与Pattern
是否匹配
。reset(),将现有的Matcher对象应用于一个新的字符序列。
Properties类:
Properties 继承于 Hashtable。表示一个持久的属性集,属性列表以key-value的形式存在,key和value都是字符串。
Properties 类被许多Java类使用。例如,在获取环境变量时它就作为System.getProperties()方法的返回值。我们在很多需要避免硬编码的应用场景下需要使用properties文件来加载程序需要的配置信息,比如JDBC、MyBatis框架等。Properties类则是properties文件和程序的中间桥梁,不论是从properties文件读取信息还是写入信息到properties文件都要经由Properties类。
public static void main(String[] args) throws Exception {
Properties props = new Properties();
//向Properties中添加属性
props.setProperty("username", "yeeku");
props.setProperty("password", "123456");
//将Properties中的key-value对保存到a.ini文件中
props.store(new FileOutputStream("a.ini"), "comment line");
//①//新建一个Properties对象
Properties props2 = new Properties();
//向Properties中添加属性
props2.setProperty("gender", "male");
//将a.ini文件中的key-value对追加到props2中
props2.load(new FileInputStream("a.ini"));
//②
System.out.println(props2);
}
// 加载获取Connection
public Connection getConnection() throws Exception{
Properties info=new Properties();
info.load(this.getClass().getClassLoader().getResourceAsStream("jdbc.properties"));
String driver=info.getProperty("driver");
String jdbcUrl=info.getProperty("jdbcUrl");
String user=info.getProperty("user");
String password=info .getProperty("password");
Class.forName(driver);
Connection connection=DriverManager.getConnection(jdbcUrl,user,password);
return connection;
}
可以把Map对象和属性文件关联起来,从而可以把Map对象中的key-value对写入属性文件中,也可以把属性文件中的“属性名=属性值”加载到Map对象中。由于属性文件里的属性名、属性值只能是字符串类型,所以Properties里的key、value都是字符串类型。该类提供了如下三个方法来修改Properties里的key、value值。
更多参看Properties类的使用:https://www.cnblogs.com/leeego-123/p/11535967.html
这个主题使用的代码格式视乎是有问题的,调整起来很费事
java 输出一个爱心_java基础 之 几个常用的类相关推荐
- java web定义数组_Java基础之数组--数组常用操作
3.2一维数组 3.2.1声明数组 数组类型[] 数组名称:int[] username; 或者 数组类型 数组名称[];int username[]; 3.2.2初始化一维数组 一维数组初始化有两种 ...
- 用java写一个爱心
你可以使用ASCII字符在控制台上输出一个爱心的图形. 例如: public class Heart {public static void main(String[] args) {System.o ...
- 用python输出一个爱心
可以使用 Python 的字符串格式化功能来输出一个爱心. 下面是一个示例代码: print("\n".join(["%s%s%s" % (" &qu ...
- Java IO流大闯关--IO流的常用实现类
这个系列的博客主要是对Java高级编程中IO流相关的知识点做一个梳理,内容主要包括File类.IO流原理及流的分类.文件流.缓冲流.转换流.标准输入输出流.打印流.数据流.对象流.随机存取文件流.NI ...
- java输出一个空心的爱心
在 Java 中,你可以使用字符串和循环语句来输出一个空心的爱心. 下面是一个例子: public class EmptyHeart {public static void main(String[] ...
- JAVA 输出一个会动的爱心
以下是 Java 代码,可以在控制台输出一个会动的爱心: public class Love {public static void main(String[] args) throws Interr ...
- java输出五行菱形_Java打印一个菱形
打印出如下图案 (行数为奇数n的菱形) * *** ***** ******* ***** *** * 代码: public static void main(String[] args) { int ...
- java输入一个数字输出_java 输入一个数字,反转输出这个数字的值(实现方法)
如下所示: package 第四天; import java.util.Scanner; public class 数字反转 { public static void main(String[] ar ...
- java io流 教程_Java基础教程:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:指的是从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列 ...
最新文章
- jquery.datatable能返回数据绑不上_地磁场可以影响人体机能吗?解释有多种,但都不理想...
- uboot引导kernel - 2- uboot/kernel需要放在DDR什么位置的问题
- 编程入门:准备学Python入门编程 为什么前辈一直劝我不行?
- Worktile完成新一轮融资,将发力研发管理赛道
- IT常说的协议指的是什么?—Vecloud微云
- docker可以把应用及其相关的_Docker相关命令应用
- 64位指针膨胀 java_Java 程序优化知识笔记
- Kubernetes应用部署模型解析(原理篇)
- 二十一、PHP框架Laravel学习笔记——模型的访问器和修改器
- 华为主题包hwt下载_华为主题 | 黑白人物
- java跳转控制语句有哪些_Java语言基础学习之流程控制语句和跳转控制语句实例分析...
- MySQL中修改root密码的方法
- [原创]C#之探索发现:在WinForm上写的一个模拟分页小程序
- 使用keras和tensorflow进行minst数据集图像分类
- Quartz开发-插件开发
- 2015年高教社杯全国大学生数学建模A题太阳影子定位(Matlab代码)
- Redis的安装启动,菜鸟使用(windows)
- Windows 10 开启代理软件代理流量之后,系统的某些自带软件无法联网
- 解决python运行selenium程序执行完后,Chrome浏览器自动关闭的问题
- Pytorch使用CPU