| 1 |
| 00:00:05,000 --> 00:00:06,000 |
| Hello, Jim. |
|
|
| 2 |
| 00:00:06,000 --> 00:00:10,000 |
| In this lesson, we are going to learn how to work with swing builder and string buffer classes. |
|
|
| 3 |
| 00:00:11,000 --> 00:00:14,000 |
| Also, I'm going to explain why we might need them. |
|
|
| 4 |
| 00:00:14,000 --> 00:00:21,000 |
| We're going to start from understanding what these classes are and why do we need them and want to understand |
|
|
| 5 |
| 00:00:21,000 --> 00:00:23,000 |
| the problems that these classes are supposed to solve. |
|
|
| 6 |
| 00:00:24,000 --> 00:00:29,000 |
| We're going to have practical example where I will explain in detail why you should never forget about |
|
|
| 7 |
| 00:00:29,000 --> 00:00:33,000 |
| string builder and string the buffer in this lesson. |
|
|
| 8 |
| 00:00:33,000 --> 00:00:38,000 |
| I'm going to explain the difference between these two classes and what is even more important. |
|
|
| 9 |
| 00:00:38,000 --> 00:00:42,000 |
| I will teach you when to use these classes and how to use them. |
|
|
| 10 |
| 00:00:42,000 --> 00:00:50,000 |
| I will show you example of string builder and string the bar for usage and also will char sequence interface. |
|
|
| 11 |
| 00:00:50,000 --> 00:00:57,000 |
| Let's start let's try to understand first what a string builder class in the documentation. |
|
|
| 12 |
| 00:00:57,000 --> 00:01:02,000 |
| This class is described as mutable sequence of characters by this moment. |
|
|
| 13 |
| 00:01:02,000 --> 00:01:07,000 |
| Now, of course, you already know that objects of string class are immutable. |
|
|
| 14 |
| 00:01:07,000 --> 00:01:13,000 |
| In short, there's a class designed in the way that you can't change the state of a regional object |
|
|
| 15 |
| 00:01:13,000 --> 00:01:15,000 |
| after it was instantiated. |
|
|
| 16 |
| 00:01:16,000 --> 00:01:21,000 |
| All assets don't modify state of the original string or objects that we created. |
|
|
| 17 |
| 00:01:22,000 --> 00:01:28,000 |
| The class itself is final and you can't override it to change the logic of methods. |
|
|
| 18 |
| 00:01:28,000 --> 00:01:35,000 |
| That means that each time you modify string in your program, you actually create a new object of the |
|
|
| 19 |
| 00:01:35,000 --> 00:01:35,000 |
| string. |
|
|
| 20 |
| 00:01:36,000 --> 00:01:42,000 |
| Yes, you might lose the reference to the string object in case new string object is assigned to the |
|
|
| 21 |
| 00:01:42,000 --> 00:01:43,000 |
| regional variable. |
|
|
| 22 |
| 00:01:43,000 --> 00:01:49,000 |
| And yes, in the case there is no strong references to the object, garbage collector will clean it |
|
|
| 23 |
| 00:01:49,000 --> 00:01:49,000 |
| up. |
|
|
| 24 |
| 00:01:50,000 --> 00:01:53,000 |
| I'm going to show this case in the example later today. |
|
|
| 25 |
| 00:01:53,000 --> 00:01:57,000 |
| But the only question that I want to ask you sounds like this. |
|
|
| 26 |
| 00:01:58,000 --> 00:02:02,000 |
| Do we need to rely on garbage collector and make it work? |
|
|
| 27 |
| 00:02:02,000 --> 00:02:07,000 |
| The answer is no one garbage collector starts its work. |
|
|
| 28 |
| 00:02:07,000 --> 00:02:12,000 |
| It is also some computation time that potentially might be used by US operations. |
|
|
| 29 |
| 00:02:12,000 --> 00:02:16,000 |
| Instead of cleaning up objects without strong references. |
|
|
| 30 |
| 00:02:16,000 --> 00:02:22,000 |
| And by the way, it is important for you to know and remember the difference between different types |
|
|
| 31 |
| 00:02:22,000 --> 00:02:23,000 |
| of references. |
|
|
| 32 |
| 00:02:23,000 --> 00:02:29,000 |
| In case you want to learn more about this topic, make sure you watched my lesson about references where |
|
|
| 33 |
| 00:02:29,000 --> 00:02:36,000 |
| I explained different types of references, but still how to solve a problem of constant creation of |
|
|
| 34 |
| 00:02:36,000 --> 00:02:37,000 |
| string object. |
|
|
| 35 |
| 00:02:37,000 --> 00:02:44,000 |
| If I'm modifying string so the situation might be completely different is a process a lot of strings |
|
|
| 36 |
| 00:02:44,000 --> 00:02:50,000 |
| and you need all of them in one string or you prepare string before writing it to the file. |
|
|
| 37 |
| 00:02:51,000 --> 00:02:52,000 |
| It doesn't matter. |
|
|
| 38 |
| 00:02:52,000 --> 00:02:59,000 |
| But in some hypothetical case, instead of creation, millions of string objects and heap memory, it |
|
|
| 39 |
| 00:02:59,000 --> 00:03:04,000 |
| is recommended to create one object of string, build it up and use it. |
|
|
| 40 |
| 00:03:04,000 --> 00:03:09,000 |
| Does it make sense to understand the motivation of using an object of this type? |
|
|
| 41 |
| 00:03:10,000 --> 00:03:10,000 |
| Great. |
|
|
| 42 |
| 00:03:11,000 --> 00:03:14,000 |
| Let's now understand what a string buffer class is. |
|
|
| 43 |
| 00:03:14,000 --> 00:03:21,000 |
| It would be easy to explain what is this class about because it is almost the same as string builder |
|
|
| 44 |
| 00:03:21,000 --> 00:03:21,000 |
| class. |
|
|
| 45 |
| 00:03:22,000 --> 00:03:24,000 |
| They have similar methods, similar constructors. |
|
|
| 46 |
| 00:03:25,000 --> 00:03:27,000 |
| Literally almost everything is similar. |
|
|
| 47 |
| 00:03:27,000 --> 00:03:35,000 |
| The only difference is that string, the buffer is a safe class and objects of this type might be used |
|
|
| 48 |
| 00:03:35,000 --> 00:03:39,000 |
| in an execution without impact on data consistency. |
|
|
| 49 |
| 00:03:39,000 --> 00:03:43,000 |
| What a lot of training is discussed in the separate section of the course. |
|
|
| 50 |
| 00:03:44,000 --> 00:03:51,000 |
| But still, I would like to remind to all students about multithreaded one more time in in case of Perou |
|
|
| 51 |
| 00:03:51,000 --> 00:03:53,000 |
| execution of multiple threads. |
|
|
| 52 |
| 00:03:54,000 --> 00:04:00,000 |
| When different threads update the state of the string buffer simultaneously or read its data, only |
|
|
| 53 |
| 00:04:00,000 --> 00:04:07,000 |
| one thread is allowed to execute these operations with potential mistakes that may happen because of |
|
|
| 54 |
| 00:04:08,000 --> 00:04:09,000 |
| an axis. |
|
|
| 55 |
| 00:04:09,000 --> 00:04:15,000 |
| That's why everything what I'm going to share with you about String Builder is absolutely applicable |
|
|
| 56 |
| 00:04:15,000 --> 00:04:17,000 |
| to the string buffer in Montessori environment. |
|
|
| 57 |
| 00:04:18,000 --> 00:04:24,000 |
| The rule of thumb is to use three builder whenever is possible because it has better performance. |
|
|
| 58 |
| 00:04:25,000 --> 00:04:31,000 |
| This is just consequences of not having synchronization from multiple threads inside string builder, |
|
|
| 59 |
| 00:04:31,000 --> 00:04:38,000 |
| whereas all mascot's in string buffer are synchronized and this takes additional overhead during the |
|
|
| 60 |
| 00:04:38,000 --> 00:04:39,000 |
| execution. |
|
|
| 61 |
| 00:04:39,000 --> 00:04:41,000 |
| You should be all right with String Builder. |
|
|
| 62 |
| 00:04:41,000 --> 00:04:47,000 |
| In most cases, I believe that you already understood on the high level why we need these classes. |
|
|
| 63 |
| 00:04:47,000 --> 00:04:53,000 |
| It is time to dive deeper in details and understand how to work with objects of this type. |
|
|
| 64 |
| 00:04:54,000 --> 00:04:57,000 |
| And let's start from explaining the hypothetical problem. |
|
|
| 65 |
| 00:04:58,000 --> 00:04:59,000 |
| I have file with stacks. |
|
|
| 66 |
| 00:05:00,000 --> 00:05:03,000 |
| This is lyrics of the song that I listened while. |
|
|
| 67 |
| 00:05:03,000 --> 00:05:09,000 |
| Thinking about the structure of the lesson, the song is called Never Coming Home By Staying Pretty |
|
|
| 68 |
| 00:05:10,000 --> 00:05:11,000 |
| Cool one, by the way. |
|
|
| 69 |
| 00:05:11,000 --> 00:05:18,000 |
| And according to business logic, I need to be able to read text from files and after that work with |
|
|
| 70 |
| 00:05:18,000 --> 00:05:20,000 |
| the content of the file as a whole. |
|
|
| 71 |
| 00:05:20,000 --> 00:05:24,000 |
| For example, text analysis or text statistics is needed. |
|
|
| 72 |
| 00:05:25,000 --> 00:05:29,000 |
| Probably you want to implement programs that would analyze thousands of songs in order. |
|
|
| 73 |
| 00:05:29,000 --> 00:05:36,000 |
| You could find the best rhymes any way you can be in any of other situations that would make it to collect |
|
|
| 74 |
| 00:05:36,000 --> 00:05:39,000 |
| all streams in one string object. |
|
|
| 75 |
| 00:05:39,000 --> 00:05:47,000 |
| I open my example now that is called string build a demo I have mastered that reads all lines from file |
|
|
| 76 |
| 00:05:47,000 --> 00:05:52,000 |
| into one string object and after that I bring the strings to console. |
|
|
| 77 |
| 00:05:52,000 --> 00:05:54,000 |
| Let's review this method. |
|
|
| 78 |
| 00:05:54,000 --> 00:06:00,000 |
| I create the reference of the same time as it is pointing out to the object that is stored in St. Paul. |
|
|
| 79 |
| 00:06:01,000 --> 00:06:07,000 |
| If you don't remember what a string will please refer to as a lesson about string objects and string |
|
|
| 80 |
| 00:06:07,000 --> 00:06:09,000 |
| CPU in my Java course. |
|
|
| 81 |
| 00:06:09,000 --> 00:06:14,000 |
| In the next line I read all lines from file into the list of strings. |
|
|
| 82 |
| 00:06:14,000 --> 00:06:20,000 |
| In case you're interested how I did this, please refer to the section about input output streams in |
|
|
| 83 |
| 00:06:20,000 --> 00:06:21,000 |
| my Java course. |
|
|
| 84 |
| 00:06:21,000 --> 00:06:29,000 |
| After that I iterate and over each line and I concatenate each line with my result string and adding |
|
|
| 85 |
| 00:06:29,000 --> 00:06:31,000 |
| new one character at the end of each line. |
|
|
| 86 |
| 00:06:32,000 --> 00:06:34,000 |
| What is actually happening here? |
|
|
| 87 |
| 00:06:34,000 --> 00:06:41,000 |
| I create a new string object after each concatenation and this string reference pointing out to the |
|
|
| 88 |
| 00:06:41,000 --> 00:06:42,000 |
| new object in memory. |
|
|
| 89 |
| 00:06:42,000 --> 00:06:48,000 |
| Each time after concatenation you are going to have the object that contains the first line. |
|
|
| 90 |
| 00:06:48,000 --> 00:06:52,000 |
| Only the second object would be the first line. |
|
|
| 91 |
| 00:06:52,000 --> 00:06:59,000 |
| And Newline character is a shared object, would be the first line newline character and the second |
|
|
| 92 |
| 00:06:59,000 --> 00:07:00,000 |
| line and so on. |
|
|
| 93 |
| 00:07:01,000 --> 00:07:05,000 |
| Why do you need so many duplication and so many string objects? |
|
|
| 94 |
| 00:07:05,000 --> 00:07:09,000 |
| And that is not a big harm in process in one song. |
|
|
| 95 |
| 00:07:09,000 --> 00:07:15,000 |
| But believe me, you are going to work with files much bigger than we have in our example today. |
|
|
| 96 |
| 00:07:15,000 --> 00:07:17,000 |
| And this is going to become a problem. |
|
|
| 97 |
| 00:07:18,000 --> 00:07:19,000 |
| What would be the solution here? |
|
|
| 98 |
| 00:07:19,000 --> 00:07:22,000 |
| The solution here is to use string build object. |
|
|
| 99 |
| 00:07:23,000 --> 00:07:29,000 |
| Let's look at another method that also read all lines from the file, but do it with help of string |
|
|
| 100 |
| 00:07:29,000 --> 00:07:30,000 |
| builder object. |
|
|
| 101 |
| 00:07:30,000 --> 00:07:34,000 |
| I create object of string, build a type with the default constructor. |
|
|
| 102 |
| 00:07:35,000 --> 00:07:37,000 |
| After that I am doing the same thing. |
|
|
| 103 |
| 00:07:37,000 --> 00:07:39,000 |
| I'm bringing the lines into the list. |
|
|
| 104 |
| 00:07:39,000 --> 00:07:41,000 |
| Object in foreach loop. |
|
|
| 105 |
| 00:07:41,000 --> 00:07:45,000 |
| I call append massata patterns new line and newline character. |
|
|
| 106 |
| 00:07:46,000 --> 00:07:51,000 |
| I need to return a string object from the method so I call to string methods. |
|
|
| 107 |
| 00:07:51,000 --> 00:07:54,000 |
| It creates string object based on my string builder. |
|
|
| 108 |
| 00:07:55,000 --> 00:07:55,000 |
| That's it. |
|
|
| 109 |
| 00:07:56,000 --> 00:08:02,000 |
| To prove you that concatenation of strings with string builder is more efficient, I evaluate the time |
|
|
| 110 |
| 00:08:02,000 --> 00:08:04,000 |
| for both of these separations. |
|
|
| 111 |
| 00:08:04,000 --> 00:08:11,000 |
| I just take amount of milliseconds before the first method invocation and after that I calculate Delta |
|
|
| 112 |
| 00:08:11,000 --> 00:08:19,000 |
| in milliseconds by the doctors the time that I already have from current time after method execution. |
|
|
| 113 |
| 00:08:19,000 --> 00:08:24,000 |
| Following this approach, I can estimate how long does it take to execute code? |
|
|
| 114 |
| 00:08:24,000 --> 00:08:26,000 |
| That is between two points. |
|
|
| 115 |
| 00:08:26,000 --> 00:08:30,000 |
| And I did similar measurement in the second example for String Builder. |
|
|
| 116 |
| 00:08:31,000 --> 00:08:37,000 |
| After that I bring two values to console in order we could have a chance to compare these two values. |
|
|
| 117 |
| 00:08:37,000 --> 00:08:45,000 |
| Let's run the program so you can see the difference in performance with one song of string is approximately |
|
|
| 118 |
| 00:08:45,000 --> 00:08:47,000 |
| ten times more restrained. |
|
|
| 119 |
| 00:08:47,000 --> 00:08:49,000 |
| Object concatenation. |
|
|
| 120 |
| 00:08:49,000 --> 00:08:52,000 |
| Imagine what the difference would be was a gigabyte files. |
|
|
| 121 |
| 00:08:53,000 --> 00:08:54,000 |
| It is crazy. |
|
|
| 122 |
| 00:08:54,000 --> 00:08:59,000 |
| That's why it is important to use string builder during the processing of big number of strings. |
|
|
| 123 |
| 00:09:00,000 --> 00:09:06,000 |
| Basically, we have just removed probably the most popular example of string builder and string bar |
|
|
| 124 |
| 00:09:06,000 --> 00:09:07,000 |
| for usage. |
|
|
| 125 |
| 00:09:07,000 --> 00:09:12,000 |
| But let me also share with you a little bit more details about class structure and other methods. |
|
|
| 126 |
| 00:09:13,000 --> 00:09:15,000 |
| I open the source code of string builder class. |
|
|
| 127 |
| 00:09:16,000 --> 00:09:21,000 |
| And just to remind you, what we are going to review now is absolutely similar in string. |
|
|
| 128 |
| 00:09:21,000 --> 00:09:23,000 |
| The buffer clause was only one exception. |
|
|
| 129 |
| 00:09:23,000 --> 00:09:25,000 |
| Synchronized methods. |
|
|
| 130 |
| 00:09:25,000 --> 00:09:28,000 |
| This is the full constructor calls, constructor of super class. |
|
|
| 131 |
| 00:09:29,000 --> 00:09:35,000 |
| That is abstract string the builder specifying the original capacity of the characters array. |
|
|
| 132 |
| 00:09:35,000 --> 00:09:37,000 |
| By default it is 610. |
|
|
| 133 |
| 00:09:38,000 --> 00:09:41,000 |
| Do not find any Secrett logic behind this number. |
|
|
| 134 |
| 00:09:41,000 --> 00:09:42,000 |
| It is just 16. |
|
|
| 135 |
| 00:09:43,000 --> 00:09:48,000 |
| There is also a string builder within parameter to specify any custom default capacity. |
|
|
| 136 |
| 00:09:49,000 --> 00:09:51,000 |
| One you should use this version of constructor. |
|
|
| 137 |
| 00:09:52,000 --> 00:09:55,000 |
| I believe that you already know how arrays work in Java. |
|
|
| 138 |
| 00:09:55,000 --> 00:09:59,000 |
| You can text extend array that was created already. |
|
|
| 139 |
| 00:10:00,000 --> 00:10:02,000 |
| So to extent existing array you need. |
|
|
| 140 |
| 00:10:03,000 --> 00:10:09,000 |
| To create a bigger array and copy old values in that this is time consuming operation. |
|
|
| 141 |
| 00:10:10,000 --> 00:10:16,000 |
| That's why in case you know that you're going to process a big amount of data, you can set initial |
|
|
| 142 |
| 00:10:16,000 --> 00:10:23,000 |
| capacity in order to avoid concentration of new array objects, to have enough space for all characters. |
|
|
| 143 |
| 00:10:23,000 --> 00:10:30,000 |
| Also, we can create string builder and initialize it with the content of the string object or any char |
|
|
| 144 |
| 00:10:30,000 --> 00:10:30,000 |
| sequence. |
|
|
| 145 |
| 00:10:31,000 --> 00:10:37,000 |
| Short sequence is an interface that is implemented by many different classes in Java, for example, |
|
|
| 146 |
| 00:10:37,000 --> 00:10:42,000 |
| string swing builder, string buffer, abstract string builder and others. |
|
|
| 147 |
| 00:10:42,000 --> 00:10:45,000 |
| All of them implements char sequence interface. |
|
|
| 148 |
| 00:10:46,000 --> 00:10:53,000 |
| This interface declares contract for such mascot's as Lancs to return total number of characters in |
|
|
| 149 |
| 00:10:53,000 --> 00:11:01,000 |
| char sequence char at Richmondshire as a specified index is empty default masset the checks with the |
|
|
| 150 |
| 00:11:01,000 --> 00:11:03,000 |
| Lancs equal to zero returns. |
|
|
| 151 |
| 00:11:03,000 --> 00:11:10,000 |
| True, if character sequence is empty and false, otherwise Subsequence Masset will return char sequence |
|
|
| 152 |
| 00:11:10,000 --> 00:11:14,000 |
| from indexing collusively to indexed exclusively. |
|
|
| 153 |
| 00:11:14,000 --> 00:11:16,000 |
| And you know what the string method does. |
|
|
| 154 |
| 00:11:17,000 --> 00:11:22,000 |
| Also, we are a few more default methods and one Zem Chass returns in stream. |
|
|
| 155 |
| 00:11:23,000 --> 00:11:31,000 |
| Just to remind you that Char easily may be converted to end Y because integer variable specifies sequence |
|
|
| 156 |
| 00:11:31,000 --> 00:11:40,000 |
| number of the character and the Unicode table code points returns in stream where each end will represent |
|
|
| 157 |
| 00:11:40,000 --> 00:11:42,000 |
| characters sequence number in the Unicode table. |
|
|
| 158 |
| 00:11:43,000 --> 00:11:49,000 |
| I will be honest with you, I have never used this method, but at least it is good just to know that |
|
|
| 159 |
| 00:11:49,000 --> 00:11:56,000 |
| such as it exists in learning purposes and static methods that may be used to combat two character sequences. |
|
|
| 160 |
| 00:11:57,000 --> 00:12:02,000 |
| Let's get back to the implementation of a sequence that we are running today. |
|
|
| 161 |
| 00:12:02,000 --> 00:12:04,000 |
| I open string builder class. |
|
|
| 162 |
| 00:12:04,000 --> 00:12:10,000 |
| As you can see in outline here, there are a lot of versions of append method. |
|
|
| 163 |
| 00:12:11,000 --> 00:12:16,000 |
| This method is overloaded to be able to accept parameter of different types. |
|
|
| 164 |
| 00:12:16,000 --> 00:12:23,000 |
| Also, we can delete from char to char, from string builder onto the teacher at the specified index. |
|
|
| 165 |
| 00:12:23,000 --> 00:12:28,000 |
| And again, it is hard for me to come up with an example where you would use this massas on a daily |
|
|
| 166 |
| 00:12:28,000 --> 00:12:35,000 |
| basis, replace Masset from index to index and be replaced with the string. |
|
|
| 167 |
| 00:12:36,000 --> 00:12:39,000 |
| Another method that is overloaded in this class is insert. |
|
|
| 168 |
| 00:12:40,000 --> 00:12:44,000 |
| It is used to insert the specified value at the specified position. |
|
|
| 169 |
| 00:12:44,000 --> 00:12:45,000 |
| It is overloaded. |
|
|
| 170 |
| 00:12:45,000 --> 00:12:53,000 |
| The Different Parameters Index of Masset returns the index within this string of the first occurrence |
|
|
| 171 |
| 00:12:53,000 --> 00:12:58,000 |
| of the specified substring last index of returns. |
|
|
| 172 |
| 00:12:58,000 --> 00:13:03,000 |
| The index within this string of the last occurrence of the specified substring. |
|
|
| 173 |
| 00:13:03,000 --> 00:13:10,000 |
| The last two methods also have overloaded version that additionally it takes one more parameter of time. |
|
|
| 174 |
| 00:13:11,000 --> 00:13:15,000 |
| This is the index from which to start the search reverse. |
|
|
| 175 |
| 00:13:15,000 --> 00:13:21,000 |
| Massata causes this character sequence to be replaced by the reverse of the sequence. |
|
|
| 176 |
| 00:13:21,000 --> 00:13:24,000 |
| That's all methods of string builder class. |
|
|
| 177 |
| 00:13:24,000 --> 00:13:30,000 |
| What I would recommend you open the source code of string builder string, buffer and abstract string |
|
|
| 178 |
| 00:13:30,000 --> 00:13:36,000 |
| to build the class leukocoria through the code and try to play with matches. |
|
|
| 179 |
| 00:13:36,000 --> 00:13:41,000 |
| We have discussed the most important ones and the masses that have chance to be used in production. |
|
|
| 180 |
| 00:13:42,000 --> 00:13:48,000 |
| But in case you would find any other method that you are interested in and you would like to talk more |
|
|
| 181 |
| 00:13:48,000 --> 00:13:51,000 |
| about it, do not hesitate to ask questions below this video. |
|
|
| 182 |
| 00:13:51,000 --> 00:13:57,000 |
| I will be happy to answer all of your questions, but I truly believe that we have learned just enough |
|
|
| 183 |
| 00:13:57,000 --> 00:14:02,000 |
| things in order to be able to start using string builder and string four classes. |
|
|
| 184 |
| 00:14:03,000 --> 00:14:06,000 |
| Now, let's recap what we have learned in this lesson. |
|
|
| 185 |
| 00:14:06,000 --> 00:14:10,000 |
| After this lesson, we know what string builder and string buffer classes are. |
|
|
| 186 |
| 00:14:11,000 --> 00:14:17,000 |
| I believe that you understood the purpose of these classes and use cases when to use them. |
|
|
| 187 |
| 00:14:17,000 --> 00:14:20,000 |
| Also review the char sequence interface today. |
|
|
| 188 |
| 00:14:20,000 --> 00:14:22,000 |
| That's it for this lesson. |
|
|
| 189 |
| 00:14:22,000 --> 00:14:24,000 |
| Thanks a lot for your attention. |
|
|
| 190 |
| 00:14:24,000 --> 00:14:27,000 |
| Have a great day and see you in the next lesson. |
|
|
|
|