java基础部分学习心得.doc

上传人:wux****ua 文档编号:9460485 上传时间:2020-04-05 格式:DOC 页数:59 大小:2.98MB
返回 下载 相关 举报
java基础部分学习心得.doc_第1页
第1页 / 共59页
java基础部分学习心得.doc_第2页
第2页 / 共59页
java基础部分学习心得.doc_第3页
第3页 / 共59页
点击查看更多>>
资源描述
一Java数据结构,链表一Java简介JAVA核心机制:JAVA虚拟机(实现了一处编程,到处运行),因为其运行过程是先编译成.class字节码文件,然后在jvm(Java Virtual Machines)运行,不同的操作系统有不同的虚拟机,所以实现了一处编程,到处运行。垃圾收集机制:(帮助解决了一些健壮性的问题,不像C/C+那样内存管理那样麻烦),在编程过程中,会创建许多对象,存储在堆空间里,占用内存,但是java的垃圾回收机制,会不定时的自动回收在堆空间里没有任何引用指向的对象,所以在编程时应习惯性及时将不用的引用设置为null。可以通过System.gc();来快速执行垃圾回收机制。J2SDK(JDK): JAVA Devleopment kit软件开发包,开发需要JDK(包含JRE,编译运行开发工具)。JRE:JAVA Runtime Environment 运行环境,用户只需要JRE(包含系统类库和JVM)。软件格式:每一个类都对应一个class文件如果一个源文件 文件中包含public类,则该文件名必须以该类命名,每个源文件中最多有一个public类JAVA的执行入口是main()方法,固定格式:public static void main(String args)数组名字可以改变。区分大写小2 Java语言基础变量取名:标识符选取取名:一定要注意“见名知意”,但不能和JAVA语言的关键字重合字符常量“字符串常量”变量使用:先声明,再赋值,才可以使用变量基本类型:4类8种;Boolean类型 :逻辑运算,用于程序流程控制,只能取 true ,falseChar类型 : 字符类型eg:char eChar=中,Unicode编码(每个字符对应有一个编码) 每个字符占两个字节,无论中午,英语,数字,每个字符都是占两个字节。整数类型 :byte 占一个字节 -128-127 short 2个字节 Int 4个字节 对应包装类Integerlong 8个字节浮点类型 flaot 4个字节double 8个字节 对应包装类 Double格式 很重要1. 大括号对齐2. 遇到用TAB or shift+Tab3. 程序块之间加空行4. 运算符两侧加空格 有特定的条件5. 并排语句之间加空格6. 前面有空格7. 成对编程异或 相异为true逻辑& 和逻辑| 无论结果如何,后面的表达式一定会计算短路& 和短路| 第一个表达式已经可以得到结果了,后面的不算了分支循环语句If语句Ifelse ifelse ifelse ifelse 当只有一句语句要执行的时候,可以省略大括号 但是目前无论是否可以省略,都写上循环语句for循环,for(表达式1;表达式2;表达式3)语句;.;while循环 while(逻辑表达式)语句;.;do while 循环 do(语句;.;) while(逻辑表达式); 注意,do while循环 while(逻辑表达式);的分号if 语句后面注意不要加分号,不容易被查错break语句 终止某个语句块的循环,用于循环中,强制跳出循环continue 语句,用在循环中,终止当前循环中下面的语句,到下一次循环switch() case xx:语句;case xx:语句;default:语句; 这里注意case和break的搭配使用,如果没有break,则程序会一直向下执行。方法 public (static) 返回值类型 方法名称(形式参数;.)方法体;java语句;return返回值当出现return时,立即返回。无返回值时,类型为voidStatic是静态方法,直接使用类名调用,非静态方法,需要使用对象调用。方法只有当调用的时候,才会执行,方法中涉及的局部变量,在方法被调用时,出现在栈空间,一旦方法结束,所占用内存消失。. method(实参;.) /调用 (面试)递归三面向对象面向对象编程:运用人类正常思维方式构造系统,常使用的原则和思想方法:抽象,继承,分类,聚合,多态1. 使用人类自然语言,描述这个业务的需求2. 根据业务需求寻找涉及的事物类-对象3. 数据模型设计:利用数据描述对象,以及对象之间的关系,将对象数据化。4. 概要设计类的设计(概要设计):定义类的属性数据如何初始化:构造器,工厂方法。详细设计5. 利用分析数据6. 根据数据设计算法实现功能7. 逐一实现算法8. 实现用户响应9. 界面状态管理用面向对象考虑问题时,不应该考虑第一步,第二部要做什么,1.首先考虑的是,这个问题涉及哪些类和对象,2.考虑这些类和对象,每一种应该具有哪些行为和属性3.每类和类之间具备了什么关系。类是一类事物的一个抽象对象这个类具体的一个实例类和对象多为关系:关联关系继承关系:一般和特殊的关系,eg:游泳运动员是运动员的一种,足球运动员是球类运动员的一种。聚合关系:整体和部分的关系,eg:队长和队员是球队的一部分,是聚集关系,头和手是身体的一部分,是组合关系。实现关系:多态:成员变量可以不初始化,JAVA默认会初始化对象的创建和使用:使用new关键词来创建对象对象.成员变量 来调用对象的成员变量(引用)对象.方法 来调用对象的方法(引用)同一类的每个对象有不用的存储空间同一类的每个对象共享该类的方法构造方法:构造方法的名字和类名要完全一样,和new一起使用来创建新对象,对对象进行初始化的。在类中用来初始化对象的一个方法(函数)Eg:public class Person /创建一个person类Int id;Int age = 20; /定义成员变量Person(int _id , int _age) /定义一个构造方法,方法名必须与类名完全一样id = _id;age = _age;Public static void main (String args) Person Tom = new Person (1 ,20); /创建一个对象Tom,利用构造方法进行了初始化 没有指定构造方法时,编译器自动指定一个空的,一旦自己定义了,编译器就不定义了,构造方法前面没有返回值类名首字母大写,方法名变量名小写,后面的每一个单词的首字母都要大写方法一旦执行完毕,为这个方法所分配的局部变量的存储空间将消失方法重载,构造方法的重载:方法名相同,类型相同,但是参数变量类型不同的,可以构成重载,构成多个方法,调用时会根据不同的参数选择相应的方法 构造方法与普通方法一样,可以进行重载关键字:this在那个对象,this就指向那个对象,指向对象本身自己的引用static: 在类中用static声明的成员变量是静态成员变量,分布在data seg内存空间里,在第一次使用时被初始化并且只有一份,整个类的所有对象都可以使用,可以用类名.静态成员变量,来直接调用。用static声明的方法叫静态方法,动态方法通过某一个对象来调用,静态方法没有对象照样可以使用,eg:类名.静态方法,来调用,不用写对象名字,所以在static方法里不能访问非static的成员Static里不会隐式传递this关键字,即调用不了对象属性所以当一个方法只和参数相关,则使用static方法,如果和成员变量相关,则不使用。静态的方法不针对某个对象调用,非静态成员专属于某个对象,所以静态方法,不能访问,可以通过对象引用,或者类名来访问静态成员Static块:在类加载期间就被执行的语句块,软件运行时,会先在jvm上加载类,则static块可以用来加载许多初始化资源。包:package和import、在程序的第一行:package com.satisfy(公司域名倒过来).sun(具体名,项目名)class文件应该放在与正确的目录下面,另外该类的源文件可能会产生影响,最好delete或者转移其他的类要想访问的话:1.需要写全类名,2.可以使用import com.satisfy.sun.*(具体类名);来引入,3.如果两个类位于同一个包,也可以。如果其他类与该类不在同一包且不在同一目录下,在其他目录想访问时,需要配置classpath环境变量,将class文件的最上层包的上一级目录配置在classpath下只要进行打包处理,生成的class都要放在正确的目录下,否则无法运行,同样要配置classpath如果一个A类位于A包,引入了B类位于B包,如果想要执行A类,则要写全包名JDK主要的包介绍:Java.lang 里面的类的不需要引入,直接使用Jar -cvf .jar *.*(当前目录)可以打包访问控制,权限修饰符:private,default,protectde,public修饰符类内部同一个包子类任务地方privateYesdefaultYesYesprotectedYesYesYespublicYesYesYesyes类的继承:extends,什么什么是一种什么什么,那么他们之间关系就是继承,通过继承,子类自动拥有基类(父类)的所有的方法和成员变量Java只支持单继承,一个子类只能有一个基类,一个基类可以派生出很多子类子类比父类大,子类对象包含父类对象重写:1.可以根据需要对从父类继承的方法,在子类中重写 2.重写方法的返回类型,参数,方法名称必须相同3.重写方法不能使用比被重写方法更严格的访问权限Super:指向当前对象里的父对象一继承中的构造方法:子类对象的构造过程中必须调用父类的构造方法二子类可以在自己的构造方法中使用super(argujment_list)来调用的父类的构造方法1.使用this(argument_list)来调用本类中的其他构造方法2.如果调用super,必须写在子类构造方法的第一行三.如果子类的构造方法中没有显示调用的父类方法,则系统默认调用父类的无参构造方法四.如果子类的构造方法中既没有显示调用的父类的构造方法,而且父类中也没有无参构造方法,则编译出错Object类:是所有java类的根基类Public class Person 等价于 public class Person extends Object方法 toString :返回该对象的字符串表示,通常是对象名+hashcode一般情况下,所有的子类都要重写这个方法,重写请copy,方法equals :指示其他某个对象是否与此对象相等当x与y是同一个对象时,才返回false,可以重写方法,改返回 一些其他的类,String ,Date也重写了equals方法,方法hashcode:返回该对象的名字加哈希码,这里的哈希码就是返回的物理地址。一般所有类的都要重写这三个方法。对象转型:casting1.父类的引用类型变量可以指向子类的对象2.一个父类的引用不可以访问其子类新增加的成员这里a是父类animal的一个引用,当他指向其子类的一个对象时,不可以访问新增加的furname成员3.可以使用instanceof来判断该引用变量所指对象是否该类或者该类的子类a 是父类的引用变量,a instanceof Animal判断a所指的对象是否在Animal类中。4. 子类的对象可以当作父类的对象来使用,upcasting,反之,downcasting。加强制转换符多态:多态的存在条件1. 要有继承2. 要有重写3. 父类引用指向子类对象这三个条件一旦满足,当你调用父类里面被重写这个方法时,实际当中,new的是哪个子类对象,就调用那个子类对象中重写的方法用abstrack关键字来修饰一个类,这个类叫做抽象类用abstrack关键字来一个方法时,这个方法叫做抽象方法当一个类里面含有一个抽象方法,abstrack时,这个类也必须被声明为abstrack类抽象方法,没有实现,public abstrack void method();怎么实现,不用管,子类会去实现,子类会重写这个方法如果子类也没有重写抽象方法,则出错,父类有抽象方法,子类继承了,就必须重写抽象方法,不然就需要重新再定该子类为抽象类,声明抽象方法,则该子类变为抽象类,不能new对象,他的子类来实现方法。抽象类:所以抽象类必须被继承,抽象方法必须被重写抽象类的意义:1. 抽象类就是一个父类,可以封装所有子类所共有的成员变量和属性2. 为子类提供一个公共的类型3. 定义有抽象方法,虽然每个实现同一个行为的方法不一样,但是定义一样,抽象类可以封装4. 抽象类不可以被实例化关键字final,1.final定义的变量值(成员变量,局部变量)不能被改变2. final的方法不能被重写3. final的类不能被继承Interface 接口接口是抽象方法和常量值定义的集合接口是一种特殊的抽象类,这个类只包含常量和抽象方法,没有变量和方法实现public interface studentpublic static final int id = 007;public run();public study();public sleep();public sing();接口的特性:1. 接口可以实现多种继承2. 接口之中声明的属性,默认为public static final,也只能是这样,为了解决一些c+的问题3. 一个接口里的方法只能是抽象方法,只能是public4. 接口也可以继承其他的接口,添加自己新的属性和方法implements 当实现一个接口时,不是用extends 而是implements 多个无关的类可以实现同一个接口一个类也可以实现多个接口与继承一样,接口与实现类之间也存在多态性“内存分析 非常重要”四异常处理:运行期出现的错误:观察错误的指示和行号最重要(程序永远都是调试调出来的)概念:是java提供的用于处理程序中出现错误的一种机制这里所谓的错误是指在程序运行过程中,出现的一些异常事件(除0溢出啊,数组下标越界,读取的文件不存在啊)良好的程序,应该在发生异常时,提供处理这些错误的方法,使得程序不会因为异常的发生而阻断,或产生不可预见的结果当执行java程序时,如果发生异常,可以生成一个异常类对象,该对象封装了异常事件的信息并被提交给java运行时系统,这个过程叫抛出(throw)当java运行时系统接收到异常对象时,会寻找处理这一异常的代码,并把当前异常对象交给其处理,这过程叫捕获(catch)关键字 try 有可能会发生异常的语句;有可能发生异常的方法;catch (错误类名 对象名) 抓到这个异常了,如何提示对象名.printStackTrace(); /打印这个错误的堆栈信息常见异常:ArrayIndexOutOfBoundsException用非法索引访问数组时抛出的异常。ArithmeticException 当出现异常的运算条件时,抛出此异常。 所有类的老祖宗类,throwable类 下面又分为两个类: 1.error类:java运行时出现的异常,系统内部出错,java虚拟机出错了 2.Exception类:能够处理的错误,网络故障,文件损坏,设备错误,用户输入非法等情况导致的异常可以catch,可以捕获到,A.分为普通exception,必须捕获的,B. RuntimeException,运行时出现的,经常出的,有时候可以不捕获属于非检测异常常见的5个IllegalArgumentException向方法传递了一个不合法或不正确的异常NullPointerException 空指针异常ArrayIndexOutOfBoundsException,数组下标越界ClassCastException非法转换实例NumberFormatException字符串非法转换为数值类型异常public void somemethod()throws SomeException 声明该方法可能抛出的异常If(someCondition) 当一些条件时throw new SomeException(“错误原因”); 构造并抛出异常对象try 捕获异常someMethod();catch(SomeException ex)如何处理的代码 处理异常try 可能抛出异常的语句;catch(某个Exception e) 处理方法catch(某个Exception2 e) 处理方法;finally /无论如何都会执行的语句.Try try.捕获并处理例外的范围可能一种或者几种类型的异常对象,分别后面跟着catch来处理相应的异常如果没有例外发生,不执行catchCatch 相应的异常对象,在catch语句块中可以使用一些方法来获得一些信息比如 getMessage():用来得到相关异常事件的信息 printStackTrace()用来跟踪异常事件发生时执行堆栈的内容然后finally 异常处理统一的出口,无论try是否抛出例外,finally里面的语句都要执行所以通常finally语句中可以进行资源的清楚工作:关闭打开的文件,删除临时文件使用一个方法,或者使用一个类,有可能抛出除RuntimeException意外的异常时,一定要trycatch,如果不想trycatch,则需要继续抛出这个异常,交给上级处理为程序的提供一个出口,使得程序流程在转到程序的其他部分的以前,能够对程序的状态做统一的管理抛出异常throws ,如果一个方法,无法处理这个异常,或者不想处理这个异常,那么就使用这个关键字抛出这个异常,在方法声明后面跟着写throws 异常名就可以了。抛出的异常按照先后顺序,从小到大,严格的来说,每一个异常都最好抛出还有一个关键字throw,throw new ArrayIndexOfBoundException()抛出一个异常对象 定义声明自己的异常类 继承Exception异常与继承的关系,当继承的时候,重写了某方法,该方法原本是抛出某一个异常,你在重写的时候,如果要抛出异常,需要抛出与原方法一模一样的异常,或者不抛出异常,注意,如果抛出必须一模一样,范围不能大不能小注意点:A. 一段代码可能产生多种异常,分别用catch捕获相应的异常,当发生这个相应的异常时候,会跳到相应的地方进行处理B. 如果没有异常发生,则不执行catch里面的语句C. 在catch中声明的异常对象封装异常该异常的信息,在语句块中,可以使用该对象的一些方法来处理D. Catch从上到小的异常类顺序应该是从子类到父类,否则编译不通过E. 关键词finally语句是最后执行的,无论有没有抛出异常,finally指定的代码都要执行,通常用来释放资源F. 自行抛出异常,使用throw关键字G. 方法中抛出异常,可以用throws关键字,将异常抛出,交给调用这个方法的上一级来处理H. 三个方法getMessage()得到有关异常事件的信息,printStackTrace打印异常的堆栈信息,getCause()获取该异常出现的原因,有时候当一个异常由另一个异常导致的时候,这个方法很重要I. 有时候还是需要自己定义异常,继承Exception类自定义异常即可捕获异常,先捕获小的,再捕获大的五数组多种相同类型的数据集合,在内存里面挨着分小格,每个小格里有东西,每个小格有个下标Java的数组不能分配在栈上,属于引用类型,可以看成是一个对象,一维数组声明type var ; 或者,type var 比如int a1 ; int a1;double b;Person p; String s1; 在java里面声明数组不能指定数组的长度 比如 int a5;是错误的使用new来创建数组对象如果使用的是类名 + 来声明一个数组,则指向的是该类名的一个引用,然后new这个对象,该引用指向对象。 这里声明一个数组Date days; days = new Date3;,然后days1 = new Date(构造方法);days2 = new Date(构造方法);.动态初始化:先分配空间,然后再往里面赋值静态初始化:定义数组的同时就为数组分配空间和赋值主方法中main(String args)就是声明了一个数组,如果想打印这个数组的内容,可以在执行程序时,后面增加命令行参数,来使用。System.exit 系统退出 System.exit(-1)非正常退出,0正常退出Java的数组声明,是按照从高维到低维的方式,简单一点说就是从左到右六API常用类String类 代表不可变的字符序列String 类 常用构造方法String(char value)Allocates a new String so that it represents the sequence of characters currently contained in the character array argument.分配一个新的String 使其表示当前字符数组里所包含的字符序列。String(char value, int offset, int count)Allocates a new String that contains characters from a subarray of the character array argument.分配一个新的String,包含当前字符数组里从offset个字符开始的共count个字符,截取一部分。public boolean equals(Object anObject)Compares this string to the specified object. The result is true if and only if the argument is not null and is a String object that represents the same sequence of characters as this object.String类重写的equals方法,将此字符串与指定的对象比较,如果字符串序列相同,则为trueString类常用方法charAt(int index)Returns the char value at the specified index.返回该字符串下标为index标号的字符,String s1 = new String(“sunlandong”);s1.charAt(1) 就相当于 ulength()Returns the length of this string.返回String的长度indexOf(String str)Returns the index within this string of the first occurrence of the specified substring.返回该字符串str在指定字符串中第一次出现的索引 s1.indexOf(“lan”)就相当于 3,如果指定字符串中没有str字符串,则返回-1equalsIgnoreCase(String anotherString)Compares this String to another String, ignoring case considerations.忽略大小写 比较字符串replace(char oldChar, char newChar)Returns a string resulting from replacing all occurrences of oldChar in this string with newChar.返回一个新的字符串,将原字符串里所有 的oldchar换成新的newcharstartsWith(String prefix)Tests if this string starts with the specified prefix.是否是以此字符串为前缀开头的public boolean endsWith(String suffix)Tests if this string ends with the specified suffix.是不是以此字符串结尾的toLowerCase()Converts all of the characters in this String to lower case using the rules of the default locale.使用默认语言环境里的规则将字符串里所有字符转换成小写toUpperCase()Converts all of the characters in this String to upper case using the rules of the default locale.转换成大写substring(int beginIndex)Returns a string that is a substring of this string.返回一个新的子字符串,从beginindex字符开始,一直到结尾trim()Returns a string whose value is this string, with any leading and trailing whitespace removed.返回该字符串的副本,忽略前面部分和后面部分的空白静态方法的重载public static String valueOf(Object obj)Returns the string representation of the Object argument.返回object参数的字符串表示1. object参数的字符串表示,将调用object类里的toString方法,2. 如果传进来的是一个object的子类,所有类都是object的子类那么将存在 A.存在继承, 把一个子类传给object,这个类本身的方法已经消失了,只能看到父类的方法 B.但是如果子类重写了toString 方法, C.有了继承,有了重写,又有父类的引用的指向子类的对象,那么存在动态绑定,多态public String split(String regex) 根据给定的正则表达式的匹配来拆分此字符串,形成一个字符串数组,比如String s1 = “sun lan dong”; String s = s.split(“ ”)使用“ ”拆分后,就成了s0=sun;s1=lans2=dong的数组了StringBuffer 和StringBuilder 类 可变的字符序列 (Buffer是缓冲区)在内存中是可变的,可以直接删减 添加重要:为了提供性能:静态字符串(字面量,常量,常量连接)是存储在常量池中的,对于重复出现的常量,会现在常量池找,进行重用,不会创建新的对象。但是如果使用NEW关键字创建对象,则不是。基础数据类型包装类每一个基础数据类型都是分配在栈上,如果在想分配在堆上,则需要-包装类具体方法和使用参考API,需要注意的是,5.0以后有了自动装箱和拆箱Math 和 File类File用于描述一个文件或者目录/* * boolean isFile() * 当前File表示的是否为一个文件 */Long time = lastModified()获取最后修改时间createNewFile()方法,创建文件,创建之前,最好都用exists()方法做判断,看该文件是否存在,不存在则创建/* * 判断目录是否存在,不存在则创建,mkdir创建一个目录 * mkdirs创建一个包括所有必需但不存在的父目录 */如果父目录中,有不存在的部分,也是可以创建的,已经存在的,则不创建同样是在做判断之后,才操作delete()方法,删除文件或者目录,同样是在做判断之后,再操作file.getParentFile()获得父目录名,然后创建使用常量File.separator来表示分隔符最好,可以解决一些跨平台出现的不必要的错误方法isFile()是否是文件方法isDirectory()是否是一个目录用delete()方法删除目录的时候,如果目录下面还有子类目录,则不会删除成功,删除的是File表示的最下面一层、/* * listFiles()方法 * 返回值是一个File数组 * 拿到目录下的子目录信息过滤器的使用:就是匿名内部类 局部匿名内部类使用和创建 * 当一个类创建或者实现来完成一个任务,且只使用一次的时候,那么建议您使用匿名内部类 * 其优点在于不用额外的去维护一个类 * 每一个类都会生成一个class文件/* * 队列Queue,是一个接口 * 用于存储一组数据的 * 存取元素必须遵循先进先出的原则将队首的元素取出来 poll()返回值是取出的该元素类型得到队首元素,peek(),但是不会将其从队列中取出队列遍历 while for都可以双端队列限制只能从一边进一边出以后的结果/进站push()/获取栈首元素(出栈)/* * 出栈pop * 先进后出 * peek取得栈首,但是不出栈 */ RandomAccessFile随机访问文件 * 访问包括读写 * 读写是基于指针的操作/* * 如果一个字节一个字节的读写,速度很慢,还伤硬盘 * 加快读写效率的方式是减少读写次数,先将读写内容保存在一个缓冲区的地方,再一次性读写即使用读写的方法里的write(byte【】 b) read(byte【】 b)数组满了之后,则操作读写,如果没满之前操作读写,最好使用write的重载方法/* * 两个RandomAccessFile两个构造方法,(File String),一参数,要读写的文件,二参数,访问模式 “r”读 “rw”读写 * (String , String)一参数,抽象路径名的字符串,二参数访问模式 * 如果参数文件不存在,会自动创建 * 类的方法 * read读write写 */* * GKB 国标编码,英文一个字节,中文2个字节 * UTF-8英文一个字节,中文3个字节 * getBytes()有一个重载方法,getBytes(“”)参数为编码格式,不传参则默认 */* * RandomAccessFile总是在当前指针所在位置 * 进行读写操作的 * getFilePointer获取指针当前位置使用seek(int i)游标移动,移动指针回到初始位置* public int skipBytes(int n) throws IOException 方法,用于跳过若干字节,n是跳过的字节数 返回值,实际跳过的字节数enum类 枚举类型,限定只能取某些值!比如 public enum Enjoy ( movie, sing, game )然后 Enjoy e = Enjoy.movie来访问容器 非常重要API所提供的一些列类的实例,用于存放程序中的对象通过这个图可以知道,JDK到底给我们提供了什么样的容器1-1-3-61个图,一个类,3个知识点,6个接口,一定要记住的JDK所提供的容器API全都位于java.util包内,java的工具包里容器就是指你可以往里面添加其他对象,比如数组容器里装的是对象这样 Collection 接口,定义了一种存取一组对象的方法,他的子接口,Set和List分别定义存取的方式Set中的数据对象没有顺序且不可以重复,底层是以hash表实现的List中的数据对象可以重复且有顺序,底层是以数组或者链表实现的重复是指对象之间equalsMap接口定义了 存储键值对的方法,两个两个的往里装,一个叫键(key),一个叫值(value),HashSet 类 里的方法public boolean add(E e)如果此 set 尚未包含指定元素,则返回 truepublic boolean contains(Object o)如果此 set 包含指定元素,则返回truepublic boolean remove(Object o)如果指定元素存在set中,则将其删除比较是否存在,执行过程是比较他们是否equals,他们对象如果equals,则他们的哈希码 应该相同,如果equals了,那么hashcode一定相等。容器内对象在调用remove contains等方法时,需要比较对象是否相等,这会涉及到对象类型的equals方法,和hashcode 方法(当这个对象在Map接口里作为键,相当于字典的索引的时候,会使用hashcode)所以重写equals方法,就需要重写hashcode方法比较过程:为了提高性能,用hash表实现的,满足hash算法,1. 如果一个元素放入集合中,要判断其是否有重复,或者是否存在,需要使用equals,但是每一次判断,都需要将该元素与集合所有元素进行判断,直到判断结果出现。2. 但hash算法,将集合分为若干区域,每一个对象都有一个哈希码,将哈希码分组,每组对应一个区域,知道了码,就可以快速找到该区域3. Hashcode将内存地址返回一个整数,当查找健时,先比较hashcode,一下就可以锁定该位置上是否有元素,如果有,再用equals比较,性能大大增加。Iterator 接口每一个实现了Collection接口的类都有一个方法Iterator方法,返回值时一个Iterator的引用,实际返回一个实现了Iterator的对象比如这里HashSet类实现了Cellcetion接口,他里面有一个方法Iterator的方法,返回的是一个Iterator的引用 ,也就是一个实现了Iterator的对象,元素装在什么地方并不知道,这里元素是装在Hash表里,进行迭代的迭代器,对元素进行便利,相当于对容器内的每个元素进行操作,就像数组里对数组里每一个元素进行操作一样里面有三个,有hasNext 返回值时Object有Next 返回下一个元素有remove 移除元素增强的for循环 for()可以非常方便的遍历数组和容器里的内容,但是除此之外,其他都很不好。Set接口Set 接口里的元素是没有顺序的,重复的东西也不能往里面添加这里retainAll 是求sn和s2里面元素的交集这里addAll 添加s2里面所有元素List接口 可以看到和数组非常像,里面的元素是有顺序的,而且每个元素有索引,可以找到,但是和数组不同的是,List你可以一直往里面填,他会自己增大容量,而数组的长度是确定的,无法改变get(int index) 返回列表中指定位置的元素。set(int index, E element) 用指定元素替换列表中指定位置的元素(可选操作)。返回值返回的是原先位置上旧的元素add(int index, E element) 在列表的指定位置插入指定元素(可选操作)。后面的元素依次往后移一个位置remove(int index) 移除列表中指定位置的元素(可选操作)。返回的也是该元素indexOf(Object o) 返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1。lastIndexOf (Object o)最后出现该元素的索引Collections 类 是一个类 ,提供了一些静态的方法,实现了基于List容器的一些常用算法查看API文档,了解里面的方法 shuff(List list) 对列表进行随机排序 reverse (List list) 对列表进行翻转排序binarySearch 使用二分法查找列表里的元素 Comparable 接口 可以比较的实现了这个接口的类,可以进行比较对象 ,所有可以排序的类都实现了java.lang.Comparable 这个接口Comparable 接口里面只有一个方法,comparableTo(Object obj)和另一个对象比较大小定义的新类 ,要重写这个方法如何选择数据结构 Map接口 实现了Map接口的类用来存储 键- 值对Map 接口的实现类 是HashMap 和 TreeMap;查看API文档,了解里面的方法 Auto - boxing 和unboxing自动打包和自动解包 ,在合适的时机自动将基础类型打包为基础类型包装类,反之解包泛型 在定义集合的时候,同时定义集合里面元素的类型,参考API1 个图 1个类-Collections3个知识点-a. For循环增强的知识点(不重要)b. Generic泛型c. Auto-boxing 和unboxing 自动打包和解包6个接口a. Collectionb. Set(无顺序的)c. List(有顺序的)d. Map(存储一对一对的元素,key,vauble)e. Iterator(标准的遍历collection容器里面的元素)f. Comparable(比较两个类的对象谁大谁小)7 IO流:用来读写数据的IO就是指java的流,什么是流,通俗的说,就是程序和文件中的数据中间的一个桥梁,管道。计算机只能识别数据,数据都是01010,那么要对这些数据进行操作,在java中就是通过“流”来进行的。(理解,文件就是一个桶,要去拿桶里的数据,装一个管道,打开开关就可以了)。“流”类,JDK提供了各种各样的流类,用来获取不同的数据,而程序中通过这些标准的数据来操作输入和输出数据Java,io包里的类,(i:input,o:out) 按数据数据流方向的不同,可以分为输入流和输出流按处理数据的单位不同,可以分为字节流和字符流按照功能不同,可以分为节点流和处理类主要抽象类输入输出类都是站在程序的角度上来说的字节流:一个字节是8位,最原始的流,0101,一个字节一个字节的读字符流:一个字符一个字符往外读 一个字符两个字节节点流:直接和数据源连接的流,可以从数据源读写数据处理流:连接在已经存在的流上,通过对数据的处理为程序提供更强大的读写能力Stream 结尾的是字节流 以Stream结尾的流都是字节的形式向程序输入和输出数据InputStream 的方法:public int read() throws IOException只要read一下,就读入一个字节,从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值public int read(byte b) throws IOException从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数。 假如每读一个字节就访问一次硬盘,那么对硬盘的伤害太大了,所以将读的字节都先装在一个缓冲区数组里,装满了再访问public int read(byte b,int off,int len) throws IOException读取len个字节,存在b数组中从off位置开始存public void close() throws IOException关闭此输入流并释放与该流关联的所有系统资源OutputStream : public abstract void write(int b)throws IOException将指定的字节写入此输出流。public int write(byte b) throws IOException将 b.length 个字节从指定的 byte 数组写入此输出流。public int write(byte b,int off,int len) throws IOException将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。public void close() throws IOException关闭此输出流并释放与该流关联的所有系统资源Reader流:Writer 流输出一个字符串时,其实调用了public char toCharArray()方法缓冲流读入缓冲流,如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,效率且伤硬盘,但是有缓冲后,是先将文件读入到缓冲/* * flush方法是刷新该缓冲区里存储的数据,正常情况下,缓冲区里的数据是在缓冲区装满了,才会写入磁盘,但是使用该方法 * 可以刷新,将数据提前写入 * 如果不刷新,提前写入,那么马上读入数据时,则会出错,因为数据都还没有写入进去,是读不出来的 * 但是使用close()方法时,会强制刷新 * 读入也是一样的,先将文件读入缓冲区,在一个一个的读 */这里使用的字节流写和读有个区别 ,这里是一个字节一个字节的读的,当读一个字符的时候,只读了他的一个字节,如果想要打印出来,如果该字符的范围是0-255范围内,那么读是没有错误的,转换为char是可以输出的,而写入,也是一个字节一个字节的写入,向输出流写入一个字节。要写入的字节是参数 b 的八个低位。b 的 24 个高位将被忽略。 是可以重新还原的,还原是因为读入一个字符的前一个字节,就传给写入,那么就写入这个字符的前一个字节,两者连起来依然是原来的字符,如果是读一个就打印出来则不行,字符不能拆分为两个字节分别打印注意被写入write(int i)方法,写入的时候是写入参数的低8位给搞混了,例如:我字,Unicode编码是25105,认为read我字的时候,就返回了25105,然后给write(25105),那么只读了他的低8位,这样是不能还原的啊?实际操作过程是25105=0110 0010 0001 0001 ,在read的时候,是只读入了他的第一个字节,也就是前半部分0110 0010,然后给write,这个时候,这个参数是没有超过范围的,不存在低8位的事情。所以第一次读到98,第二次读到17我字的GBK 52946 ced2 1100 1110 1101 0010 两次读到分别是 206 210我:ced2(GBK)6211(Unicode)爱:b0ae(GBK)7231(Unicode)你:c4e3(GBK)4f60(Unicode)559c 6b22转换流-TransformIO使用流的时候,一定要注意,读写完毕之后一定要关闭close();如果是缓冲区的话,一定要刷新 flush();/* * 转换流,相当于在一个File字节流外层又套了一个流,这个将原先的字节流转换为了字符流,这样就可以读入字符了因为Stream流都是一个字节读的,很慢,里面的方法也不好使,所以转换之后,效率更高,且有更好的方法 */为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如: BufferedReader in = new BufferedReader(new InputStreamReader(System.in);为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器Writer out
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!