java基础
张一柯
这个作者很懒,什么都没留下…
展开
-
java中内存泄漏的问题
1.什么是java中的内存泄露内存泄漏定义:无用对象持续占有内存或无用对象的内存得不到释放,从而造成内存空间的浪费。满足的条件:1.对象与GCROOT的节点相连,不是垃圾对象;2.对象是无用的这些对象不会被GC所回收,然而它却占用内存内存泄漏的根本原因:长生命周期的对象持有短生命周期对象的引用就很可能发生内存泄漏,尽管短生命周期对象已经不再需要,但是因为长生命周期持有它的引用而导...原创 2020-03-26 19:40:00 · 194 阅读 · 0 评论 -
java如何判断一个对象是否存活
1. 引用计数法引用计数器法:每个对象设置一个引用计数器,当对象被引用,计算器加1,当引用失效,计算器减一。当计数器为0时,表示引用失效,也就是"死对象",可以被垃圾回收机制回收。缺陷:无法解决循环依赖的问题。有两个对象A、B。当A引用B,B引用A时,那么此时A、B对象都不为0,垃圾回收机制无法被回收。2. 可达性算法(引用链法)从GCRoot开始向下搜索,如果一个对象没有与任何引...原创 2020-03-26 19:19:08 · 1357 阅读 · 0 评论 -
类加载机制
1.原理 JVM将class文件字节码文件加载到内存中, 并将这些静态数据转换成方法区中的运行时数据结构, 在堆(并不一定在堆中,HotSpot在方法区中)中生成一个代表这个类的java.lang.Class 对象, 作为方法区类数据的访问入口。2.过程 VM类加载机制分为五个部分:加载,验证,准备,解析,初始化.初始化条件:1、使用new关键字实例化对象、访问或者设置一个类的静...原创 2020-01-13 16:17:22 · 139 阅读 · 0 评论 -
快速排序算法(java版)
一、快速排序算法是对冒泡算法的改进,算法的思想是: 1.每一趟排序选定一个基元素,这一趟排序完成后,比基元素小的元素在基元素的左边,比基元素大的元素在基元素的右边。 2.对基元素左边和右边的元素进行如1的排序 …..循环1、2 直到左边的元素大于右边元素,排序完成。二、快速排序的时间复杂度:O(nlogn)三、快速排序的空间复杂度: 快排使用的原创 2017-04-05 08:48:25 · 254 阅读 · 0 评论 -
实现线程内共享数据(二)
本文主要介绍利用java提供的ThreadLocal类去实现线程之间的数据共享。 ThreadLocal内部是一个Map来存放当前线程对象Thread和数据,一个ThreadLocal对象只能存放一个数据,要想存放多个数据,可以创建多个ThreadLocal对象或者将数据打包成一个pojo对象,将pojo对象存放在1ThreadLocal中。本文存放pojo对象,用单例的形式实现pojo对象类。原创 2017-03-27 16:18:49 · 294 阅读 · 0 评论 -
实现线程内共享数据(一)
本文主要实现线程范围内共享数据,即当前线程运行的时候,得到该线程对应的数据,保证该线程每次运行的时候数据是共享的。 思路: 将当前线程对象和数据保存保存在map集合中,当该线程运行的时候,从根据当前线程对象,从map集合中获取到对应的数据,进行操作。原创 2017-03-25 17:07:10 · 513 阅读 · 0 评论 -
多个线程之间共享数据
多个线程之间共享数据,首先想到的是将共享数据设置为全局变量,并且用static修饰,但是static修饰的变量是类变量,生命周期太长了,占用内存,本文将介绍三种方法实现多个线程之间共享数据。方法一:多个线程对共享数据的操作是相同的,那么创建 一个Runnable的子类对象,将这个对象作为参数传递给Thread的构造方法,此时因为多个线程操作的是同一个Runnable的子类对象,所以他们操作的是同一原创 2017-04-06 08:41:44 · 2004 阅读 · 1 评论 -
ConcurrentHashMap源码分析(一)
因为jdk版本的不同,jdk1.8版本中的ConcurrentHashMap与jdk1.6、jdk1.7版本的实现大有不同,所以本篇文章主要对比HashTable和HashMap对jdk1.6、1.7版本的ConcurrentHashMap做一个详细的总结,以后会写文章对ConcurrentHashMap做一个详细的总结。一、设计思路 HashMap:线程不安全的,内部用数组+链表的数据结构存储数原创 2017-04-25 21:35:34 · 324 阅读 · 0 评论 -
将文件内容读取到set集合中的实例
private Set<String> readSensitiveWordFile() throws Exception{ //存放文件内容的set集合 Set<String> set = null; //获取文件的路径 String path = Thread.currentThread().getContextClassLoader原创 2017-06-13 11:19:27 · 2149 阅读 · 0 评论 -
String中intern方法的作用
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...原创 2019-08-30 15:04:16 · 267 阅读 · 0 评论 -
java类加载及new对象的过程
package com.zhangyike.staticExcise; /* SubClass sub = new SubClass(); 这句话到底做了什么事情呢? 1.javac编译.java源文件形成.class字节码文件; 2.new SubClass()对象时,先检查有没有父类,有父类,类加载器(ClassLoader)先将父类的Class文件读入内存,创建一个java.lang原创 2017-03-17 08:41:58 · 7808 阅读 · 3 评论 -
static关键字总结
static关键字:1.是一个修饰符,用于修饰成员变量和成员函数;2.不在堆空间中,不是每个对象单独有的,是所有对象公用一份,节省内存空间。3.当成员被静态修饰后,多了一种调用方式,除了被对象调用外,还可以直接用类名调用,格式:类名.静态变量名。4.特点: 1.随着类的加载而加载;只要有类,就有这个静态存储变量;也就是说随着类的消失而消失 2.优先于对象存在; 3原创 2017-03-16 09:00:20 · 252 阅读 · 0 评论 -
StringBuffer和StringBuilder源码解析(三)-- indexOf()方法
1. indexOf(…)找到元素出现的位置。int indexOf(Stringstr)int indexOf(Stringstr, int fromIndex)static intindexOf(char[] source, int sourceOffset, int sourceCount, char[] target, i原创 2017-03-15 18:17:37 · 2026 阅读 · 0 评论 -
一不小心就有的异常—NullPointerException
java中的空指针异常原创 2017-03-10 19:40:12 · 231 阅读 · 0 评论 -
抽象类、接口的具体例子
Java中抽象类的举例: StringBuffer和StringBuilder共同继承了一个父类AbstractStringBuilder。因为StringBuffer是线程安全的,StringBuilder是线程不安全的,这两个类中的数据、操作数据的行为都是一样的。StringBuffer为了保证他的线程安全,在他的每个方法上加了synchronized,即两个类的同名方法内要做原创 2017-03-20 20:47:46 · 736 阅读 · 0 评论 -
串匹配算法(一)
本文主要介绍普通的串匹配算法,这种算法的特点是好想,但是消耗时间,不够高效,在牛客上做题时遇到这种题,一般情况下是通不过的。该算法为后面的KMP算法做一个铺垫。 思路: 从源字符串的第一个字符开始与子字符串的第一个字符开始比较,字符相同,继续比较下一个字符,遇到不相同的,源字符串回溯到第二个字符,子字符串回溯到第一个字符,再次比较….直到循环停止。我的代码:package com.zha原创 2017-03-28 16:41:14 · 334 阅读 · 0 评论 -
Java中的多态(一)
多态:事物存在的多种体现形态; 1.多态的基本体现: 父类的引用指向了自己的子类对象eg: Animal c = new cat();父类的引用也可以接受自己的子类对象。 2.多态的前提:必须是类与类之间有继承或实现关系,通常存在覆盖,但体现多态性的覆盖代码必须和父类中的代码功能一致3.多态的好处:多态的出现提高了程序的扩展性;找到对象的共同所属类型,通过操作原创 2017-03-21 22:46:47 · 250 阅读 · 0 评论 -
串匹配算法(二)——手把手教你KMP算法(1)
KMP算法是一种比较高效的串匹配算法,高效体现在:源串下标不回溯,子串合理的移动。 KMP算法属于思路比较复杂的算法,我自己学习这个算法可以说是第三次了,前两次是似懂非懂的,但是最近在刷牛客题的时候,发现这个算法还是挺高效的,按照常规思路我的程序在时间复杂度根本通不过,所以下狠心再次去学习这个算法,终于整理出来了。现在觉得要想学懂这个算法必须要耐下心来一遍遍的变量跟踪。 本文主要整理出我自己学习原创 2017-03-29 17:19:15 · 308 阅读 · 0 评论 -
串匹配算法(二)——手把手教你KMP算法(2)
提示:请结合上一篇文章一起阅读。子串的移动: 现在我们用一个int类型的数组来记录当前字符前面最多有多少个子字符与字符串一开始是相同的。 前两个字符的next数组对应的值都是0,第一个是0,是因为他前面没有字符,第二个字符前面就一个字符与字符串一开始的字符是同一个字符,如果算上的话,那么从相同的字符的下一个字符开始比较,还是失配点与第二个字符开始比较,没有意义,所以前两个字符对应的值都是0.原创 2017-03-29 17:55:23 · 369 阅读 · 0 评论 -
StringBuffer和StringBuilder源码解析(一)--构造方法
public final classStringBuffer(StringBuilder)extends AbstractStringBuilderimplementsjava.io.Serializable, CharSequence1. 这个类final类型的,不能被继承,不能被修改;2. 继承了AbstractStringBuilder抽象类,这个抽象类中提供了很多方法,查看源码可以看到StringBuffer中的方法基本上都调用了这个类中的方法。为什么要写这个抽象类作为父类呢?我认为这个抽象原创 2017-03-13 17:40:29 · 1697 阅读 · 1 评论 -
StringBuffer和StringBuilder源码解析(二)--append(..)和insert(...)方法
1.append()字符串拼接方法。StringBufferappend(Object obj)StringBufferappend(String str)StringBuffer append(StringBuffersb)StringBufferappend(CharSequence s)StringBufferappend(CharSequence s, int star原创 2017-03-14 08:47:32 · 1068 阅读 · 0 评论 -
多态(二)--例子
有一个动物类,1.0版本只有吃、睡得方法。 而1.1时代动物类就有了很多子类,这些子类都有他们各自吃睡得方法,但是行为跟父类是一样的,属于方法的重载。因为动物太多了,我可以每次都去创建对象,但是每次调用对象的方法都是相同的过程,所以1.2时代,我可以把这个过程抽取出来,放在另外一个工具类中,把我每次调用方法的过程都封装到工具类中。 在这个工具类中,这些方法处理参数不同,其他的都相同。我又发现这些原创 2017-03-24 21:32:35 · 231 阅读 · 0 评论 -
抽象类接口总结
对于抽象类、接口、多态这三个看似很基础知识,我每次面试都会遇到,每次都让我举例,说明什么情况下用抽象类、接口,多态,每次答得的不尽人意,最近把这些总结了下,今天先总结下抽象类和接口的基础知识点,明天给出他们的例子。抽象类和接口基础知识点总结:抽象类——abstract: 1.抽象类的解释: 当多个类中出现相同功能的函数,但功能主体不同,这时可以向上抽取,只抽原创 2017-03-19 20:20:19 · 409 阅读 · 0 评论