java学习第一阶段
追光的人(陈聪)
这个作者很懒,什么都没留下…
展开
-
复习-arrary和arraylist的对比以及arraylist的遍历中删除的原理
1.空间大小array是不可变的,必须事先控制其大小。arraylist是可扩容数组,每次扩大容量的0.5倍。2.存放内容array只能存放相同类型的元素,但存放对象可以是基本类型或者对象类型arraylist可以存放不同类型的元素(object),但存放对象只能是对象类型,而且如果加上<>的话,就是指定类型了。3.使用方法arraylist在array的基础上增加了例如addall(),removeall(),iterator()等常用方法。注意:我们经常需要在遍历元素原创 2021-04-28 14:39:18 · 232 阅读 · 0 评论 -
复习-jvm内存分配(1)
1.首先,jvm内存大致有三块,分别是栈(stack),堆和方法区。2..class文件在运行期间被类加载器加载到jvm的时候,是被加载到了方法区里,此时是一个一个的代码片段。3.jvm访问方法区的代码片段,就是去进入到一个又一个的方法里面去(从上到下)。4.每进入到一个方法里,都会给该方法在stack里分配对应的空间,空间里面存放局部变量和要用到数据。5.stack是先进后出的,进栈也叫做压栈(push),出栈也叫做pop,栈帧永远指向最顶部的方法栈,并且最顶部的方法栈拥有优先活跃权。.原创 2021-04-27 23:13:03 · 86 阅读 · 0 评论 -
复习-java运行的整个流程
1.编写--首先咱们要编写自己的源代码,这个可以在任意文档编辑器内完成,以.java为文件名 -----无需jdk2.编译--这个时候就要用到javac这个.exe程序了,它存在于jdk的bin目录下,并且能把.java文件编译成以.class结尾的字节码文件,此时的.class文件不同于咱们自己在源码中定义的class,它已经与源文件无关了。另外:字节码文件不是二进制文件,它是一种jvm能读懂的东西,并且这个字节码文件,在所有种类的jvm上都能运行。(小结就是:能接受相同的输入,但是输出不一样) -.原创 2021-04-26 23:01:59 · 105 阅读 · 0 评论 -
关于常量池的一些整理
含义:常量池是介于栈和堆外的另一种独立的内存管理空间,相同内容常量池中永远只有一份,基本数据类型、对象的引用都存在栈中,执行速度快,包装类型,对象存储,new出来的对象都是存储在堆中,Byte,Short,Integer,Long,Character这5种整型的包装类只是在对应值小于等于127(其实是-128到127)时才可使用对象池。超过了就会自动申请空间创建对象,所有才会出现上述情况,而String是个较为特殊的包装类型,直接用=“”创建的数据是存放在常量池,且无论数据大小都不会申请空间创建,除非使用n原创 2021-04-08 21:10:14 · 137 阅读 · 0 评论 -
字节流自带缓存,而字节流不带
前几天被一个东西弄得有点懵圈,才发现,其实字节流底层也是字节,不过它是一个带有编码和解码的字节,所以它可能自带一些缓存,你如果不把流关闭,最新的数据就传不进去。举例:比如说我要用字符流输出流把字符串”aaa“存到某个文件中public class SeriaTest2 { public static void main(String[] args) { try(FileWriter fileWriter = new FileWriter("./resources/aa.tx原创 2021-04-06 23:00:22 · 201 阅读 · 0 评论 -
关于序列化的几个注意点
1.如果要序列化的对象是普通类,需要此类实现Serializablepublic class NumB implements Serializable { private static NumB instance=new NumB(); private NumB(){} public static NumB getInstance(){ return instance; }}但是如果是enum枚举类的话,则不需要public enum Num原创 2021-04-06 22:51:16 · 179 阅读 · 0 评论 -
泛型擦除注意点
代码如下: ArrayList<Dog> dogs = new ArrayList<>(); dogs.add(new Dog()); ArrayList list=dogs; System.out.println(list==dogs); //泛型擦出 list.add(new Cat()); System.out.println("dog size"+dogs.size());原创 2021-04-06 20:25:16 · 77 阅读 · 0 评论 -
hashmap浅析-扩容
补充部分:扩容涉及到扩容之后元素的整理问题,jdk8为了减少hashmpa冲突,使用了hash值和n进行&的操作,这么一来,同一个链表上的所有数据其实可以被划分为2类,一类是&操作之后为0的数据,保留在原位置,一类是&操作之后为1的数据,串起来放到新数组新位置上。步骤1:首先判断是否为初次扩容,如果是,退出。如果不是,进入循环,循环遍历次数为数组中元素的个数步骤2:(先把该节点赋值给e)判断数组中的当前节点是否为空,为空则进行下一轮循环步骤3:如果不为空,则赋值为空,等待原创 2021-04-05 17:56:50 · 147 阅读 · 0 评论 -
hashmap浅析-get方法
步骤1:首先对传入值keya进行hash运算,依然是高位和地位进行^运算,得到的hash值和n-1进行&运算,最终得到索引值步骤2:首先判断该数组是否为空,是否长度为0,当前索引位置的第一个元素是否为null,满足任意一个条件返回null,结束步骤3:将传入值keya的hash值与当前索引位第一个元素的hash值进行比较,一样则继续比较是否为相同引用,或者equals是否相等,若相等,返回其value,结束。步骤4:不相等的话,会出现两种可能性,如果当前索引位置后面还有元素,则可能在后面原创 2021-04-05 15:28:01 · 1688 阅读 · 2 评论 -
hashmap7源码浅析及与hashmap8的比较
一:首先分析jdk7的源码实现1.构造方法:①有参构造,会去寻找最近的2的次幂 ②无参构造,会直接生成一个长度为16的数组2.put方法:步骤1:调用hash算法(hashcode经过多次位运算)得到hash值并与n-1进行&,得到索引位置步骤2:如果索引位置上的元素为空,添加成功,如果索引位置上的值不为空,比较key1和当前位置上存在的一个或多个元素的hash值是否一致:①如果都不相同,进行头插法,直接插在数组中,也就是插在其他对象前面。...原创 2021-04-05 11:58:41 · 264 阅读 · 0 评论 -
synchronize原理以及和CAS的浅层比较
1.为什么需要synchronize我自己的理解(问题):当多个线程对同一个对象M进行操作的时候,如果是非原子性对象(比如a++这样的,要分好几个指令来走),A线程处理该对象M的时候,很可能会出现在执行完某个指令之后,因为被分配到cpu时间片段用完了,只能等待再次被分配时间片段,而这时,其他线程(线程B)对该对象进行了操作,导致对象M的值不一样了,之后由于A线程被分配到了时间片段,所以可以继续执行未处理完的指令,但是它很傻,不会在处理前看看对象M是否已经变了,而是继续按照之前拿到值进行操作。我自己的原创 2021-04-03 17:40:42 · 215 阅读 · 2 评论 -
使用反射创建实例/对象的两种方法
1.但该类有无参构造,并且不用进行初始化赋值的情况下:Class<?> aClass = Class.forName("com.javasm.practise.Student");Object o1 = aClass.newInstance();*感觉用的不是很多啊,一般情况下都要从外部传过来一个类的地址,咱或许看不到是否有无参构造,并且很多时候还要立马初始化的吧?2.没有无参构造,或者想直接用有参构造初始化一下//步骤1 取得.class文件Class<?>原创 2021-04-01 23:05:10 · 389 阅读 · 0 评论 -
线程创建的三种方式
1.new 一个类,但是这个类需要继承Thread,并且重写thread里面的run方法。public class CustomThread extends Thread { //run是线程真正执行的任务 @Override public void run() { for (int i = 0; i <10 ; i++) { System.out.println(i); } }}缺点:因为每个类都只原创 2021-04-01 19:27:03 · 292 阅读 · 0 评论 -
String.valueOf()方法的使用总结
以下内容转自链接:https://www.jianshu.com/p/6f6932717a27String 类别中已经提供了将基本数据型态转换成 String 的 static 方法 也就是 String.valueOf() 这个参数多载的方法 有下列几种 String.valueOf(boolean b) : 将 boolean 变量 b 转换成字符串 String.valueOf(char c) : 将 char 变量 c 转换成字符串 String.valueOf(char[] dat转载 2021-03-28 23:36:50 · 1077 阅读 · 0 评论 -
关于Stringbuffer的需要注意的几点
1.StringBuffer或者StringBuilder 创建的时候,如果是无参构造(),会直接在底层创建一个长度为16的char类型数组;如果是有参构造(string),会在参数的基础上加上16。推荐使用(int)构造,会直接生成一个确定容量的数组,避免多次扩容。2.利用length()方法得到的是count值,也就是数组中保存的元素的值。3.如果扩容的话,StringBuffer是在原有的基础上*2+2,全部都通过copyof拷贝到新数组中。以下是B站 上硅谷视频截图,我就不打字了。.原创 2021-03-28 23:12:35 · 416 阅读 · 0 评论 -
数组排序-冒泡排序和选择排序
面试有可能会被问到一:冒泡排序相邻两个数据进行比较需要注意的点:内部循环的话,只能比较到未确定的最后一个数据为止(arr.length-1-i)for(int i=0;i<arr.length-1;i++){ for(int j=0;j<arr.length-1-i;j++){ if(arr[j]>arr[j+1]){ temp=arr[j]; arr[j]=arr[j+1];原创 2021-03-13 20:10:12 · 116 阅读 · 0 评论 -
java面试题
1.重载与重写的区别重载:同一个类中,方法的名字相同,但是参数列表不同①参数个数不同②参数类型不同③参数类型顺序不同使用重载的好处:方便使用者使用,功能相同而名字特别多的话,过于难记。重写:待补充...原创 2021-03-13 19:47:31 · 78 阅读 · 0 评论 -
数组中常用几种的Arrays方法
1.判断两个数组元素是否一一对应Arrays.equalsint[] arr1={1,2,3};int[] arr2={1,2,3};Arrays.equals(arr1,arr2);2.对数组进行值得复制 Arrays.copyOfint[] arr3=Arrays.copyOf(arr1,arr1.length);//扩容两倍int[] arr4=Arrays.copyOf(arr1,arr1.length*2);//也可以进行缩减int[] arr5=Arrys.c原创 2021-03-12 22:04:25 · 153 阅读 · 0 评论 -
浅析引用类型和基本类型的内存比较
1.引用类型至少占两块内存,如下图所示是一个局部变量的二维数组内存图数组名:因为是局部变量,所以数组名在栈内存中一维数组:在一块连续的堆空间中一维数组的值:在另外的堆空间中...原创 2021-03-12 21:54:27 · 137 阅读 · 0 评论 -
遍历数组的两种for循环方式以及一种Arrays方式
1.普通for循环,利用下标for(int i =0;i<arr.length;i++)2.增强for循环,不用下标,依次输出for(int a:arr){System.out.println(a);}3.Arrays.toString(arr);代码如下:public class Practise01 { public static void main(String[] args) { int[] arr={1,2}; Sys原创 2021-03-12 21:47:47 · 604 阅读 · 0 评论 -
快速取得三位数的个位,十位,百位
百位:n/100十位:n/10%10个位:n%100%10原创 2021-03-12 21:26:23 · 3964 阅读 · 0 评论 -
MATH函数求幂值
Math.pow(4,3) 4的3次方原创 2021-03-12 21:23:27 · 1044 阅读 · 0 评论 -
关于random的多种用法
1.math.random()会产生一个0到1(坐开又闭)的随机小数。所以:(int)(math.random()*10)会得到一个随机的0到9的整数2.new 一个Random rand=new Random();int num=rand.nextInt(10);原创 2021-03-12 21:20:14 · 790 阅读 · 0 评论 -
关于equals和==的几个注意点
1.引用类型作比较的时候需要用到equals ,比较的是其在堆里的值,而==比较的是地址值2.equals不能用来比较两个基本类型原创 2021-03-12 21:11:28 · 163 阅读 · 0 评论 -
switch表达式的注意点
表达式的类型只能是:byte,short,int,char,String,enum原创 2021-03-12 21:08:46 · 121 阅读 · 0 评论 -
++x 和 x++的区别
int x =100;x =x++;x的值仍旧是100x=++x;x的值变为101是因为变量存在缓存机制在计算x = x++时经过以下几个步骤:x=temp;x++;x=temp;原创 2021-03-10 20:26:36 · 380 阅读 · 0 评论 -
关于局部变量的几个难点
1.名称唯一且不能重复,而且必须要小写驼峰2.不管数据是什么类型,变量的名称都是保存在栈内存3.基本变量的值保存在栈内存中,引用变量的值存储在常量池中,如果new一个的话,会跑到常量池以外的堆内存中4.局部变量必须赋值...原创 2021-03-10 20:23:21 · 106 阅读 · 0 评论 -
浅析bin,lib,src的区别
bin:包含多种可执行的exe工具lib:包含多种Jar文件,类库文件src:储存源码文件原创 2021-03-10 20:11:55 · 2368 阅读 · 0 评论 -
编码GBK的不可映射字符
解决方法:文件另存为时选择ANSI格式保存原创 2021-03-10 20:08:48 · 68 阅读 · 0 评论 -
浅析JDK,JRE,JVM的区别
刚开始学习,说的不清楚的地方还请见谅。本文主要当作自己做笔记用。JDK:Java Devlopment Kit 即Java开发工具包。是用来编译,调试java程序的开发工具包,包括java工具(例如javac,java,jdb等)和java基础的类库(java API)JRE:Java Runtime Environment 即java运行环境,也可以称为java平台。所有的程序都要在JRE下才能运行。包括JVM和Java的核心类库和支持文件。JVM:Java Virtual Machine原创 2021-03-10 20:03:13 · 416 阅读 · 0 评论