Java核心卷I学习笔记(一)

编程入门 行业动态 更新时间:2024-10-10 05:21:48

Java核心卷I<a href=https://www.elefans.com/category/jswz/34/1770117.html style=学习笔记(一)"/>

Java核心卷I学习笔记(一)

第一章 Java程序设计概述

1、Java不止是一种语言,Java是一个完整的平台,有个庞大的库,其中包含了很多可重用的代码和一个提供诸如安全性、夸操作系统的可移植性以及自动垃圾回收等服务的执行环境。

2、Java关键特性

1)简单性:摒弃C++很少用、难以理解的语法;另一方面简单体现在Java可以做到很小,只有几百K,在嵌入式设备上运行。

2)面向对象:Java将重点放在数据(即对象)和对象的接口上;举例木匠要做一个椅子,一个面向对象的木匠始终关注的是椅子,第二位才是工具,一个非面向对象的木匠,首先考虑的是用什么样的工具。

3)分布式  4)健壮性  5)安全性

6)体系结构中立,Java利用虚拟机,通过编译器生成一个体系结构中立的目标文件格式,这种格式经过编译,只要有java运行时系统,可以再多种处理器上运行。

7)可移植性 8)解释型  9)高性能 10)多线程 11)动态性

3、Java发展简史

1)Java起源:1991年由Patrick Naughton和James Gosling带领的Sun公司团队想设计一种语言,应用对象为有线电视转换盒之类的设备,这种设备内存和处理能力有限,这就要求语言小且紧凑;另外不同厂家处理器不一样,这就要求不能与任何特定体系捆绑在一起,这个项目被命名为“Green”。Gosling将这种域名成为“Oak”(橡树),后来因为Oak已经是计算机语言的名字,于是将其改名为Java。

2)探索:1992年,Green项目组发布第一个产品称之为“*7”,这个产品可以实现远程控制,遗憾的是Sun公司对这个产品不感兴趣,他们不得不去寻找新的方法和买家,将技术推向市场。这时候项目换了一个新名字“First Person公司”,花了一年多的时间也没有找到买家,1994年公司解散。

3)起步:这时候浏览器开始发展,为了展示java的超强能力,项目组用Java编写了HotJava浏览器,设计者让HotJava浏览器在网页中内嵌java代码,自此至今引发了人们对Java的狂热追求。

4)发展:1996年发布了不太好用的Java第一个版本1.0,后来的1.1弥补了很多明星的缺陷,大大的增加了反射能力和GUI编程的事件模型——当依然不好用;1998年发布1.2版本变得更加接近“一次编写,随处运行”的思想,之后Java有了三个版本移动端、企业版的、SE标准版。

5)崛起:2004年发布5.0,2006年发布java 6;2009年Sun被Oracle收购,2001年Oracle发布Java 7,其中只是做了一些简单改动;在2014年Java 8发布,在近20年终这个版本有了最大的变化。Java 8提供了一种“函数式”编程方式,并很容易的标书并发执行计算。

第二章 Java程序设计环境

1、基础概念

1)JDK Java Development Kit,编写java程序的程序员使用的软件

2)JRE Java Runtime Environment ,运行Java程序的用户使用的软件;

3)Java SE,Java ME,Java EE分别对应标准版、移动版、企业版;

4)Java 开始用1.2、1.3等来表示版本,后续为了反映Java的重大变化开始命名为Java 2,因此有了Java 2SE 5.0;但是从2006年Java版本得到了简化,后续版本标准版命名为Java SE 6/7/8;后续oracle为了解决一些bug发布的微小版本比如:Java SE 8u31,Java SE 8的第31次更新。

2、基础程序运行、安装、IDE环境略。

第3章 Java的基本程序设计结构

1、Java最基本的程序

/****@autor xlf*@date 2020/1/4*/public  class FirstSample{public static void main(String [] args){System.out.print("Hello World!");}
}

2、java注释,单行注释用“//”  ;多行注释 /**  .......   */,如上文代码。

3、Java数据类型,java是一种强类型语言,这意味着每一个变量必须声明一种类型;在java中有8类基本类型(primitive type),其中4中整型(int、short、long、byte)、2中浮点型(float、double)、1种用于表示Unicode编码的字符单元char和boolean类型。

1)、特殊值,有三个特殊值表示溢出和出错情况:正无穷大(Double.POSITIVE_INFINITY,Float也有同样的值)、负无穷大(Double_NEGATTIVE_INFINITY)、NaN(不是一个数字,Double.NaN),注意所有的NaN都是不相等的。

2)特别注意:浮点数值不适用于无法接受四舍五入误差的金融计算,如System.out.println(2.0-1.1)  //输出结果0.8999999999,而不是人们想象中的0.9,这是因为浮点型采用的是二进制系统表示,而在二进制系统中无法精确的表示1/10。如果要非常精确表示应该用BigDecimal类。

备注,解释为什么二进制无法表示精确数字,更详细参考:

这里以0.2为例:因为二进制只有0和1表示,某个位置上的数的意义:

所以0.2表示只能用0+1/2+1/4+1/8+1/16....这些数字组合来表示0.2,正好等于0.2的一堆01组合就是表示0.2的二进制数字,但是很遗憾0.2以及很多数字无法找到正好的数字,只能无限的迫近(无聊或者有兴趣的可以自己试试),这就是为什么无法精确表达0.2。

4、常量声明,利用关键字final,eg: final double CM_PER_INCH=2.54;在Java类中,利用static final设置一个类常量,如果再加上public,这样其他类也可以使用这个常量。

5、字符串String类型

1)字符串不可改变,这是因为Java文档中将String类对象成为不可变字符串。Java将字符串存放在一个公共存储池中,字符串变量指向存储池中相应的位置;如果复制一个字符串变量,原始字符串与复制字符串共享相同的字符(即两个变量,指向存储池中同一个对象,存储池中只有一份对象,二者公用);这样设计是作者初衷认为字符串提取、拼接等这样的操作很少,实际程序应用中改变字符串的情况很少;如下文代码中,三者输出结果一致,即在内存池中共用了一份对象。

  public static void main(String [] args){String str="Hello";System.out.println(str.hashCode());String str1="Hello";System.out.println(str1.hashCode());String str2=str;System.out.println(str2.hashCode());			}

2)字符串比较,请用equals,不要用==;equals检测两个字符串是否相等;==检测两个字符串是否放在同一个位置上,对于有些情况==就会出错;不要用==来比较字符串给自己找麻烦,如下文看似相等的不确定因素

  public static void main(String [] args){String str="Hello";System.out.println(str=="Hello"); //true,所有"Hello"共用存储池的一个对象,存储位置相同System.out.println(str.substring(0, 3)=="Hel");//false,因为str.substring(0,3)并不是在存储池中,因此不等;System.out.println(str.substring(0, 3).equals("Hel"));//true,equals只比较内容是否相等}

3)空字符串与Null,有时候声明一个字符串为null,使用字符串前先检查字符串是否为null,然后利用str.leng==0或者str.equals("");

4)字符串的构建器StringBuilder:有时候字符串需要一些较短的字符构成,例如一句话由单词构成,这时候采用字符串拼接的方式效率会比较低(根据字符串不可改变的原理,每次构造都会新建一个字符串,会占用存储,而且过程字符串并不是想要的,没有任何意义),这时候可以用StringBuilder来构建。

    StringBuilder strbuilder=new StringBuilder();strbuilder.append("hello");strbuilder.append("world");strbulider.toString();

5)StringBuffer,它是StringBuilder,从5.0开始引入StringBuilder,查看JDK二者的API是完全相同的;区别StringBuffer效率较低,但是允许多线程的方式添加、删除字符的操作;因此如果单线程中应该使用StringBuilder,而日常一般多为单线程。

6、输入与输出

1)输入,利用Scanner对象类构造输入流,支持多种形式的输入,如file、InputStream等;Scanner提供nextLine、nextInt()等多种方法读取内容。

      /*** 个人信息.txt* 张飞* 32* 浙江 杭州* 男*/public static void main(String [] args) throws FileNotFoundException{File file=new File("D:\\0learn\\个人信息.txt");Scanner sc=new Scanner(file);String name=sc.nextLine();System.out.println("name:"+name);//读入一行System.out.println("年龄:"+sc.nextInt());//读入一个整型,还有很多其他类型System.out.println("省份:"+sc.next());//读入下一个单词System.out.println("县市:"+sc.next());//读入单词System.out.println("性别:"+sc.next());//读入//下一个单词}

2)格式化输出,利用System.out.printf来实现;先举例看如何使用:

       System.out.printf("Hello,%s. Next year , you'll be %d",name,age); //%s接受一个字符串,%d接受一个整型;

A、输出格式的参数替换:每一个以%字符串开始的格式,说明那里需要用相应的参数进行替换;格式说明符(即%)紧跟相应的格式化的数值类型,s代表字符串,f代表字符串,d代表十进制整型,更多如下图:

B、输出多个标志,如都好分割100,000等

      System.out.printf("%(,d",-10000/2);//(5,000)System.out.printf("%+,d",10000/2);//+5,000System.out.printf("%+,d",-10000/2);//-5,000System.out.printf("%x",10000/2);//1388,输出十六进制System.out.printf("%+,.4f",-10000.0/2);//-5,000.0000;输出带正负,用逗号隔开,保留4位小数的数字

C、日期打印,利用printf打印日期时,以t开始,以日期和时间转换符结束(eg:Y 4位数字年,m两位数的月,T 24小时时间等,还有年月日时分秒、毫秒,以及12小时、24小时等,为了完整描述时间有一条非常复杂的字母表,具体可以自行百度)。

另外为了格式化一个参数如年、月、日,重复输入参数太笨拙,printf提供了可以采用参数索引的方式,具体格式紧跟%后面,并以$终止,如“%1$s”,使用第一个为字符串的参数(需要注意索引从1开始,不是0);

还可以使用<标志,他表示前面格式说明中的参数将被再次使用。

      System.out.printf("%s %tY-%tm-%td","今天是:",new Date(),new Date(),new Date());//这种方式太笨System.out.printf("%1$s %2$tY-%2$tm-%2$td","今天是:",new Date());//强行指定参数索引,注意索引从1开始System.out.printf("%1$s %2$tY-%<tm-%<td","今天是:",new Date());//<前面的参数被再次使用

3)文件输入与输出

A、文件输入/读取,同样可以采用Scanner in=new  Scanner(Paths.get("c\\learn\\个人信息.txt"),"UTF-8");

B、文件输出/写入,采用PrintWriter

      PrintWriter pw=new PrintWriter("D:\\0learn\\个人信息1.txt");pw.append("吸入测试内容");pw.flush();pw.close();

7、大数值,如果整数型和浮点数精度无法满足要求,就采用两个大数据类型:BigInteger和BigDecimal,可以处理包含任意长度的数据;注意:不能用算数云算符+*这些来计算大数据类型,用add、multiply来计算。

8、数组

A、数组的声明,int a[] 或者 int[] a都可以,大多数人喜欢后者,因为这样把变量名称和数组分开了;

B、数组默认值:数字型数组默认值为0,bool型数组默认值false,string型数组默认值null;

C、数组一旦创建就不能改变数组的大小,尽管可以改变每个元素;如果经常改变的数组,使用array list有关数组列表;

D、数组初始化 

      1)int []a1={1,2,3,4};

       2)inta [] a2=new int[]{1,2,3,4};

       3)new int[]{1,2,3,4};//声明一个匿名数组;

       4)数组拷贝,int [] a2=Arrays.copyOf(.......);

       5)数组属于引用类型,因此当数组赋值时,赋予的是引用地址(大家共用一份地址),因此当改变任意一个数组中的某个值时,两个数组中的值都会改变;

      int [] a1=new int[]{1,2,3,4,5};int [] b1=a1;b1[2]=10;System.out.println(a1[2]); //打印10,因为a1和b1共用一个地址对象,一变全变

 

更多推荐

Java核心卷I学习笔记(一)

本文发布于:2024-02-19 18:58:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1765447.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:学习笔记   核心   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!